@burdenoff/microfe-timecampus 2026.719.3 → 2026.719.4
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 +153 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -1
- package/dist/generated/wspace-operations.js +819 -738
- package/dist/generated/wspace-operations.js.map +1 -1
- package/dist/generated/wspace-types.d.ts +35 -0
- package/dist/generated/wspace-types.d.ts.map +1 -1
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/index.js +5 -5
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.d.ts.map +1 -1
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js +11 -9
- package/dist/timecampus/pages/expense-tracking/ExpenseTrackingPage.js.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.d.ts.map +1 -1
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js +2 -2
- package/dist/timecampus/pages/team/TeamAnalyticsPage.js.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.d.ts.map +1 -1
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js +48 -44
- package/dist/timecampus/pages/team-activity/TeamActivityPage.js.map +1 -1
- package/dist/timecampus/pages/timeline/TimelinePage.d.ts.map +1 -1
- package/dist/timecampus/pages/timeline/TimelinePage.js +224 -162
- package/dist/timecampus/pages/timeline/TimelinePage.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useTimeCampus as e, useTimeCampusNavigate as t } from "./timecampus/providers/TimeCampusProvider.js";
|
|
2
|
-
import { AcceptRecommendationDocument as n, ActivateResourcePlanDocument as r, AddParticipantDocument as i, ApplicationUsageFieldsFragmentDoc as a, ApprovalRequestFieldsFragmentDoc as o, ApproveExpenseDocument as s, ApproveRequestDocument as c, ArchiveProjectDocument as l, BalanceTargetFieldsFragmentDoc as u, BulkCreateAllocationsDocument as d, BulkCreateEmailTimeEntriesDocument as f, BulkDeleteTimeEntriesDocument as p, CalculateFocusScoreDocument as m, CaptureEventFieldsFragmentDoc as h, CategorizeApplicationDocument as g, ClientPortalFieldsFragmentDoc as _, CompleteActionItemDocument as v, CompletePomodoroSessionDocument as y, ContextSharingPolicyFieldsFragmentDoc as b, CreateActionItemDocument as x, CreateAllocationDocument as S, CreateClientPortalConfigDocument as C, CreateEmailTimeEntryDocument as w, CreateExpenseDocument as T, CreateGeofenceDocument as E, CreateLifeGoalDocument as D, CreateLocationEntryDocument as O, CreateMeetingDocument as k, CreatePomodoroGoalDocument as A, CreateProjectDocument as j, CreateResourcePlanDocument as M, CreateTaskDocument as N, CreateTimeEntryDocument as P, DeclareLifeValueDocument as F, DeleteActionItemDocument as I, DeleteAllocationDocument as L, DeleteApplicationUsageDocument as R, DeleteClientPortalConfigDocument as z, DeleteEmailTimeEntryDocument as B, DeleteExpenseDocument as V, DeleteFocusScoreDocument as H, DeleteGeofenceDocument as U, DeleteLifeGoalDocument as W, DeleteLifeValueDocument as G, DeleteLocationEntryDocument as K, DeleteMeetingDocument as q, DeletePomodoroGoalDocument as J, DeleteProjectDocument as Y, DeleteResourcePlanDocument as X, DeleteTaskDocument as Z, DeleteTimeCampusCaptureEventDocument as Q, DeleteTimeEntryDocument as $, DeleteWorkPatternDocument as ee, DismissRecommendationDocument as te, DuplicateTimeEntryDocument as ne, EmailTimeEntryFieldsFragmentDoc as re, ExpenseFieldsFragmentDoc as ie, FocusScoreFieldsFragmentDoc as ae, GenerateMyRecommendationsDocument as oe, GeofenceEventFieldsFragmentDoc as se, GeofenceFieldsFragmentDoc as ce, GetActiveLocationEntryDocument as le, GetActivePomodoroSessionDocument as ue, GetAppUsageSummaryDocument as de, GetApplicationUsageDocument as fe, GetApprovalRequestDocument as pe, GetApprovalStatsDocument as me, GetCapacityOverviewDocument as he, GetClientPortalConfigDocument as ge, GetClientPortalStatsDocument as _e, GetEmailTimeEntryDocument as ve, GetEmailTrackingStatsDocument as ye, GetExpenseDocument as be, GetExpenseStatsDocument as xe, GetFocusScoreDocument as Se, GetFocusScoreSummaryDocument as Ce, GetFocusScoreTrendDocument as we, GetGeofenceDocument as Te, GetLocationEntryDocument as Ee, GetLocationStatsDocument as De, GetMeetingDocument as Oe, GetMeetingStatsDocument as ke, GetPomodoroSessionDocument as Ae, GetPomodoroSettingsDocument as je, GetPomodoroStatsDocument as Me, GetProjectDocument as Ne, GetProjectStatsDocument as Pe, GetResourcePlanDocument as Fe, GetTaskDocument as Ie, GetTimeCampusTimelineDocument as Le, GetTimeEntryCountDocument as Re, GetTimeEntryDocument as ze, GetTimeEntryStatsDocument as Be, GetTodayFocusScoreDocument as Ve, GetTodayWorkPatternDocument as He, GetWorkPatternDocument as Ue, GetWorkPatternSummaryDocument as We, GrantSourceConsentDocument as Ge, IngestTimeCampusCaptureEventsDocument as Ke, InterruptPomodoroSessionDocument as qe, LifeGoalFieldsFragmentDoc as Je, LifeProfileFieldsFragmentDoc as Ye, LifeTimelineDocument as Xe, LifeValueFieldsFragmentDoc as Ze, ListApplicationUsagesDocument as Qe, ListApprovalRequestsDocument as $e, ListClientPortalConfigsDocument as et, ListEmailTimeEntriesDocument as tt, ListExpenseCategoriesDocument as nt, ListExpensesDocument as rt, ListFocusScoresDocument as it, ListGeofenceEventsDocument as at, ListGeofencesDocument as ot, ListLocationEntriesDocument as st, ListMeetingsDocument as ct, ListMyApprovalRequestsDocument as lt, ListPendingApprovalsDocument as ut, ListPomodoroGoalsDocument as dt, ListPomodoroSessionsDocument as ft, ListProjectsDocument as pt, ListResourceAllocationsDocument as mt, ListResourcePlansDocument as ht, ListRunningTimersDocument as gt, ListTasksDocument as _t, ListTimeCampusCaptureEventsDocument as vt, ListTimeEntriesByDateDocument as yt, ListTimeEntriesDocument as bt, ListTopApplicationsDocument as xt, ListUpcomingMeetingsDocument as St, ListUserAllocationsDocument as Ct, ListWorkPatternsDocument as wt, LocationEntryFieldsFragmentDoc as Tt, LogLifeTimeEntryDocument as Et, MeetingActionItemFieldsFragmentDoc as Dt, MeetingFieldsFragmentDoc as Ot, MeetingParticipantFieldsFragmentDoc as kt, MyBalanceTargetsDocument as At, MyContextSharingPolicyDocument as jt, MyDeadTimeRadarDocument as Mt, MyLifeBalanceDocument as Nt, MyLifeGoalsDocument as Pt, MyLifeInWeeksDocument as Ft, MyLifeProfileDocument as It, MyLifeValuesDocument as Lt, MyPersonalDataSummaryDocument as Rt, MyRecommendationPreferencesDocument as zt, MyRecommendationsDocument as Bt, MySourceConsentsDocument as Vt, MyTimeWellSpentDocument as Ht, PomodoroGoalFieldsFragmentDoc as Ut, PomodoroSessionFieldsFragmentDoc as Wt, PomodoroSettingsFieldsFragmentDoc as Gt, ProjectFieldsFragmentDoc as Kt, RateMeetingDocument as qt, RecategorizeTimeCampusCaptureEventDocument as Jt, RecommendationFieldsFragmentDoc as Yt, RecommendationPreferenceFieldsFragmentDoc as Xt, RecordApplicationUsageDocument as Zt, RecordFocusScoreDocument as Qt, RecordGeofenceEventDocument as $t, RecordWorkPatternDocument as en, RegenerateClientPortalShareTokenDocument as tn, RejectExpenseDocument as nn, RejectRequestDocument as rn, RemoveParticipantDocument as an, ReorderTasksDocument as on, RequestRevisionDocument as sn, ResourceAllocationFieldsFragmentDoc as cn, ResourcePlanFieldsFragmentDoc as ln, RevokeSourceConsentDocument as un, SetBalanceTargetDocument as dn, SnoozeRecommendationDocument as fn, SourceConsentFieldsFragmentDoc as pn, StartPomodoroSessionDocument as mn, StartTimerDocument as hn, StopTimerDocument as gn, SubmitApprovalRequestDocument as _n, SubmitExpenseForApprovalDocument as vn, TaskFieldsFragmentDoc as yn, TimeEntryFieldsFragmentDoc as bn, TimelineSegmentFieldsFragmentDoc as xn, TimelineSummaryFieldsFragmentDoc as Sn, ToggleClientPortalDocument as Cn, ToggleGeofenceDocument as wn, UpdateActionItemDocument as Tn, UpdateAllocationDocument as En, UpdateApplicationUsageDocument as Dn, UpdateClientPortalConfigDocument as On, UpdateContextSharingPolicyDocument as kn, UpdateEmailTimeEntryDocument as An, UpdateExpenseDocument as jn, UpdateFocusScoreDocument as Mn, UpdateGeofenceDocument as Nn, UpdateLifeGoalDocument as Pn, UpdateLifeValueDocument as Fn, UpdateLocationEntryDocument as In, UpdateMeetingDocument as Ln, UpdateMyLifeProfileDocument as Rn, UpdateMyRecommendationPreferencesDocument as zn, UpdateParticipantStatusDocument as Bn, UpdatePomodoroGoalDocument as Vn, UpdatePomodoroSettingsDocument as Hn, UpdateProjectDocument as Un, UpdateResourcePlanDocument as Wn, UpdateTaskDocument as Gn, UpdateTaskStatusDocument as Kn, UpdateTimeEntryDocument as qn, UpdateWorkPatternDocument as Jn, WithdrawRequestDocument as Yn, WorkPatternFieldsFragmentDoc as Xn, useAcceptRecommendationMutation as Zn, useActivateResourcePlanMutation as Qn, useAddParticipantMutation as $n, useApproveExpenseMutation as er, useApproveRequestMutation as tr, useArchiveProjectMutation as nr, useBulkCreateAllocationsMutation as rr, useBulkCreateEmailTimeEntriesMutation as ir, useBulkDeleteTimeEntriesMutation as ar, useCalculateFocusScoreMutation as or, useCategorizeApplicationMutation as sr, useCompleteActionItemMutation as cr, useCompletePomodoroSessionMutation as lr, useCreateActionItemMutation as ur, useCreateAllocationMutation as dr, useCreateClientPortalConfigMutation as fr, useCreateEmailTimeEntryMutation as pr, useCreateExpenseMutation as mr, useCreateGeofenceMutation as hr, useCreateLifeGoalMutation as gr, useCreateLocationEntryMutation as _r, useCreateMeetingMutation as vr, useCreatePomodoroGoalMutation as yr, useCreateProjectMutation as br, useCreateResourcePlanMutation as xr, useCreateTaskMutation as Sr, useCreateTimeEntryMutation as Cr, useDeclareLifeValueMutation as wr, useDeleteActionItemMutation as Tr, useDeleteAllocationMutation as Er, useDeleteApplicationUsageMutation as Dr, useDeleteClientPortalConfigMutation as Or, useDeleteEmailTimeEntryMutation as kr, useDeleteExpenseMutation as Ar, useDeleteFocusScoreMutation as jr, useDeleteGeofenceMutation as Mr, useDeleteLifeGoalMutation as Nr, useDeleteLifeValueMutation as Pr, useDeleteLocationEntryMutation as Fr, useDeleteMeetingMutation as Ir, useDeletePomodoroGoalMutation as Lr, useDeleteProjectMutation as Rr, useDeleteResourcePlanMutation as zr, useDeleteTaskMutation as Br, useDeleteTimeCampusCaptureEventMutation as Vr, useDeleteTimeEntryMutation as Hr, useDeleteWorkPatternMutation as Ur, useDismissRecommendationMutation as Wr, useDuplicateTimeEntryMutation as Gr, useGenerateMyRecommendationsMutation as Kr, useGetActiveLocationEntryLazyQuery as qr, useGetActiveLocationEntryQuery as Jr, useGetActiveLocationEntrySuspenseQuery as Yr, useGetActivePomodoroSessionLazyQuery as Xr, useGetActivePomodoroSessionQuery as Zr, useGetActivePomodoroSessionSuspenseQuery as Qr, useGetAppUsageSummaryLazyQuery as $r, useGetAppUsageSummaryQuery as ei, useGetAppUsageSummarySuspenseQuery as ti, useGetApplicationUsageLazyQuery as ni, useGetApplicationUsageQuery as ri, useGetApplicationUsageSuspenseQuery as ii, useGetApprovalRequestLazyQuery as ai, useGetApprovalRequestQuery as oi, useGetApprovalRequestSuspenseQuery as si, useGetApprovalStatsLazyQuery as ci, useGetApprovalStatsQuery as li, useGetApprovalStatsSuspenseQuery as ui, useGetCapacityOverviewLazyQuery as di, useGetCapacityOverviewQuery as fi, useGetCapacityOverviewSuspenseQuery as pi, useGetClientPortalConfigLazyQuery as mi, useGetClientPortalConfigQuery as hi, useGetClientPortalConfigSuspenseQuery as gi, useGetClientPortalStatsLazyQuery as _i, useGetClientPortalStatsQuery as vi, useGetClientPortalStatsSuspenseQuery as yi, useGetEmailTimeEntryLazyQuery as bi, useGetEmailTimeEntryQuery as xi, useGetEmailTimeEntrySuspenseQuery as Si, useGetEmailTrackingStatsLazyQuery as Ci, useGetEmailTrackingStatsQuery as wi, useGetEmailTrackingStatsSuspenseQuery as Ti, useGetExpenseLazyQuery as Ei, useGetExpenseQuery as Di, useGetExpenseStatsLazyQuery as Oi, useGetExpenseStatsQuery as ki, useGetExpenseStatsSuspenseQuery as Ai, useGetExpenseSuspenseQuery as ji, useGetFocusScoreLazyQuery as Mi, useGetFocusScoreQuery as Ni, useGetFocusScoreSummaryLazyQuery as Pi, useGetFocusScoreSummaryQuery as Fi, useGetFocusScoreSummarySuspenseQuery as Ii, useGetFocusScoreSuspenseQuery as Li, useGetFocusScoreTrendLazyQuery as Ri, useGetFocusScoreTrendQuery as zi, useGetFocusScoreTrendSuspenseQuery as Bi, useGetGeofenceLazyQuery as Vi, useGetGeofenceQuery as Hi, useGetGeofenceSuspenseQuery as Ui, useGetLocationEntryLazyQuery as Wi, useGetLocationEntryQuery as Gi, useGetLocationEntrySuspenseQuery as Ki, useGetLocationStatsLazyQuery as qi, useGetLocationStatsQuery as Ji, useGetLocationStatsSuspenseQuery as Yi, useGetMeetingLazyQuery as Xi, useGetMeetingQuery as Zi, useGetMeetingStatsLazyQuery as Qi, useGetMeetingStatsQuery as $i, useGetMeetingStatsSuspenseQuery as ea, useGetMeetingSuspenseQuery as ta, useGetPomodoroSessionLazyQuery as na, useGetPomodoroSessionQuery as ra, useGetPomodoroSessionSuspenseQuery as ia, useGetPomodoroSettingsLazyQuery as aa, useGetPomodoroSettingsQuery as oa, useGetPomodoroSettingsSuspenseQuery as sa, useGetPomodoroStatsLazyQuery as ca, useGetPomodoroStatsQuery as la, useGetPomodoroStatsSuspenseQuery as ua, useGetProjectLazyQuery as da, useGetProjectQuery as fa, useGetProjectStatsLazyQuery as pa, useGetProjectStatsQuery as ma, useGetProjectStatsSuspenseQuery as ha, useGetProjectSuspenseQuery as ga, useGetResourcePlanLazyQuery as _a, useGetResourcePlanQuery as va, useGetResourcePlanSuspenseQuery as ya, useGetTaskLazyQuery as ba, useGetTaskQuery as xa, useGetTaskSuspenseQuery as Sa, useGetTimeCampusTimelineLazyQuery as Ca, useGetTimeCampusTimelineQuery as wa, useGetTimeCampusTimelineSuspenseQuery as Ta, useGetTimeEntryCountLazyQuery as Ea, useGetTimeEntryCountQuery as Da, useGetTimeEntryCountSuspenseQuery as Oa, useGetTimeEntryLazyQuery as ka, useGetTimeEntryQuery as Aa, useGetTimeEntryStatsLazyQuery as ja, useGetTimeEntryStatsQuery as Ma, useGetTimeEntryStatsSuspenseQuery as Na, useGetTimeEntrySuspenseQuery as Pa, useGetTodayFocusScoreLazyQuery as Fa, useGetTodayFocusScoreQuery as Ia, useGetTodayFocusScoreSuspenseQuery as La, useGetTodayWorkPatternLazyQuery as Ra, useGetTodayWorkPatternQuery as za, useGetTodayWorkPatternSuspenseQuery as Ba, useGetWorkPatternLazyQuery as Va, useGetWorkPatternQuery as Ha, useGetWorkPatternSummaryLazyQuery as Ua, useGetWorkPatternSummaryQuery as Wa, useGetWorkPatternSummarySuspenseQuery as Ga, useGetWorkPatternSuspenseQuery as Ka, useGrantSourceConsentMutation as qa, useIngestTimeCampusCaptureEventsMutation as Ja, useInterruptPomodoroSessionMutation as Ya, useLifeTimelineLazyQuery as Xa, useLifeTimelineQuery as Za, useLifeTimelineSuspenseQuery as Qa, useListApplicationUsagesLazyQuery as $a, useListApplicationUsagesQuery as eo, useListApplicationUsagesSuspenseQuery as to, useListApprovalRequestsLazyQuery as no, useListApprovalRequestsQuery as ro, useListApprovalRequestsSuspenseQuery as io, useListClientPortalConfigsLazyQuery as ao, useListClientPortalConfigsQuery as oo, useListClientPortalConfigsSuspenseQuery as so, useListEmailTimeEntriesLazyQuery as co, useListEmailTimeEntriesQuery as lo, useListEmailTimeEntriesSuspenseQuery as uo, useListExpenseCategoriesLazyQuery as fo, useListExpenseCategoriesQuery as po, useListExpenseCategoriesSuspenseQuery as mo, useListExpensesLazyQuery as ho, useListExpensesQuery as go, useListExpensesSuspenseQuery as _o, useListFocusScoresLazyQuery as vo, useListFocusScoresQuery as yo, useListFocusScoresSuspenseQuery as bo, useListGeofenceEventsLazyQuery as xo, useListGeofenceEventsQuery as So, useListGeofenceEventsSuspenseQuery as Co, useListGeofencesLazyQuery as wo, useListGeofencesQuery as To, useListGeofencesSuspenseQuery as Eo, useListLocationEntriesLazyQuery as Do, useListLocationEntriesQuery as Oo, useListLocationEntriesSuspenseQuery as ko, useListMeetingsLazyQuery as Ao, useListMeetingsQuery as jo, useListMeetingsSuspenseQuery as Mo, useListMyApprovalRequestsLazyQuery as No, useListMyApprovalRequestsQuery as Po, useListMyApprovalRequestsSuspenseQuery as Fo, useListPendingApprovalsLazyQuery as Io, useListPendingApprovalsQuery as Lo, useListPendingApprovalsSuspenseQuery as Ro, useListPomodoroGoalsLazyQuery as zo, useListPomodoroGoalsQuery as Bo, useListPomodoroGoalsSuspenseQuery as Vo, useListPomodoroSessionsLazyQuery as Ho, useListPomodoroSessionsQuery as Uo, useListPomodoroSessionsSuspenseQuery as Wo, useListProjectsLazyQuery as Go, useListProjectsQuery as Ko, useListProjectsSuspenseQuery as qo, useListResourceAllocationsLazyQuery as Jo, useListResourceAllocationsQuery as Yo, useListResourceAllocationsSuspenseQuery as Xo, useListResourcePlansLazyQuery as Zo, useListResourcePlansQuery as Qo, useListResourcePlansSuspenseQuery as $o, useListRunningTimersLazyQuery as es, useListRunningTimersQuery as ts, useListRunningTimersSuspenseQuery as ns, useListTasksLazyQuery as rs, useListTasksQuery as is, useListTasksSuspenseQuery as as, useListTimeCampusCaptureEventsLazyQuery as os, useListTimeCampusCaptureEventsQuery as ss, useListTimeCampusCaptureEventsSuspenseQuery as cs, useListTimeEntriesByDateLazyQuery as ls, useListTimeEntriesByDateQuery as us, useListTimeEntriesByDateSuspenseQuery as ds, useListTimeEntriesLazyQuery as fs, useListTimeEntriesQuery as ps, useListTimeEntriesSuspenseQuery as ms, useListTopApplicationsLazyQuery as hs, useListTopApplicationsQuery as gs, useListTopApplicationsSuspenseQuery as _s, useListUpcomingMeetingsLazyQuery as vs, useListUpcomingMeetingsQuery as ys, useListUpcomingMeetingsSuspenseQuery as bs, useListUserAllocationsLazyQuery as xs, useListUserAllocationsQuery as Ss, useListUserAllocationsSuspenseQuery as Cs, useListWorkPatternsLazyQuery as ws, useListWorkPatternsQuery as Ts, useListWorkPatternsSuspenseQuery as Es, useLogLifeTimeEntryMutation as Ds, useMyBalanceTargetsLazyQuery as Os, useMyBalanceTargetsQuery as ks, useMyBalanceTargetsSuspenseQuery as As, useMyContextSharingPolicyLazyQuery as js, useMyContextSharingPolicyQuery as Ms, useMyContextSharingPolicySuspenseQuery as Ns, useMyDeadTimeRadarLazyQuery as Ps, useMyDeadTimeRadarQuery as Fs, useMyDeadTimeRadarSuspenseQuery as Is, useMyLifeBalanceLazyQuery as Ls, useMyLifeBalanceQuery as Rs, useMyLifeBalanceSuspenseQuery as zs, useMyLifeGoalsLazyQuery as Bs, useMyLifeGoalsQuery as Vs, useMyLifeGoalsSuspenseQuery as Hs, useMyLifeInWeeksLazyQuery as Us, useMyLifeInWeeksQuery as Ws, useMyLifeInWeeksSuspenseQuery as Gs, useMyLifeProfileLazyQuery as Ks, useMyLifeProfileQuery as qs, useMyLifeProfileSuspenseQuery as Js, useMyLifeValuesLazyQuery as Ys, useMyLifeValuesQuery as Xs, useMyLifeValuesSuspenseQuery as Zs, useMyPersonalDataSummaryLazyQuery as Qs, useMyPersonalDataSummaryQuery as $s, useMyPersonalDataSummarySuspenseQuery as ec, useMyRecommendationPreferencesLazyQuery as tc, useMyRecommendationPreferencesQuery as nc, useMyRecommendationPreferencesSuspenseQuery as rc, useMyRecommendationsLazyQuery as ic, useMyRecommendationsQuery as ac, useMyRecommendationsSuspenseQuery as oc, useMySourceConsentsLazyQuery as sc, useMySourceConsentsQuery as cc, useMySourceConsentsSuspenseQuery as lc, useMyTimeWellSpentLazyQuery as uc, useMyTimeWellSpentQuery as dc, useMyTimeWellSpentSuspenseQuery as fc, useRateMeetingMutation as pc, useRecategorizeTimeCampusCaptureEventMutation as mc, useRecordApplicationUsageMutation as hc, useRecordFocusScoreMutation as gc, useRecordGeofenceEventMutation as _c, useRecordWorkPatternMutation as vc, useRegenerateClientPortalShareTokenMutation as yc, useRejectExpenseMutation as bc, useRejectRequestMutation as xc, useRemoveParticipantMutation as Sc, useReorderTasksMutation as Cc, useRequestRevisionMutation as wc, useRevokeSourceConsentMutation as Tc, useSetBalanceTargetMutation as Ec, useSnoozeRecommendationMutation as Dc, useStartPomodoroSessionMutation as Oc, useStartTimerMutation as kc, useStopTimerMutation as Ac, useSubmitApprovalRequestMutation as jc, useSubmitExpenseForApprovalMutation as Mc, useToggleClientPortalMutation as Nc, useToggleGeofenceMutation as Pc, useUpdateActionItemMutation as Fc, useUpdateAllocationMutation as Ic, useUpdateApplicationUsageMutation as Lc, useUpdateClientPortalConfigMutation as Rc, useUpdateContextSharingPolicyMutation as zc, useUpdateEmailTimeEntryMutation as Bc, useUpdateExpenseMutation as Vc, useUpdateFocusScoreMutation as Hc, useUpdateGeofenceMutation as Uc, useUpdateLifeGoalMutation as Wc, useUpdateLifeValueMutation as Gc, useUpdateLocationEntryMutation as Kc, useUpdateMeetingMutation as qc, useUpdateMyLifeProfileMutation as Jc, useUpdateMyRecommendationPreferencesMutation as Yc, useUpdateParticipantStatusMutation as Xc, useUpdatePomodoroGoalMutation as Zc, useUpdatePomodoroSettingsMutation as Qc, useUpdateProjectMutation as $c, useUpdateResourcePlanMutation as el, useUpdateTaskMutation as tl, useUpdateTaskStatusMutation as nl, useUpdateTimeEntryMutation as rl, useUpdateWorkPatternMutation as il, useWithdrawRequestMutation as al } from "./generated/wspace-operations.js";
|
|
3
|
-
import { TimeCampusRoot as
|
|
4
|
-
import { useTimeCampusStore as
|
|
5
|
-
import { useSandboxAssistantTransport as
|
|
2
|
+
import { AcceptRecommendationDocument as n, ActivateResourcePlanDocument as r, AddParticipantDocument as i, ApplicationUsageFieldsFragmentDoc as a, ApprovalRequestFieldsFragmentDoc as o, ApproveExpenseDocument as s, ApproveRequestDocument as c, ArchiveProjectDocument as l, BalanceTargetFieldsFragmentDoc as u, BulkCreateAllocationsDocument as d, BulkCreateEmailTimeEntriesDocument as f, BulkDeleteTimeEntriesDocument as p, CalculateFocusScoreDocument as m, CaptureEventFieldsFragmentDoc as h, CategorizeApplicationDocument as g, ClientPortalFieldsFragmentDoc as _, CompleteActionItemDocument as v, CompletePomodoroSessionDocument as y, ContextSharingPolicyFieldsFragmentDoc as b, CreateActionItemDocument as x, CreateAllocationDocument as S, CreateClientPortalConfigDocument as C, CreateEmailTimeEntryDocument as w, CreateExpenseDocument as T, CreateGeofenceDocument as E, CreateLifeGoalDocument as D, CreateLocationEntryDocument as O, CreateMeetingDocument as k, CreatePomodoroGoalDocument as A, CreateProjectDocument as j, CreateResourcePlanDocument as M, CreateTaskDocument as N, CreateTimeEntryDocument as P, DeclareLifeValueDocument as F, DeleteActionItemDocument as I, DeleteAllocationDocument as L, DeleteApplicationUsageDocument as R, DeleteClientPortalConfigDocument as z, DeleteEmailTimeEntryDocument as B, DeleteExpenseDocument as V, DeleteFocusScoreDocument as H, DeleteGeofenceDocument as U, DeleteLifeGoalDocument as W, DeleteLifeValueDocument as G, DeleteLocationEntryDocument as K, DeleteMeetingDocument as q, DeletePomodoroGoalDocument as J, DeleteProjectDocument as Y, DeleteResourcePlanDocument as X, DeleteTaskDocument as Z, DeleteTimeCampusCaptureEventDocument as Q, DeleteTimeEntryDocument as $, DeleteWorkPatternDocument as ee, DismissRecommendationDocument as te, DuplicateTimeEntryDocument as ne, EmailTimeEntryFieldsFragmentDoc as re, ExpenseFieldsFragmentDoc as ie, FocusScoreFieldsFragmentDoc as ae, GenerateMyRecommendationsDocument as oe, GeofenceEventFieldsFragmentDoc as se, GeofenceFieldsFragmentDoc as ce, GetActiveLocationEntryDocument as le, GetActivePomodoroSessionDocument as ue, GetAppUsageSummaryDocument as de, GetApplicationUsageDocument as fe, GetApprovalRequestDocument as pe, GetApprovalStatsDocument as me, GetCapacityOverviewDocument as he, GetClientPortalConfigDocument as ge, GetClientPortalStatsDocument as _e, GetEmailTimeEntryDocument as ve, GetEmailTrackingStatsDocument as ye, GetExpenseDocument as be, GetExpenseStatsDocument as xe, GetFocusScoreDocument as Se, GetFocusScoreSummaryDocument as Ce, GetFocusScoreTrendDocument as we, GetGeofenceDocument as Te, GetLocationEntryDocument as Ee, GetLocationStatsDocument as De, GetMeetingDocument as Oe, GetMeetingStatsDocument as ke, GetPomodoroSessionDocument as Ae, GetPomodoroSettingsDocument as je, GetPomodoroStatsDocument as Me, GetProjectDocument as Ne, GetProjectStatsDocument as Pe, GetResourcePlanDocument as Fe, GetTaskDocument as Ie, GetTeamWorkPatternSummaryDocument as Le, GetTimeCampusTimelineDocument as Re, GetTimeEntryCountDocument as ze, GetTimeEntryDocument as Be, GetTimeEntryStatsDocument as Ve, GetTodayFocusScoreDocument as He, GetTodayWorkPatternDocument as Ue, GetWorkPatternDocument as We, GetWorkPatternSummaryDocument as Ge, GrantSourceConsentDocument as Ke, IngestTimeCampusCaptureEventsDocument as qe, InterruptPomodoroSessionDocument as Je, LifeGoalFieldsFragmentDoc as Ye, LifeProfileFieldsFragmentDoc as Xe, LifeTimelineDocument as Ze, LifeValueFieldsFragmentDoc as Qe, ListApplicationUsagesDocument as $e, ListApprovalRequestsDocument as et, ListClientPortalConfigsDocument as tt, ListEmailTimeEntriesDocument as nt, ListExpenseCategoriesDocument as rt, ListExpensesDocument as it, ListFocusScoresDocument as at, ListGeofenceEventsDocument as ot, ListGeofencesDocument as st, ListLocationEntriesDocument as ct, ListMeetingsDocument as lt, ListMyApprovalRequestsDocument as ut, ListPendingApprovalsDocument as dt, ListPomodoroGoalsDocument as ft, ListPomodoroSessionsDocument as pt, ListProjectsDocument as mt, ListResourceAllocationsDocument as ht, ListResourcePlansDocument as gt, ListRunningTimersDocument as _t, ListTasksDocument as vt, ListTeamWorkPatternsDocument as yt, ListTimeCampusCaptureEventsDocument as bt, ListTimeEntriesByDateDocument as xt, ListTimeEntriesDocument as St, ListTopApplicationsDocument as Ct, ListUpcomingMeetingsDocument as wt, ListUserAllocationsDocument as Tt, ListWorkPatternsDocument as Et, LocationEntryFieldsFragmentDoc as Dt, LogLifeTimeEntryDocument as Ot, MeetingActionItemFieldsFragmentDoc as kt, MeetingFieldsFragmentDoc as At, MeetingParticipantFieldsFragmentDoc as jt, MyBalanceTargetsDocument as Mt, MyContextSharingPolicyDocument as Nt, MyDeadTimeRadarDocument as Pt, MyLifeBalanceDocument as Ft, MyLifeGoalsDocument as It, MyLifeInWeeksDocument as Lt, MyLifeProfileDocument as Rt, MyLifeValuesDocument as zt, MyPersonalDataSummaryDocument as Bt, MyRecommendationPreferencesDocument as Vt, MyRecommendationsDocument as Ht, MySourceConsentsDocument as Ut, MyTimeWellSpentDocument as Wt, PomodoroGoalFieldsFragmentDoc as Gt, PomodoroSessionFieldsFragmentDoc as Kt, PomodoroSettingsFieldsFragmentDoc as qt, ProjectFieldsFragmentDoc as Jt, RateMeetingDocument as Yt, RecategorizeTimeCampusCaptureEventDocument as Xt, RecommendationFieldsFragmentDoc as Zt, RecommendationPreferenceFieldsFragmentDoc as Qt, RecordApplicationUsageDocument as $t, RecordFocusScoreDocument as en, RecordGeofenceEventDocument as tn, RecordWorkPatternDocument as nn, RegenerateClientPortalShareTokenDocument as rn, RejectExpenseDocument as an, RejectRequestDocument as on, RemoveParticipantDocument as sn, ReorderTasksDocument as cn, RequestRevisionDocument as ln, ResourceAllocationFieldsFragmentDoc as un, ResourcePlanFieldsFragmentDoc as dn, RevokeSourceConsentDocument as fn, SetBalanceTargetDocument as pn, SnoozeRecommendationDocument as mn, SourceConsentFieldsFragmentDoc as hn, StartPomodoroSessionDocument as gn, StartTimerDocument as _n, StopTimerDocument as vn, SubmitApprovalRequestDocument as yn, SubmitExpenseForApprovalDocument as bn, TaskFieldsFragmentDoc as xn, TeamWorkPatternEntryFieldsFragmentDoc as Sn, TimeEntryFieldsFragmentDoc as Cn, TimelineSegmentFieldsFragmentDoc as wn, TimelineSummaryFieldsFragmentDoc as Tn, ToggleClientPortalDocument as En, ToggleGeofenceDocument as Dn, UpdateActionItemDocument as On, UpdateAllocationDocument as kn, UpdateApplicationUsageDocument as An, UpdateClientPortalConfigDocument as jn, UpdateContextSharingPolicyDocument as Mn, UpdateEmailTimeEntryDocument as Nn, UpdateExpenseDocument as Pn, UpdateFocusScoreDocument as Fn, UpdateGeofenceDocument as In, UpdateLifeGoalDocument as Ln, UpdateLifeValueDocument as Rn, UpdateLocationEntryDocument as zn, UpdateMeetingDocument as Bn, UpdateMyLifeProfileDocument as Vn, UpdateMyRecommendationPreferencesDocument as Hn, UpdateParticipantStatusDocument as Un, UpdatePomodoroGoalDocument as Wn, UpdatePomodoroSettingsDocument as Gn, UpdateProjectDocument as Kn, UpdateResourcePlanDocument as qn, UpdateTaskDocument as Jn, UpdateTaskStatusDocument as Yn, UpdateTimeEntryDocument as Xn, UpdateWorkPatternDocument as Zn, WithdrawRequestDocument as Qn, WorkPatternFieldsFragmentDoc as $n, useAcceptRecommendationMutation as er, useActivateResourcePlanMutation as tr, useAddParticipantMutation as nr, useApproveExpenseMutation as rr, useApproveRequestMutation as ir, useArchiveProjectMutation as ar, useBulkCreateAllocationsMutation as or, useBulkCreateEmailTimeEntriesMutation as sr, useBulkDeleteTimeEntriesMutation as cr, useCalculateFocusScoreMutation as lr, useCategorizeApplicationMutation as ur, useCompleteActionItemMutation as dr, useCompletePomodoroSessionMutation as fr, useCreateActionItemMutation as pr, useCreateAllocationMutation as mr, useCreateClientPortalConfigMutation as hr, useCreateEmailTimeEntryMutation as gr, useCreateExpenseMutation as _r, useCreateGeofenceMutation as vr, useCreateLifeGoalMutation as yr, useCreateLocationEntryMutation as br, useCreateMeetingMutation as xr, useCreatePomodoroGoalMutation as Sr, useCreateProjectMutation as Cr, useCreateResourcePlanMutation as wr, useCreateTaskMutation as Tr, useCreateTimeEntryMutation as Er, useDeclareLifeValueMutation as Dr, useDeleteActionItemMutation as Or, useDeleteAllocationMutation as kr, useDeleteApplicationUsageMutation as Ar, useDeleteClientPortalConfigMutation as jr, useDeleteEmailTimeEntryMutation as Mr, useDeleteExpenseMutation as Nr, useDeleteFocusScoreMutation as Pr, useDeleteGeofenceMutation as Fr, useDeleteLifeGoalMutation as Ir, useDeleteLifeValueMutation as Lr, useDeleteLocationEntryMutation as Rr, useDeleteMeetingMutation as zr, useDeletePomodoroGoalMutation as Br, useDeleteProjectMutation as Vr, useDeleteResourcePlanMutation as Hr, useDeleteTaskMutation as Ur, useDeleteTimeCampusCaptureEventMutation as Wr, useDeleteTimeEntryMutation as Gr, useDeleteWorkPatternMutation as Kr, useDismissRecommendationMutation as qr, useDuplicateTimeEntryMutation as Jr, useGenerateMyRecommendationsMutation as Yr, useGetActiveLocationEntryLazyQuery as Xr, useGetActiveLocationEntryQuery as Zr, useGetActiveLocationEntrySuspenseQuery as Qr, useGetActivePomodoroSessionLazyQuery as $r, useGetActivePomodoroSessionQuery as ei, useGetActivePomodoroSessionSuspenseQuery as ti, useGetAppUsageSummaryLazyQuery as ni, useGetAppUsageSummaryQuery as ri, useGetAppUsageSummarySuspenseQuery as ii, useGetApplicationUsageLazyQuery as ai, useGetApplicationUsageQuery as oi, useGetApplicationUsageSuspenseQuery as si, useGetApprovalRequestLazyQuery as ci, useGetApprovalRequestQuery as li, useGetApprovalRequestSuspenseQuery as ui, useGetApprovalStatsLazyQuery as di, useGetApprovalStatsQuery as fi, useGetApprovalStatsSuspenseQuery as pi, useGetCapacityOverviewLazyQuery as mi, useGetCapacityOverviewQuery as hi, useGetCapacityOverviewSuspenseQuery as gi, useGetClientPortalConfigLazyQuery as _i, useGetClientPortalConfigQuery as vi, useGetClientPortalConfigSuspenseQuery as yi, useGetClientPortalStatsLazyQuery as bi, useGetClientPortalStatsQuery as xi, useGetClientPortalStatsSuspenseQuery as Si, useGetEmailTimeEntryLazyQuery as Ci, useGetEmailTimeEntryQuery as wi, useGetEmailTimeEntrySuspenseQuery as Ti, useGetEmailTrackingStatsLazyQuery as Ei, useGetEmailTrackingStatsQuery as Di, useGetEmailTrackingStatsSuspenseQuery as Oi, useGetExpenseLazyQuery as ki, useGetExpenseQuery as Ai, useGetExpenseStatsLazyQuery as ji, useGetExpenseStatsQuery as Mi, useGetExpenseStatsSuspenseQuery as Ni, useGetExpenseSuspenseQuery as Pi, useGetFocusScoreLazyQuery as Fi, useGetFocusScoreQuery as Ii, useGetFocusScoreSummaryLazyQuery as Li, useGetFocusScoreSummaryQuery as Ri, useGetFocusScoreSummarySuspenseQuery as zi, useGetFocusScoreSuspenseQuery as Bi, useGetFocusScoreTrendLazyQuery as Vi, useGetFocusScoreTrendQuery as Hi, useGetFocusScoreTrendSuspenseQuery as Ui, useGetGeofenceLazyQuery as Wi, useGetGeofenceQuery as Gi, useGetGeofenceSuspenseQuery as Ki, useGetLocationEntryLazyQuery as qi, useGetLocationEntryQuery as Ji, useGetLocationEntrySuspenseQuery as Yi, useGetLocationStatsLazyQuery as Xi, useGetLocationStatsQuery as Zi, useGetLocationStatsSuspenseQuery as Qi, useGetMeetingLazyQuery as $i, useGetMeetingQuery as ea, useGetMeetingStatsLazyQuery as ta, useGetMeetingStatsQuery as na, useGetMeetingStatsSuspenseQuery as ra, useGetMeetingSuspenseQuery as ia, useGetPomodoroSessionLazyQuery as aa, useGetPomodoroSessionQuery as oa, useGetPomodoroSessionSuspenseQuery as sa, useGetPomodoroSettingsLazyQuery as ca, useGetPomodoroSettingsQuery as la, useGetPomodoroSettingsSuspenseQuery as ua, useGetPomodoroStatsLazyQuery as da, useGetPomodoroStatsQuery as fa, useGetPomodoroStatsSuspenseQuery as pa, useGetProjectLazyQuery as ma, useGetProjectQuery as ha, useGetProjectStatsLazyQuery as ga, useGetProjectStatsQuery as _a, useGetProjectStatsSuspenseQuery as va, useGetProjectSuspenseQuery as ya, useGetResourcePlanLazyQuery as ba, useGetResourcePlanQuery as xa, useGetResourcePlanSuspenseQuery as Sa, useGetTaskLazyQuery as Ca, useGetTaskQuery as wa, useGetTaskSuspenseQuery as Ta, useGetTeamWorkPatternSummaryLazyQuery as Ea, useGetTeamWorkPatternSummaryQuery as Da, useGetTeamWorkPatternSummarySuspenseQuery as Oa, useGetTimeCampusTimelineLazyQuery as ka, useGetTimeCampusTimelineQuery as Aa, useGetTimeCampusTimelineSuspenseQuery as ja, useGetTimeEntryCountLazyQuery as Ma, useGetTimeEntryCountQuery as Na, useGetTimeEntryCountSuspenseQuery as Pa, useGetTimeEntryLazyQuery as Fa, useGetTimeEntryQuery as Ia, useGetTimeEntryStatsLazyQuery as La, useGetTimeEntryStatsQuery as Ra, useGetTimeEntryStatsSuspenseQuery as za, useGetTimeEntrySuspenseQuery as Ba, useGetTodayFocusScoreLazyQuery as Va, useGetTodayFocusScoreQuery as Ha, useGetTodayFocusScoreSuspenseQuery as Ua, useGetTodayWorkPatternLazyQuery as Wa, useGetTodayWorkPatternQuery as Ga, useGetTodayWorkPatternSuspenseQuery as Ka, useGetWorkPatternLazyQuery as qa, useGetWorkPatternQuery as Ja, useGetWorkPatternSummaryLazyQuery as Ya, useGetWorkPatternSummaryQuery as Xa, useGetWorkPatternSummarySuspenseQuery as Za, useGetWorkPatternSuspenseQuery as Qa, useGrantSourceConsentMutation as $a, useIngestTimeCampusCaptureEventsMutation as eo, useInterruptPomodoroSessionMutation as to, useLifeTimelineLazyQuery as no, useLifeTimelineQuery as ro, useLifeTimelineSuspenseQuery as io, useListApplicationUsagesLazyQuery as ao, useListApplicationUsagesQuery as oo, useListApplicationUsagesSuspenseQuery as so, useListApprovalRequestsLazyQuery as co, useListApprovalRequestsQuery as lo, useListApprovalRequestsSuspenseQuery as uo, useListClientPortalConfigsLazyQuery as fo, useListClientPortalConfigsQuery as po, useListClientPortalConfigsSuspenseQuery as mo, useListEmailTimeEntriesLazyQuery as ho, useListEmailTimeEntriesQuery as go, useListEmailTimeEntriesSuspenseQuery as _o, useListExpenseCategoriesLazyQuery as vo, useListExpenseCategoriesQuery as yo, useListExpenseCategoriesSuspenseQuery as bo, useListExpensesLazyQuery as xo, useListExpensesQuery as So, useListExpensesSuspenseQuery as Co, useListFocusScoresLazyQuery as wo, useListFocusScoresQuery as To, useListFocusScoresSuspenseQuery as Eo, useListGeofenceEventsLazyQuery as Do, useListGeofenceEventsQuery as Oo, useListGeofenceEventsSuspenseQuery as ko, useListGeofencesLazyQuery as Ao, useListGeofencesQuery as jo, useListGeofencesSuspenseQuery as Mo, useListLocationEntriesLazyQuery as No, useListLocationEntriesQuery as Po, useListLocationEntriesSuspenseQuery as Fo, useListMeetingsLazyQuery as Io, useListMeetingsQuery as Lo, useListMeetingsSuspenseQuery as Ro, useListMyApprovalRequestsLazyQuery as zo, useListMyApprovalRequestsQuery as Bo, useListMyApprovalRequestsSuspenseQuery as Vo, useListPendingApprovalsLazyQuery as Ho, useListPendingApprovalsQuery as Uo, useListPendingApprovalsSuspenseQuery as Wo, useListPomodoroGoalsLazyQuery as Go, useListPomodoroGoalsQuery as Ko, useListPomodoroGoalsSuspenseQuery as qo, useListPomodoroSessionsLazyQuery as Jo, useListPomodoroSessionsQuery as Yo, useListPomodoroSessionsSuspenseQuery as Xo, useListProjectsLazyQuery as Zo, useListProjectsQuery as Qo, useListProjectsSuspenseQuery as $o, useListResourceAllocationsLazyQuery as es, useListResourceAllocationsQuery as ts, useListResourceAllocationsSuspenseQuery as ns, useListResourcePlansLazyQuery as rs, useListResourcePlansQuery as is, useListResourcePlansSuspenseQuery as as, useListRunningTimersLazyQuery as os, useListRunningTimersQuery as ss, useListRunningTimersSuspenseQuery as cs, useListTasksLazyQuery as ls, useListTasksQuery as us, useListTasksSuspenseQuery as ds, useListTeamWorkPatternsLazyQuery as fs, useListTeamWorkPatternsQuery as ps, useListTeamWorkPatternsSuspenseQuery as ms, useListTimeCampusCaptureEventsLazyQuery as hs, useListTimeCampusCaptureEventsQuery as gs, useListTimeCampusCaptureEventsSuspenseQuery as _s, useListTimeEntriesByDateLazyQuery as vs, useListTimeEntriesByDateQuery as ys, useListTimeEntriesByDateSuspenseQuery as bs, useListTimeEntriesLazyQuery as xs, useListTimeEntriesQuery as Ss, useListTimeEntriesSuspenseQuery as Cs, useListTopApplicationsLazyQuery as ws, useListTopApplicationsQuery as Ts, useListTopApplicationsSuspenseQuery as Es, useListUpcomingMeetingsLazyQuery as Ds, useListUpcomingMeetingsQuery as Os, useListUpcomingMeetingsSuspenseQuery as ks, useListUserAllocationsLazyQuery as As, useListUserAllocationsQuery as js, useListUserAllocationsSuspenseQuery as Ms, useListWorkPatternsLazyQuery as Ns, useListWorkPatternsQuery as Ps, useListWorkPatternsSuspenseQuery as Fs, useLogLifeTimeEntryMutation as Is, useMyBalanceTargetsLazyQuery as Ls, useMyBalanceTargetsQuery as Rs, useMyBalanceTargetsSuspenseQuery as zs, useMyContextSharingPolicyLazyQuery as Bs, useMyContextSharingPolicyQuery as Vs, useMyContextSharingPolicySuspenseQuery as Hs, useMyDeadTimeRadarLazyQuery as Us, useMyDeadTimeRadarQuery as Ws, useMyDeadTimeRadarSuspenseQuery as Gs, useMyLifeBalanceLazyQuery as Ks, useMyLifeBalanceQuery as qs, useMyLifeBalanceSuspenseQuery as Js, useMyLifeGoalsLazyQuery as Ys, useMyLifeGoalsQuery as Xs, useMyLifeGoalsSuspenseQuery as Zs, useMyLifeInWeeksLazyQuery as Qs, useMyLifeInWeeksQuery as $s, useMyLifeInWeeksSuspenseQuery as ec, useMyLifeProfileLazyQuery as tc, useMyLifeProfileQuery as nc, useMyLifeProfileSuspenseQuery as rc, useMyLifeValuesLazyQuery as ic, useMyLifeValuesQuery as ac, useMyLifeValuesSuspenseQuery as oc, useMyPersonalDataSummaryLazyQuery as sc, useMyPersonalDataSummaryQuery as cc, useMyPersonalDataSummarySuspenseQuery as lc, useMyRecommendationPreferencesLazyQuery as uc, useMyRecommendationPreferencesQuery as dc, useMyRecommendationPreferencesSuspenseQuery as fc, useMyRecommendationsLazyQuery as pc, useMyRecommendationsQuery as mc, useMyRecommendationsSuspenseQuery as hc, useMySourceConsentsLazyQuery as gc, useMySourceConsentsQuery as _c, useMySourceConsentsSuspenseQuery as vc, useMyTimeWellSpentLazyQuery as yc, useMyTimeWellSpentQuery as bc, useMyTimeWellSpentSuspenseQuery as xc, useRateMeetingMutation as Sc, useRecategorizeTimeCampusCaptureEventMutation as Cc, useRecordApplicationUsageMutation as wc, useRecordFocusScoreMutation as Tc, useRecordGeofenceEventMutation as Ec, useRecordWorkPatternMutation as Dc, useRegenerateClientPortalShareTokenMutation as Oc, useRejectExpenseMutation as kc, useRejectRequestMutation as Ac, useRemoveParticipantMutation as jc, useReorderTasksMutation as Mc, useRequestRevisionMutation as Nc, useRevokeSourceConsentMutation as Pc, useSetBalanceTargetMutation as Fc, useSnoozeRecommendationMutation as Ic, useStartPomodoroSessionMutation as Lc, useStartTimerMutation as Rc, useStopTimerMutation as zc, useSubmitApprovalRequestMutation as Bc, useSubmitExpenseForApprovalMutation as Vc, useToggleClientPortalMutation as Hc, useToggleGeofenceMutation as Uc, useUpdateActionItemMutation as Wc, useUpdateAllocationMutation as Gc, useUpdateApplicationUsageMutation as Kc, useUpdateClientPortalConfigMutation as qc, useUpdateContextSharingPolicyMutation as Jc, useUpdateEmailTimeEntryMutation as Yc, useUpdateExpenseMutation as Xc, useUpdateFocusScoreMutation as Zc, useUpdateGeofenceMutation as Qc, useUpdateLifeGoalMutation as $c, useUpdateLifeValueMutation as el, useUpdateLocationEntryMutation as tl, useUpdateMeetingMutation as nl, useUpdateMyLifeProfileMutation as rl, useUpdateMyRecommendationPreferencesMutation as il, useUpdateParticipantStatusMutation as al, useUpdatePomodoroGoalMutation as ol, useUpdatePomodoroSettingsMutation as sl, useUpdateProjectMutation as cl, useUpdateResourcePlanMutation as ll, useUpdateTaskMutation as ul, useUpdateTaskStatusMutation as dl, useUpdateTimeEntryMutation as fl, useUpdateWorkPatternMutation as pl, useWithdrawRequestMutation as ml } from "./generated/wspace-operations.js";
|
|
3
|
+
import { TimeCampusRoot as hl } from "./timecampus/TimeCampusRoot.js";
|
|
4
|
+
import { useTimeCampusStore as gl } from "./timecampus/store/timecampusStore.js";
|
|
5
|
+
import { useSandboxAssistantTransport as _l } from "./services/createSandboxAssistantTransport.js";
|
|
6
6
|
import "./timecampus/index.js";
|
|
7
|
-
export { n as AcceptRecommendationDocument, r as ActivateResourcePlanDocument, i as AddParticipantDocument, a as ApplicationUsageFieldsFragmentDoc, o as ApprovalRequestFieldsFragmentDoc, s as ApproveExpenseDocument, c as ApproveRequestDocument, l as ArchiveProjectDocument, u as BalanceTargetFieldsFragmentDoc, d as BulkCreateAllocationsDocument, f as BulkCreateEmailTimeEntriesDocument, p as BulkDeleteTimeEntriesDocument, m as CalculateFocusScoreDocument, h as CaptureEventFieldsFragmentDoc, g as CategorizeApplicationDocument, _ as ClientPortalFieldsFragmentDoc, v as CompleteActionItemDocument, y as CompletePomodoroSessionDocument, b as ContextSharingPolicyFieldsFragmentDoc, x as CreateActionItemDocument, S as CreateAllocationDocument, C as CreateClientPortalConfigDocument, w as CreateEmailTimeEntryDocument, T as CreateExpenseDocument, E as CreateGeofenceDocument, D as CreateLifeGoalDocument, O as CreateLocationEntryDocument, k as CreateMeetingDocument, A as CreatePomodoroGoalDocument, j as CreateProjectDocument, M as CreateResourcePlanDocument, N as CreateTaskDocument, P as CreateTimeEntryDocument, F as DeclareLifeValueDocument, I as DeleteActionItemDocument, L as DeleteAllocationDocument, R as DeleteApplicationUsageDocument, z as DeleteClientPortalConfigDocument, B as DeleteEmailTimeEntryDocument, V as DeleteExpenseDocument, H as DeleteFocusScoreDocument, U as DeleteGeofenceDocument, W as DeleteLifeGoalDocument, G as DeleteLifeValueDocument, K as DeleteLocationEntryDocument, q as DeleteMeetingDocument, J as DeletePomodoroGoalDocument, Y as DeleteProjectDocument, X as DeleteResourcePlanDocument, Z as DeleteTaskDocument, Q as DeleteTimeCampusCaptureEventDocument, $ as DeleteTimeEntryDocument, ee as DeleteWorkPatternDocument, te as DismissRecommendationDocument, ne as DuplicateTimeEntryDocument, re as EmailTimeEntryFieldsFragmentDoc, ie as ExpenseFieldsFragmentDoc, ae as FocusScoreFieldsFragmentDoc, oe as GenerateMyRecommendationsDocument, se as GeofenceEventFieldsFragmentDoc, ce as GeofenceFieldsFragmentDoc, le as GetActiveLocationEntryDocument, ue as GetActivePomodoroSessionDocument, de as GetAppUsageSummaryDocument, fe as GetApplicationUsageDocument, pe as GetApprovalRequestDocument, me as GetApprovalStatsDocument, he as GetCapacityOverviewDocument, ge as GetClientPortalConfigDocument, _e as GetClientPortalStatsDocument, ve as GetEmailTimeEntryDocument, ye as GetEmailTrackingStatsDocument, be as GetExpenseDocument, xe as GetExpenseStatsDocument, Se as GetFocusScoreDocument, Ce as GetFocusScoreSummaryDocument, we as GetFocusScoreTrendDocument, Te as GetGeofenceDocument, Ee as GetLocationEntryDocument, De as GetLocationStatsDocument, Oe as GetMeetingDocument, ke as GetMeetingStatsDocument, Ae as GetPomodoroSessionDocument, je as GetPomodoroSettingsDocument, Me as GetPomodoroStatsDocument, Ne as GetProjectDocument, Pe as GetProjectStatsDocument, Fe as GetResourcePlanDocument, Ie as GetTaskDocument, Le as GetTimeCampusTimelineDocument, Re as GetTimeEntryCountDocument, ze as GetTimeEntryDocument, Be as GetTimeEntryStatsDocument, Ve as GetTodayFocusScoreDocument, He as GetTodayWorkPatternDocument, Ue as GetWorkPatternDocument, We as GetWorkPatternSummaryDocument, Ge as GrantSourceConsentDocument, Ke as IngestTimeCampusCaptureEventsDocument, qe as InterruptPomodoroSessionDocument, Je as LifeGoalFieldsFragmentDoc, Ye as LifeProfileFieldsFragmentDoc, Xe as LifeTimelineDocument, Ze as LifeValueFieldsFragmentDoc, Qe as ListApplicationUsagesDocument, $e as ListApprovalRequestsDocument, et as ListClientPortalConfigsDocument, tt as ListEmailTimeEntriesDocument, nt as ListExpenseCategoriesDocument, rt as ListExpensesDocument, it as ListFocusScoresDocument, at as ListGeofenceEventsDocument, ot as ListGeofencesDocument, st as ListLocationEntriesDocument, ct as ListMeetingsDocument, lt as ListMyApprovalRequestsDocument, ut as ListPendingApprovalsDocument, dt as ListPomodoroGoalsDocument, ft as ListPomodoroSessionsDocument, pt as ListProjectsDocument, mt as ListResourceAllocationsDocument, ht as ListResourcePlansDocument, gt as ListRunningTimersDocument, _t as ListTasksDocument, vt as ListTimeCampusCaptureEventsDocument, yt as ListTimeEntriesByDateDocument, bt as ListTimeEntriesDocument, xt as ListTopApplicationsDocument, St as ListUpcomingMeetingsDocument, Ct as ListUserAllocationsDocument, wt as ListWorkPatternsDocument, Tt as LocationEntryFieldsFragmentDoc, Et as LogLifeTimeEntryDocument, Dt as MeetingActionItemFieldsFragmentDoc, Ot as MeetingFieldsFragmentDoc, kt as MeetingParticipantFieldsFragmentDoc, At as MyBalanceTargetsDocument, jt as MyContextSharingPolicyDocument, Mt as MyDeadTimeRadarDocument, Nt as MyLifeBalanceDocument, Pt as MyLifeGoalsDocument, Ft as MyLifeInWeeksDocument, It as MyLifeProfileDocument, Lt as MyLifeValuesDocument, Rt as MyPersonalDataSummaryDocument, zt as MyRecommendationPreferencesDocument, Bt as MyRecommendationsDocument, Vt as MySourceConsentsDocument, Ht as MyTimeWellSpentDocument, Ut as PomodoroGoalFieldsFragmentDoc, Wt as PomodoroSessionFieldsFragmentDoc, Gt as PomodoroSettingsFieldsFragmentDoc, Kt as ProjectFieldsFragmentDoc, qt as RateMeetingDocument, Jt as RecategorizeTimeCampusCaptureEventDocument, Yt as RecommendationFieldsFragmentDoc, Xt as RecommendationPreferenceFieldsFragmentDoc, Zt as RecordApplicationUsageDocument, Qt as RecordFocusScoreDocument, $t as RecordGeofenceEventDocument, en as RecordWorkPatternDocument, tn as RegenerateClientPortalShareTokenDocument, nn as RejectExpenseDocument, rn as RejectRequestDocument, an as RemoveParticipantDocument, on as ReorderTasksDocument, sn as RequestRevisionDocument, cn as ResourceAllocationFieldsFragmentDoc, ln as ResourcePlanFieldsFragmentDoc, un as RevokeSourceConsentDocument, dn as SetBalanceTargetDocument, fn as SnoozeRecommendationDocument, pn as SourceConsentFieldsFragmentDoc, mn as StartPomodoroSessionDocument, hn as StartTimerDocument, gn as StopTimerDocument, _n as SubmitApprovalRequestDocument, vn as SubmitExpenseForApprovalDocument, yn as TaskFieldsFragmentDoc, ol as TimeCampusRoot, bn as TimeEntryFieldsFragmentDoc, xn as TimelineSegmentFieldsFragmentDoc, Sn as TimelineSummaryFieldsFragmentDoc, Cn as ToggleClientPortalDocument, wn as ToggleGeofenceDocument, Tn as UpdateActionItemDocument, En as UpdateAllocationDocument, Dn as UpdateApplicationUsageDocument, On as UpdateClientPortalConfigDocument, kn as UpdateContextSharingPolicyDocument, An as UpdateEmailTimeEntryDocument, jn as UpdateExpenseDocument, Mn as UpdateFocusScoreDocument, Nn as UpdateGeofenceDocument, Pn as UpdateLifeGoalDocument, Fn as UpdateLifeValueDocument, In as UpdateLocationEntryDocument, Ln as UpdateMeetingDocument, Rn as UpdateMyLifeProfileDocument, zn as UpdateMyRecommendationPreferencesDocument, Bn as UpdateParticipantStatusDocument, Vn as UpdatePomodoroGoalDocument, Hn as UpdatePomodoroSettingsDocument, Un as UpdateProjectDocument, Wn as UpdateResourcePlanDocument, Gn as UpdateTaskDocument, Kn as UpdateTaskStatusDocument, qn as UpdateTimeEntryDocument, Jn as UpdateWorkPatternDocument, Yn as WithdrawRequestDocument, Xn as WorkPatternFieldsFragmentDoc, Zn as useAcceptRecommendationMutation, Qn as useActivateResourcePlanMutation, $n as useAddParticipantMutation, er as useApproveExpenseMutation, tr as useApproveRequestMutation, nr as useArchiveProjectMutation, rr as useBulkCreateAllocationsMutation, ir as useBulkCreateEmailTimeEntriesMutation, ar as useBulkDeleteTimeEntriesMutation, or as useCalculateFocusScoreMutation, sr as useCategorizeApplicationMutation, cr as useCompleteActionItemMutation, lr as useCompletePomodoroSessionMutation, ur as useCreateActionItemMutation, dr as useCreateAllocationMutation, fr as useCreateClientPortalConfigMutation, pr as useCreateEmailTimeEntryMutation, mr as useCreateExpenseMutation, hr as useCreateGeofenceMutation, gr as useCreateLifeGoalMutation, _r as useCreateLocationEntryMutation, vr as useCreateMeetingMutation, yr as useCreatePomodoroGoalMutation, br as useCreateProjectMutation, xr as useCreateResourcePlanMutation, Sr as useCreateTaskMutation, Cr as useCreateTimeEntryMutation, wr as useDeclareLifeValueMutation, Tr as useDeleteActionItemMutation, Er as useDeleteAllocationMutation, Dr as useDeleteApplicationUsageMutation, Or as useDeleteClientPortalConfigMutation, kr as useDeleteEmailTimeEntryMutation, Ar as useDeleteExpenseMutation, jr as useDeleteFocusScoreMutation, Mr as useDeleteGeofenceMutation, Nr as useDeleteLifeGoalMutation, Pr as useDeleteLifeValueMutation, Fr as useDeleteLocationEntryMutation, Ir as useDeleteMeetingMutation, Lr as useDeletePomodoroGoalMutation, Rr as useDeleteProjectMutation, zr as useDeleteResourcePlanMutation, Br as useDeleteTaskMutation, Vr as useDeleteTimeCampusCaptureEventMutation, Hr as useDeleteTimeEntryMutation, Ur as useDeleteWorkPatternMutation, Wr as useDismissRecommendationMutation, Gr as useDuplicateTimeEntryMutation, Kr as useGenerateMyRecommendationsMutation, qr as useGetActiveLocationEntryLazyQuery, Jr as useGetActiveLocationEntryQuery, Yr as useGetActiveLocationEntrySuspenseQuery, Xr as useGetActivePomodoroSessionLazyQuery, Zr as useGetActivePomodoroSessionQuery, Qr as useGetActivePomodoroSessionSuspenseQuery, $r as useGetAppUsageSummaryLazyQuery, ei as useGetAppUsageSummaryQuery, ti as useGetAppUsageSummarySuspenseQuery, ni as useGetApplicationUsageLazyQuery, ri as useGetApplicationUsageQuery, ii as useGetApplicationUsageSuspenseQuery, ai as useGetApprovalRequestLazyQuery, oi as useGetApprovalRequestQuery, si as useGetApprovalRequestSuspenseQuery, ci as useGetApprovalStatsLazyQuery, li as useGetApprovalStatsQuery, ui as useGetApprovalStatsSuspenseQuery, di as useGetCapacityOverviewLazyQuery, fi as useGetCapacityOverviewQuery, pi as useGetCapacityOverviewSuspenseQuery, mi as useGetClientPortalConfigLazyQuery, hi as useGetClientPortalConfigQuery, gi as useGetClientPortalConfigSuspenseQuery, _i as useGetClientPortalStatsLazyQuery, vi as useGetClientPortalStatsQuery, yi as useGetClientPortalStatsSuspenseQuery, bi as useGetEmailTimeEntryLazyQuery, xi as useGetEmailTimeEntryQuery, Si as useGetEmailTimeEntrySuspenseQuery, Ci as useGetEmailTrackingStatsLazyQuery, wi as useGetEmailTrackingStatsQuery, Ti as useGetEmailTrackingStatsSuspenseQuery, Ei as useGetExpenseLazyQuery, Di as useGetExpenseQuery, Oi as useGetExpenseStatsLazyQuery, ki as useGetExpenseStatsQuery, Ai as useGetExpenseStatsSuspenseQuery, ji as useGetExpenseSuspenseQuery, Mi as useGetFocusScoreLazyQuery, Ni as useGetFocusScoreQuery, Pi as useGetFocusScoreSummaryLazyQuery, Fi as useGetFocusScoreSummaryQuery, Ii as useGetFocusScoreSummarySuspenseQuery, Li as useGetFocusScoreSuspenseQuery, Ri as useGetFocusScoreTrendLazyQuery, zi as useGetFocusScoreTrendQuery, Bi as useGetFocusScoreTrendSuspenseQuery, Vi as useGetGeofenceLazyQuery, Hi as useGetGeofenceQuery, Ui as useGetGeofenceSuspenseQuery, Wi as useGetLocationEntryLazyQuery, Gi as useGetLocationEntryQuery, Ki as useGetLocationEntrySuspenseQuery, qi as useGetLocationStatsLazyQuery, Ji as useGetLocationStatsQuery, Yi as useGetLocationStatsSuspenseQuery, Xi as useGetMeetingLazyQuery, Zi as useGetMeetingQuery, Qi as useGetMeetingStatsLazyQuery, $i as useGetMeetingStatsQuery, ea as useGetMeetingStatsSuspenseQuery, ta as useGetMeetingSuspenseQuery, na as useGetPomodoroSessionLazyQuery, ra as useGetPomodoroSessionQuery, ia as useGetPomodoroSessionSuspenseQuery, aa as useGetPomodoroSettingsLazyQuery, oa as useGetPomodoroSettingsQuery, sa as useGetPomodoroSettingsSuspenseQuery, ca as useGetPomodoroStatsLazyQuery, la as useGetPomodoroStatsQuery, ua as useGetPomodoroStatsSuspenseQuery, da as useGetProjectLazyQuery, fa as useGetProjectQuery, pa as useGetProjectStatsLazyQuery, ma as useGetProjectStatsQuery, ha as useGetProjectStatsSuspenseQuery, ga as useGetProjectSuspenseQuery, _a as useGetResourcePlanLazyQuery, va as useGetResourcePlanQuery, ya as useGetResourcePlanSuspenseQuery, ba as useGetTaskLazyQuery, xa as useGetTaskQuery, Sa as useGetTaskSuspenseQuery, Ca as useGetTimeCampusTimelineLazyQuery, wa as useGetTimeCampusTimelineQuery, Ta as useGetTimeCampusTimelineSuspenseQuery, Ea as useGetTimeEntryCountLazyQuery, Da as useGetTimeEntryCountQuery, Oa as useGetTimeEntryCountSuspenseQuery, ka as useGetTimeEntryLazyQuery, Aa as useGetTimeEntryQuery, ja as useGetTimeEntryStatsLazyQuery, Ma as useGetTimeEntryStatsQuery, Na as useGetTimeEntryStatsSuspenseQuery, Pa as useGetTimeEntrySuspenseQuery, Fa as useGetTodayFocusScoreLazyQuery, Ia as useGetTodayFocusScoreQuery, La as useGetTodayFocusScoreSuspenseQuery, Ra as useGetTodayWorkPatternLazyQuery, za as useGetTodayWorkPatternQuery, Ba as useGetTodayWorkPatternSuspenseQuery, Va as useGetWorkPatternLazyQuery, Ha as useGetWorkPatternQuery, Ua as useGetWorkPatternSummaryLazyQuery, Wa as useGetWorkPatternSummaryQuery, Ga as useGetWorkPatternSummarySuspenseQuery, Ka as useGetWorkPatternSuspenseQuery, qa as useGrantSourceConsentMutation, Ja as useIngestTimeCampusCaptureEventsMutation, Ya as useInterruptPomodoroSessionMutation, Xa as useLifeTimelineLazyQuery, Za as useLifeTimelineQuery, Qa as useLifeTimelineSuspenseQuery, $a as useListApplicationUsagesLazyQuery, eo as useListApplicationUsagesQuery, to as useListApplicationUsagesSuspenseQuery, no as useListApprovalRequestsLazyQuery, ro as useListApprovalRequestsQuery, io as useListApprovalRequestsSuspenseQuery, ao as useListClientPortalConfigsLazyQuery, oo as useListClientPortalConfigsQuery, so as useListClientPortalConfigsSuspenseQuery, co as useListEmailTimeEntriesLazyQuery, lo as useListEmailTimeEntriesQuery, uo as useListEmailTimeEntriesSuspenseQuery, fo as useListExpenseCategoriesLazyQuery, po as useListExpenseCategoriesQuery, mo as useListExpenseCategoriesSuspenseQuery, ho as useListExpensesLazyQuery, go as useListExpensesQuery, _o as useListExpensesSuspenseQuery, vo as useListFocusScoresLazyQuery, yo as useListFocusScoresQuery, bo as useListFocusScoresSuspenseQuery, xo as useListGeofenceEventsLazyQuery, So as useListGeofenceEventsQuery, Co as useListGeofenceEventsSuspenseQuery, wo as useListGeofencesLazyQuery, To as useListGeofencesQuery, Eo as useListGeofencesSuspenseQuery, Do as useListLocationEntriesLazyQuery, Oo as useListLocationEntriesQuery, ko as useListLocationEntriesSuspenseQuery, Ao as useListMeetingsLazyQuery, jo as useListMeetingsQuery, Mo as useListMeetingsSuspenseQuery, No as useListMyApprovalRequestsLazyQuery, Po as useListMyApprovalRequestsQuery, Fo as useListMyApprovalRequestsSuspenseQuery, Io as useListPendingApprovalsLazyQuery, Lo as useListPendingApprovalsQuery, Ro as useListPendingApprovalsSuspenseQuery, zo as useListPomodoroGoalsLazyQuery, Bo as useListPomodoroGoalsQuery, Vo as useListPomodoroGoalsSuspenseQuery, Ho as useListPomodoroSessionsLazyQuery, Uo as useListPomodoroSessionsQuery, Wo as useListPomodoroSessionsSuspenseQuery, Go as useListProjectsLazyQuery, Ko as useListProjectsQuery, qo as useListProjectsSuspenseQuery, Jo as useListResourceAllocationsLazyQuery, Yo as useListResourceAllocationsQuery, Xo as useListResourceAllocationsSuspenseQuery, Zo as useListResourcePlansLazyQuery, Qo as useListResourcePlansQuery, $o as useListResourcePlansSuspenseQuery, es as useListRunningTimersLazyQuery, ts as useListRunningTimersQuery, ns as useListRunningTimersSuspenseQuery, rs as useListTasksLazyQuery, is as useListTasksQuery, as as useListTasksSuspenseQuery, os as useListTimeCampusCaptureEventsLazyQuery, ss as useListTimeCampusCaptureEventsQuery, cs as useListTimeCampusCaptureEventsSuspenseQuery, ls as useListTimeEntriesByDateLazyQuery, us as useListTimeEntriesByDateQuery, ds as useListTimeEntriesByDateSuspenseQuery, fs as useListTimeEntriesLazyQuery, ps as useListTimeEntriesQuery, ms as useListTimeEntriesSuspenseQuery, hs as useListTopApplicationsLazyQuery, gs as useListTopApplicationsQuery, _s as useListTopApplicationsSuspenseQuery, vs as useListUpcomingMeetingsLazyQuery, ys as useListUpcomingMeetingsQuery, bs as useListUpcomingMeetingsSuspenseQuery, xs as useListUserAllocationsLazyQuery, Ss as useListUserAllocationsQuery, Cs as useListUserAllocationsSuspenseQuery, ws as useListWorkPatternsLazyQuery, Ts as useListWorkPatternsQuery, Es as useListWorkPatternsSuspenseQuery, Ds as useLogLifeTimeEntryMutation, Os as useMyBalanceTargetsLazyQuery, ks as useMyBalanceTargetsQuery, As as useMyBalanceTargetsSuspenseQuery, js as useMyContextSharingPolicyLazyQuery, Ms as useMyContextSharingPolicyQuery, Ns as useMyContextSharingPolicySuspenseQuery, Ps as useMyDeadTimeRadarLazyQuery, Fs as useMyDeadTimeRadarQuery, Is as useMyDeadTimeRadarSuspenseQuery, Ls as useMyLifeBalanceLazyQuery, Rs as useMyLifeBalanceQuery, zs as useMyLifeBalanceSuspenseQuery, Bs as useMyLifeGoalsLazyQuery, Vs as useMyLifeGoalsQuery, Hs as useMyLifeGoalsSuspenseQuery, Us as useMyLifeInWeeksLazyQuery, Ws as useMyLifeInWeeksQuery, Gs as useMyLifeInWeeksSuspenseQuery, Ks as useMyLifeProfileLazyQuery, qs as useMyLifeProfileQuery, Js as useMyLifeProfileSuspenseQuery, Ys as useMyLifeValuesLazyQuery, Xs as useMyLifeValuesQuery, Zs as useMyLifeValuesSuspenseQuery, Qs as useMyPersonalDataSummaryLazyQuery, $s as useMyPersonalDataSummaryQuery, ec as useMyPersonalDataSummarySuspenseQuery, tc as useMyRecommendationPreferencesLazyQuery, nc as useMyRecommendationPreferencesQuery, rc as useMyRecommendationPreferencesSuspenseQuery, ic as useMyRecommendationsLazyQuery, ac as useMyRecommendationsQuery, oc as useMyRecommendationsSuspenseQuery, sc as useMySourceConsentsLazyQuery, cc as useMySourceConsentsQuery, lc as useMySourceConsentsSuspenseQuery, uc as useMyTimeWellSpentLazyQuery, dc as useMyTimeWellSpentQuery, fc as useMyTimeWellSpentSuspenseQuery, pc as useRateMeetingMutation, mc as useRecategorizeTimeCampusCaptureEventMutation, hc as useRecordApplicationUsageMutation, gc as useRecordFocusScoreMutation, _c as useRecordGeofenceEventMutation, vc as useRecordWorkPatternMutation, yc as useRegenerateClientPortalShareTokenMutation, bc as useRejectExpenseMutation, xc as useRejectRequestMutation, Sc as useRemoveParticipantMutation, Cc as useReorderTasksMutation, wc as useRequestRevisionMutation, Tc as useRevokeSourceConsentMutation, cl as useSandboxAssistantTransport, Ec as useSetBalanceTargetMutation, Dc as useSnoozeRecommendationMutation, Oc as useStartPomodoroSessionMutation, kc as useStartTimerMutation, Ac as useStopTimerMutation, jc as useSubmitApprovalRequestMutation, Mc as useSubmitExpenseForApprovalMutation, e as useTimeCampus, t as useTimeCampusNavigate, sl as useTimeCampusStore, Nc as useToggleClientPortalMutation, Pc as useToggleGeofenceMutation, Fc as useUpdateActionItemMutation, Ic as useUpdateAllocationMutation, Lc as useUpdateApplicationUsageMutation, Rc as useUpdateClientPortalConfigMutation, zc as useUpdateContextSharingPolicyMutation, Bc as useUpdateEmailTimeEntryMutation, Vc as useUpdateExpenseMutation, Hc as useUpdateFocusScoreMutation, Uc as useUpdateGeofenceMutation, Wc as useUpdateLifeGoalMutation, Gc as useUpdateLifeValueMutation, Kc as useUpdateLocationEntryMutation, qc as useUpdateMeetingMutation, Jc as useUpdateMyLifeProfileMutation, Yc as useUpdateMyRecommendationPreferencesMutation, Xc as useUpdateParticipantStatusMutation, Zc as useUpdatePomodoroGoalMutation, Qc as useUpdatePomodoroSettingsMutation, $c as useUpdateProjectMutation, el as useUpdateResourcePlanMutation, tl as useUpdateTaskMutation, nl as useUpdateTaskStatusMutation, rl as useUpdateTimeEntryMutation, il as useUpdateWorkPatternMutation, al as useWithdrawRequestMutation };
|
|
7
|
+
export { n as AcceptRecommendationDocument, r as ActivateResourcePlanDocument, i as AddParticipantDocument, a as ApplicationUsageFieldsFragmentDoc, o as ApprovalRequestFieldsFragmentDoc, s as ApproveExpenseDocument, c as ApproveRequestDocument, l as ArchiveProjectDocument, u as BalanceTargetFieldsFragmentDoc, d as BulkCreateAllocationsDocument, f as BulkCreateEmailTimeEntriesDocument, p as BulkDeleteTimeEntriesDocument, m as CalculateFocusScoreDocument, h as CaptureEventFieldsFragmentDoc, g as CategorizeApplicationDocument, _ as ClientPortalFieldsFragmentDoc, v as CompleteActionItemDocument, y as CompletePomodoroSessionDocument, b as ContextSharingPolicyFieldsFragmentDoc, x as CreateActionItemDocument, S as CreateAllocationDocument, C as CreateClientPortalConfigDocument, w as CreateEmailTimeEntryDocument, T as CreateExpenseDocument, E as CreateGeofenceDocument, D as CreateLifeGoalDocument, O as CreateLocationEntryDocument, k as CreateMeetingDocument, A as CreatePomodoroGoalDocument, j as CreateProjectDocument, M as CreateResourcePlanDocument, N as CreateTaskDocument, P as CreateTimeEntryDocument, F as DeclareLifeValueDocument, I as DeleteActionItemDocument, L as DeleteAllocationDocument, R as DeleteApplicationUsageDocument, z as DeleteClientPortalConfigDocument, B as DeleteEmailTimeEntryDocument, V as DeleteExpenseDocument, H as DeleteFocusScoreDocument, U as DeleteGeofenceDocument, W as DeleteLifeGoalDocument, G as DeleteLifeValueDocument, K as DeleteLocationEntryDocument, q as DeleteMeetingDocument, J as DeletePomodoroGoalDocument, Y as DeleteProjectDocument, X as DeleteResourcePlanDocument, Z as DeleteTaskDocument, Q as DeleteTimeCampusCaptureEventDocument, $ as DeleteTimeEntryDocument, ee as DeleteWorkPatternDocument, te as DismissRecommendationDocument, ne as DuplicateTimeEntryDocument, re as EmailTimeEntryFieldsFragmentDoc, ie as ExpenseFieldsFragmentDoc, ae as FocusScoreFieldsFragmentDoc, oe as GenerateMyRecommendationsDocument, se as GeofenceEventFieldsFragmentDoc, ce as GeofenceFieldsFragmentDoc, le as GetActiveLocationEntryDocument, ue as GetActivePomodoroSessionDocument, de as GetAppUsageSummaryDocument, fe as GetApplicationUsageDocument, pe as GetApprovalRequestDocument, me as GetApprovalStatsDocument, he as GetCapacityOverviewDocument, ge as GetClientPortalConfigDocument, _e as GetClientPortalStatsDocument, ve as GetEmailTimeEntryDocument, ye as GetEmailTrackingStatsDocument, be as GetExpenseDocument, xe as GetExpenseStatsDocument, Se as GetFocusScoreDocument, Ce as GetFocusScoreSummaryDocument, we as GetFocusScoreTrendDocument, Te as GetGeofenceDocument, Ee as GetLocationEntryDocument, De as GetLocationStatsDocument, Oe as GetMeetingDocument, ke as GetMeetingStatsDocument, Ae as GetPomodoroSessionDocument, je as GetPomodoroSettingsDocument, Me as GetPomodoroStatsDocument, Ne as GetProjectDocument, Pe as GetProjectStatsDocument, Fe as GetResourcePlanDocument, Ie as GetTaskDocument, Le as GetTeamWorkPatternSummaryDocument, Re as GetTimeCampusTimelineDocument, ze as GetTimeEntryCountDocument, Be as GetTimeEntryDocument, Ve as GetTimeEntryStatsDocument, He as GetTodayFocusScoreDocument, Ue as GetTodayWorkPatternDocument, We as GetWorkPatternDocument, Ge as GetWorkPatternSummaryDocument, Ke as GrantSourceConsentDocument, qe as IngestTimeCampusCaptureEventsDocument, Je as InterruptPomodoroSessionDocument, Ye as LifeGoalFieldsFragmentDoc, Xe as LifeProfileFieldsFragmentDoc, Ze as LifeTimelineDocument, Qe as LifeValueFieldsFragmentDoc, $e as ListApplicationUsagesDocument, et as ListApprovalRequestsDocument, tt as ListClientPortalConfigsDocument, nt as ListEmailTimeEntriesDocument, rt as ListExpenseCategoriesDocument, it as ListExpensesDocument, at as ListFocusScoresDocument, ot as ListGeofenceEventsDocument, st as ListGeofencesDocument, ct as ListLocationEntriesDocument, lt as ListMeetingsDocument, ut as ListMyApprovalRequestsDocument, dt as ListPendingApprovalsDocument, ft as ListPomodoroGoalsDocument, pt as ListPomodoroSessionsDocument, mt as ListProjectsDocument, ht as ListResourceAllocationsDocument, gt as ListResourcePlansDocument, _t as ListRunningTimersDocument, vt as ListTasksDocument, yt as ListTeamWorkPatternsDocument, bt as ListTimeCampusCaptureEventsDocument, xt as ListTimeEntriesByDateDocument, St as ListTimeEntriesDocument, Ct as ListTopApplicationsDocument, wt as ListUpcomingMeetingsDocument, Tt as ListUserAllocationsDocument, Et as ListWorkPatternsDocument, Dt as LocationEntryFieldsFragmentDoc, Ot as LogLifeTimeEntryDocument, kt as MeetingActionItemFieldsFragmentDoc, At as MeetingFieldsFragmentDoc, jt as MeetingParticipantFieldsFragmentDoc, Mt as MyBalanceTargetsDocument, Nt as MyContextSharingPolicyDocument, Pt as MyDeadTimeRadarDocument, Ft as MyLifeBalanceDocument, It as MyLifeGoalsDocument, Lt as MyLifeInWeeksDocument, Rt as MyLifeProfileDocument, zt as MyLifeValuesDocument, Bt as MyPersonalDataSummaryDocument, Vt as MyRecommendationPreferencesDocument, Ht as MyRecommendationsDocument, Ut as MySourceConsentsDocument, Wt as MyTimeWellSpentDocument, Gt as PomodoroGoalFieldsFragmentDoc, Kt as PomodoroSessionFieldsFragmentDoc, qt as PomodoroSettingsFieldsFragmentDoc, Jt as ProjectFieldsFragmentDoc, Yt as RateMeetingDocument, Xt as RecategorizeTimeCampusCaptureEventDocument, Zt as RecommendationFieldsFragmentDoc, Qt as RecommendationPreferenceFieldsFragmentDoc, $t as RecordApplicationUsageDocument, en as RecordFocusScoreDocument, tn as RecordGeofenceEventDocument, nn as RecordWorkPatternDocument, rn as RegenerateClientPortalShareTokenDocument, an as RejectExpenseDocument, on as RejectRequestDocument, sn as RemoveParticipantDocument, cn as ReorderTasksDocument, ln as RequestRevisionDocument, un as ResourceAllocationFieldsFragmentDoc, dn as ResourcePlanFieldsFragmentDoc, fn as RevokeSourceConsentDocument, pn as SetBalanceTargetDocument, mn as SnoozeRecommendationDocument, hn as SourceConsentFieldsFragmentDoc, gn as StartPomodoroSessionDocument, _n as StartTimerDocument, vn as StopTimerDocument, yn as SubmitApprovalRequestDocument, bn as SubmitExpenseForApprovalDocument, xn as TaskFieldsFragmentDoc, Sn as TeamWorkPatternEntryFieldsFragmentDoc, hl as TimeCampusRoot, Cn as TimeEntryFieldsFragmentDoc, wn as TimelineSegmentFieldsFragmentDoc, Tn as TimelineSummaryFieldsFragmentDoc, En as ToggleClientPortalDocument, Dn as ToggleGeofenceDocument, On as UpdateActionItemDocument, kn as UpdateAllocationDocument, An as UpdateApplicationUsageDocument, jn as UpdateClientPortalConfigDocument, Mn as UpdateContextSharingPolicyDocument, Nn as UpdateEmailTimeEntryDocument, Pn as UpdateExpenseDocument, Fn as UpdateFocusScoreDocument, In as UpdateGeofenceDocument, Ln as UpdateLifeGoalDocument, Rn as UpdateLifeValueDocument, zn as UpdateLocationEntryDocument, Bn as UpdateMeetingDocument, Vn as UpdateMyLifeProfileDocument, Hn as UpdateMyRecommendationPreferencesDocument, Un as UpdateParticipantStatusDocument, Wn as UpdatePomodoroGoalDocument, Gn as UpdatePomodoroSettingsDocument, Kn as UpdateProjectDocument, qn as UpdateResourcePlanDocument, Jn as UpdateTaskDocument, Yn as UpdateTaskStatusDocument, Xn as UpdateTimeEntryDocument, Zn as UpdateWorkPatternDocument, Qn as WithdrawRequestDocument, $n as WorkPatternFieldsFragmentDoc, er as useAcceptRecommendationMutation, tr as useActivateResourcePlanMutation, nr as useAddParticipantMutation, rr as useApproveExpenseMutation, ir as useApproveRequestMutation, ar as useArchiveProjectMutation, or as useBulkCreateAllocationsMutation, sr as useBulkCreateEmailTimeEntriesMutation, cr as useBulkDeleteTimeEntriesMutation, lr as useCalculateFocusScoreMutation, ur as useCategorizeApplicationMutation, dr as useCompleteActionItemMutation, fr as useCompletePomodoroSessionMutation, pr as useCreateActionItemMutation, mr as useCreateAllocationMutation, hr as useCreateClientPortalConfigMutation, gr as useCreateEmailTimeEntryMutation, _r as useCreateExpenseMutation, vr as useCreateGeofenceMutation, yr as useCreateLifeGoalMutation, br as useCreateLocationEntryMutation, xr as useCreateMeetingMutation, Sr as useCreatePomodoroGoalMutation, Cr as useCreateProjectMutation, wr as useCreateResourcePlanMutation, Tr as useCreateTaskMutation, Er as useCreateTimeEntryMutation, Dr as useDeclareLifeValueMutation, Or as useDeleteActionItemMutation, kr as useDeleteAllocationMutation, Ar as useDeleteApplicationUsageMutation, jr as useDeleteClientPortalConfigMutation, Mr as useDeleteEmailTimeEntryMutation, Nr as useDeleteExpenseMutation, Pr as useDeleteFocusScoreMutation, Fr as useDeleteGeofenceMutation, Ir as useDeleteLifeGoalMutation, Lr as useDeleteLifeValueMutation, Rr as useDeleteLocationEntryMutation, zr as useDeleteMeetingMutation, Br as useDeletePomodoroGoalMutation, Vr as useDeleteProjectMutation, Hr as useDeleteResourcePlanMutation, Ur as useDeleteTaskMutation, Wr as useDeleteTimeCampusCaptureEventMutation, Gr as useDeleteTimeEntryMutation, Kr as useDeleteWorkPatternMutation, qr as useDismissRecommendationMutation, Jr as useDuplicateTimeEntryMutation, Yr as useGenerateMyRecommendationsMutation, Xr as useGetActiveLocationEntryLazyQuery, Zr as useGetActiveLocationEntryQuery, Qr as useGetActiveLocationEntrySuspenseQuery, $r as useGetActivePomodoroSessionLazyQuery, ei as useGetActivePomodoroSessionQuery, ti as useGetActivePomodoroSessionSuspenseQuery, ni as useGetAppUsageSummaryLazyQuery, ri as useGetAppUsageSummaryQuery, ii as useGetAppUsageSummarySuspenseQuery, ai as useGetApplicationUsageLazyQuery, oi as useGetApplicationUsageQuery, si as useGetApplicationUsageSuspenseQuery, ci as useGetApprovalRequestLazyQuery, li as useGetApprovalRequestQuery, ui as useGetApprovalRequestSuspenseQuery, di as useGetApprovalStatsLazyQuery, fi as useGetApprovalStatsQuery, pi as useGetApprovalStatsSuspenseQuery, mi as useGetCapacityOverviewLazyQuery, hi as useGetCapacityOverviewQuery, gi as useGetCapacityOverviewSuspenseQuery, _i as useGetClientPortalConfigLazyQuery, vi as useGetClientPortalConfigQuery, yi as useGetClientPortalConfigSuspenseQuery, bi as useGetClientPortalStatsLazyQuery, xi as useGetClientPortalStatsQuery, Si as useGetClientPortalStatsSuspenseQuery, Ci as useGetEmailTimeEntryLazyQuery, wi as useGetEmailTimeEntryQuery, Ti as useGetEmailTimeEntrySuspenseQuery, Ei as useGetEmailTrackingStatsLazyQuery, Di as useGetEmailTrackingStatsQuery, Oi as useGetEmailTrackingStatsSuspenseQuery, ki as useGetExpenseLazyQuery, Ai as useGetExpenseQuery, ji as useGetExpenseStatsLazyQuery, Mi as useGetExpenseStatsQuery, Ni as useGetExpenseStatsSuspenseQuery, Pi as useGetExpenseSuspenseQuery, Fi as useGetFocusScoreLazyQuery, Ii as useGetFocusScoreQuery, Li as useGetFocusScoreSummaryLazyQuery, Ri as useGetFocusScoreSummaryQuery, zi as useGetFocusScoreSummarySuspenseQuery, Bi as useGetFocusScoreSuspenseQuery, Vi as useGetFocusScoreTrendLazyQuery, Hi as useGetFocusScoreTrendQuery, Ui as useGetFocusScoreTrendSuspenseQuery, Wi as useGetGeofenceLazyQuery, Gi as useGetGeofenceQuery, Ki as useGetGeofenceSuspenseQuery, qi as useGetLocationEntryLazyQuery, Ji as useGetLocationEntryQuery, Yi as useGetLocationEntrySuspenseQuery, Xi as useGetLocationStatsLazyQuery, Zi as useGetLocationStatsQuery, Qi as useGetLocationStatsSuspenseQuery, $i as useGetMeetingLazyQuery, ea as useGetMeetingQuery, ta as useGetMeetingStatsLazyQuery, na as useGetMeetingStatsQuery, ra as useGetMeetingStatsSuspenseQuery, ia as useGetMeetingSuspenseQuery, aa as useGetPomodoroSessionLazyQuery, oa as useGetPomodoroSessionQuery, sa as useGetPomodoroSessionSuspenseQuery, ca as useGetPomodoroSettingsLazyQuery, la as useGetPomodoroSettingsQuery, ua as useGetPomodoroSettingsSuspenseQuery, da as useGetPomodoroStatsLazyQuery, fa as useGetPomodoroStatsQuery, pa as useGetPomodoroStatsSuspenseQuery, ma as useGetProjectLazyQuery, ha as useGetProjectQuery, ga as useGetProjectStatsLazyQuery, _a as useGetProjectStatsQuery, va as useGetProjectStatsSuspenseQuery, ya as useGetProjectSuspenseQuery, ba as useGetResourcePlanLazyQuery, xa as useGetResourcePlanQuery, Sa as useGetResourcePlanSuspenseQuery, Ca as useGetTaskLazyQuery, wa as useGetTaskQuery, Ta as useGetTaskSuspenseQuery, Ea as useGetTeamWorkPatternSummaryLazyQuery, Da as useGetTeamWorkPatternSummaryQuery, Oa as useGetTeamWorkPatternSummarySuspenseQuery, ka as useGetTimeCampusTimelineLazyQuery, Aa as useGetTimeCampusTimelineQuery, ja as useGetTimeCampusTimelineSuspenseQuery, Ma as useGetTimeEntryCountLazyQuery, Na as useGetTimeEntryCountQuery, Pa as useGetTimeEntryCountSuspenseQuery, Fa as useGetTimeEntryLazyQuery, Ia as useGetTimeEntryQuery, La as useGetTimeEntryStatsLazyQuery, Ra as useGetTimeEntryStatsQuery, za as useGetTimeEntryStatsSuspenseQuery, Ba as useGetTimeEntrySuspenseQuery, Va as useGetTodayFocusScoreLazyQuery, Ha as useGetTodayFocusScoreQuery, Ua as useGetTodayFocusScoreSuspenseQuery, Wa as useGetTodayWorkPatternLazyQuery, Ga as useGetTodayWorkPatternQuery, Ka as useGetTodayWorkPatternSuspenseQuery, qa as useGetWorkPatternLazyQuery, Ja as useGetWorkPatternQuery, Ya as useGetWorkPatternSummaryLazyQuery, Xa as useGetWorkPatternSummaryQuery, Za as useGetWorkPatternSummarySuspenseQuery, Qa as useGetWorkPatternSuspenseQuery, $a as useGrantSourceConsentMutation, eo as useIngestTimeCampusCaptureEventsMutation, to as useInterruptPomodoroSessionMutation, no as useLifeTimelineLazyQuery, ro as useLifeTimelineQuery, io as useLifeTimelineSuspenseQuery, ao as useListApplicationUsagesLazyQuery, oo as useListApplicationUsagesQuery, so as useListApplicationUsagesSuspenseQuery, co as useListApprovalRequestsLazyQuery, lo as useListApprovalRequestsQuery, uo as useListApprovalRequestsSuspenseQuery, fo as useListClientPortalConfigsLazyQuery, po as useListClientPortalConfigsQuery, mo as useListClientPortalConfigsSuspenseQuery, ho as useListEmailTimeEntriesLazyQuery, go as useListEmailTimeEntriesQuery, _o as useListEmailTimeEntriesSuspenseQuery, vo as useListExpenseCategoriesLazyQuery, yo as useListExpenseCategoriesQuery, bo as useListExpenseCategoriesSuspenseQuery, xo as useListExpensesLazyQuery, So as useListExpensesQuery, Co as useListExpensesSuspenseQuery, wo as useListFocusScoresLazyQuery, To as useListFocusScoresQuery, Eo as useListFocusScoresSuspenseQuery, Do as useListGeofenceEventsLazyQuery, Oo as useListGeofenceEventsQuery, ko as useListGeofenceEventsSuspenseQuery, Ao as useListGeofencesLazyQuery, jo as useListGeofencesQuery, Mo as useListGeofencesSuspenseQuery, No as useListLocationEntriesLazyQuery, Po as useListLocationEntriesQuery, Fo as useListLocationEntriesSuspenseQuery, Io as useListMeetingsLazyQuery, Lo as useListMeetingsQuery, Ro as useListMeetingsSuspenseQuery, zo as useListMyApprovalRequestsLazyQuery, Bo as useListMyApprovalRequestsQuery, Vo as useListMyApprovalRequestsSuspenseQuery, Ho as useListPendingApprovalsLazyQuery, Uo as useListPendingApprovalsQuery, Wo as useListPendingApprovalsSuspenseQuery, Go as useListPomodoroGoalsLazyQuery, Ko as useListPomodoroGoalsQuery, qo as useListPomodoroGoalsSuspenseQuery, Jo as useListPomodoroSessionsLazyQuery, Yo as useListPomodoroSessionsQuery, Xo as useListPomodoroSessionsSuspenseQuery, Zo as useListProjectsLazyQuery, Qo as useListProjectsQuery, $o as useListProjectsSuspenseQuery, es as useListResourceAllocationsLazyQuery, ts as useListResourceAllocationsQuery, ns as useListResourceAllocationsSuspenseQuery, rs as useListResourcePlansLazyQuery, is as useListResourcePlansQuery, as as useListResourcePlansSuspenseQuery, os as useListRunningTimersLazyQuery, ss as useListRunningTimersQuery, cs as useListRunningTimersSuspenseQuery, ls as useListTasksLazyQuery, us as useListTasksQuery, ds as useListTasksSuspenseQuery, fs as useListTeamWorkPatternsLazyQuery, ps as useListTeamWorkPatternsQuery, ms as useListTeamWorkPatternsSuspenseQuery, hs as useListTimeCampusCaptureEventsLazyQuery, gs as useListTimeCampusCaptureEventsQuery, _s as useListTimeCampusCaptureEventsSuspenseQuery, vs as useListTimeEntriesByDateLazyQuery, ys as useListTimeEntriesByDateQuery, bs as useListTimeEntriesByDateSuspenseQuery, xs as useListTimeEntriesLazyQuery, Ss as useListTimeEntriesQuery, Cs as useListTimeEntriesSuspenseQuery, ws as useListTopApplicationsLazyQuery, Ts as useListTopApplicationsQuery, Es as useListTopApplicationsSuspenseQuery, Ds as useListUpcomingMeetingsLazyQuery, Os as useListUpcomingMeetingsQuery, ks as useListUpcomingMeetingsSuspenseQuery, As as useListUserAllocationsLazyQuery, js as useListUserAllocationsQuery, Ms as useListUserAllocationsSuspenseQuery, Ns as useListWorkPatternsLazyQuery, Ps as useListWorkPatternsQuery, Fs as useListWorkPatternsSuspenseQuery, Is as useLogLifeTimeEntryMutation, Ls as useMyBalanceTargetsLazyQuery, Rs as useMyBalanceTargetsQuery, zs as useMyBalanceTargetsSuspenseQuery, Bs as useMyContextSharingPolicyLazyQuery, Vs as useMyContextSharingPolicyQuery, Hs as useMyContextSharingPolicySuspenseQuery, Us as useMyDeadTimeRadarLazyQuery, Ws as useMyDeadTimeRadarQuery, Gs as useMyDeadTimeRadarSuspenseQuery, Ks as useMyLifeBalanceLazyQuery, qs as useMyLifeBalanceQuery, Js as useMyLifeBalanceSuspenseQuery, Ys as useMyLifeGoalsLazyQuery, Xs as useMyLifeGoalsQuery, Zs as useMyLifeGoalsSuspenseQuery, Qs as useMyLifeInWeeksLazyQuery, $s as useMyLifeInWeeksQuery, ec as useMyLifeInWeeksSuspenseQuery, tc as useMyLifeProfileLazyQuery, nc as useMyLifeProfileQuery, rc as useMyLifeProfileSuspenseQuery, ic as useMyLifeValuesLazyQuery, ac as useMyLifeValuesQuery, oc as useMyLifeValuesSuspenseQuery, sc as useMyPersonalDataSummaryLazyQuery, cc as useMyPersonalDataSummaryQuery, lc as useMyPersonalDataSummarySuspenseQuery, uc as useMyRecommendationPreferencesLazyQuery, dc as useMyRecommendationPreferencesQuery, fc as useMyRecommendationPreferencesSuspenseQuery, pc as useMyRecommendationsLazyQuery, mc as useMyRecommendationsQuery, hc as useMyRecommendationsSuspenseQuery, gc as useMySourceConsentsLazyQuery, _c as useMySourceConsentsQuery, vc as useMySourceConsentsSuspenseQuery, yc as useMyTimeWellSpentLazyQuery, bc as useMyTimeWellSpentQuery, xc as useMyTimeWellSpentSuspenseQuery, Sc as useRateMeetingMutation, Cc as useRecategorizeTimeCampusCaptureEventMutation, wc as useRecordApplicationUsageMutation, Tc as useRecordFocusScoreMutation, Ec as useRecordGeofenceEventMutation, Dc as useRecordWorkPatternMutation, Oc as useRegenerateClientPortalShareTokenMutation, kc as useRejectExpenseMutation, Ac as useRejectRequestMutation, jc as useRemoveParticipantMutation, Mc as useReorderTasksMutation, Nc as useRequestRevisionMutation, Pc as useRevokeSourceConsentMutation, _l as useSandboxAssistantTransport, Fc as useSetBalanceTargetMutation, Ic as useSnoozeRecommendationMutation, Lc as useStartPomodoroSessionMutation, Rc as useStartTimerMutation, zc as useStopTimerMutation, Bc as useSubmitApprovalRequestMutation, Vc as useSubmitExpenseForApprovalMutation, e as useTimeCampus, t as useTimeCampusNavigate, gl as useTimeCampusStore, Hc as useToggleClientPortalMutation, Uc as useToggleGeofenceMutation, Wc as useUpdateActionItemMutation, Gc as useUpdateAllocationMutation, Kc as useUpdateApplicationUsageMutation, qc as useUpdateClientPortalConfigMutation, Jc as useUpdateContextSharingPolicyMutation, Yc as useUpdateEmailTimeEntryMutation, Xc as useUpdateExpenseMutation, Zc as useUpdateFocusScoreMutation, Qc as useUpdateGeofenceMutation, $c as useUpdateLifeGoalMutation, el as useUpdateLifeValueMutation, tl as useUpdateLocationEntryMutation, nl as useUpdateMeetingMutation, rl as useUpdateMyLifeProfileMutation, il as useUpdateMyRecommendationPreferencesMutation, al as useUpdateParticipantStatusMutation, ol as useUpdatePomodoroGoalMutation, sl as useUpdatePomodoroSettingsMutation, cl as useUpdateProjectMutation, ll as useUpdateResourcePlanMutation, ul as useUpdateTaskMutation, dl as useUpdateTaskStatusMutation, fl as useUpdateTimeEntryMutation, pl as useUpdateWorkPatternMutation, ml as useWithdrawRequestMutation };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpenseTrackingPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"names":[],"mappings":"AAgIA,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"ExpenseTrackingPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"names":[],"mappings":"AAgIA,wBAAgB,mBAAmB,gCAsuBlC"}
|
|
@@ -40,7 +40,7 @@ var v = 25, y = [
|
|
|
40
40
|
id
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
|
-
`, De =
|
|
43
|
+
`, De = 3600;
|
|
44
44
|
function Oe({ expense: e }) {
|
|
45
45
|
return _({
|
|
46
46
|
entityType: "TIMECAMPUS_EXPENSE",
|
|
@@ -57,7 +57,8 @@ var S = {
|
|
|
57
57
|
description: "",
|
|
58
58
|
projectId: "",
|
|
59
59
|
date: x(),
|
|
60
|
-
|
|
60
|
+
receiptFileId: "",
|
|
61
|
+
receiptPreviewUrl: ""
|
|
61
62
|
};
|
|
62
63
|
function C() {
|
|
63
64
|
let { workspaceId: f = "" } = e(), { toasts: g, addToast: _, dismissToast: C } = ue(), w = Ce(), { data: ke, loading: T, error: Ae, refetch: je, fetchMore: Me } = re({
|
|
@@ -86,7 +87,8 @@ function C() {
|
|
|
86
87
|
description: e.description ?? "",
|
|
87
88
|
projectId: e.projectId ?? "",
|
|
88
89
|
date: e.date ? e.date.slice(0, 10) : x(),
|
|
89
|
-
|
|
90
|
+
receiptFileId: e.receiptFileId ?? "",
|
|
91
|
+
receiptPreviewUrl: e.receiptDownloadUrl ?? ""
|
|
90
92
|
}), F(!0);
|
|
91
93
|
}, Ze = async (e) => {
|
|
92
94
|
V(!0);
|
|
@@ -110,10 +112,10 @@ function C() {
|
|
|
110
112
|
},
|
|
111
113
|
fetchPolicy: "no-cache"
|
|
112
114
|
}), a = i?.getFileDownloadUrl;
|
|
113
|
-
if (!a) throw Error("No download URL returned");
|
|
114
115
|
z((e) => ({
|
|
115
116
|
...e,
|
|
116
|
-
|
|
117
|
+
receiptFileId: r.id,
|
|
118
|
+
receiptPreviewUrl: a ?? ""
|
|
117
119
|
})), _({
|
|
118
120
|
title: "Receipt attached",
|
|
119
121
|
variant: "success"
|
|
@@ -142,7 +144,7 @@ function C() {
|
|
|
142
144
|
description: R.description.trim() || void 0,
|
|
143
145
|
projectId: R.projectId.trim() || void 0,
|
|
144
146
|
date: t,
|
|
145
|
-
|
|
147
|
+
receiptFileId: R.receiptFileId || void 0
|
|
146
148
|
}
|
|
147
149
|
} }), _({
|
|
148
150
|
title: "Expense updated",
|
|
@@ -154,7 +156,7 @@ function C() {
|
|
|
154
156
|
description: R.description.trim() || void 0,
|
|
155
157
|
projectId: R.projectId.trim() || void 0,
|
|
156
158
|
date: t,
|
|
157
|
-
|
|
159
|
+
receiptFileId: R.receiptFileId || void 0
|
|
158
160
|
} } }), _({
|
|
159
161
|
title: "Expense added",
|
|
160
162
|
variant: "success"
|
|
@@ -558,8 +560,8 @@ function C() {
|
|
|
558
560
|
})
|
|
559
561
|
]
|
|
560
562
|
}),
|
|
561
|
-
R.
|
|
562
|
-
href: R.
|
|
563
|
+
R.receiptFileId && R.receiptPreviewUrl && /* @__PURE__ */ h("a", {
|
|
564
|
+
href: R.receiptPreviewUrl,
|
|
563
565
|
target: "_blank",
|
|
564
566
|
rel: "noopener noreferrer",
|
|
565
567
|
className: "inline-flex w-fit items-center gap-1.5 text-sm font-medium text-action-primary-text/90 underline decoration-border-subtle underline-offset-2 hover:text-action-primary-text",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpenseTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n Receipt,\n Plus,\n DollarSign,\n Pencil,\n Trash2,\n Send,\n Check,\n X,\n Upload,\n ExternalLink,\n MessageSquare,\n} from \"lucide-react\";\nimport { gql } from \"@apollo/client\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport { uploadBlobToFiles } from \"@burdenoff/fe-libs/storage\";\nimport { ContextConversationWidget } from \"@burdenoff/fe-libs/shared\";\nimport { useRegisterPageConversationContext } from \"@burdenoff/fe-libs/shared/providers/shell\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { StatusBadge } from \"../../components/StatusBadge\";\nimport { Modal } from \"../../components/Modal\";\nimport { ToastContainer, useToast } from \"../../components/Toast\";\nimport {\n ChartCard,\n DonutChart,\n RadialGauge,\n type DonutSlice,\n} from \"../../components\";\nimport { formatCurrency, formatDate } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListExpensesQuery,\n useGetExpenseStatsQuery,\n useCreateExpenseMutation,\n useUpdateExpenseMutation,\n useDeleteExpenseMutation,\n useSubmitExpenseForApprovalMutation,\n useApproveExpenseMutation,\n useRejectExpenseMutation,\n type ExpenseFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { ExpenseStatus } from \"@/generated/wspace-types\";\n\nconst PAGE_SIZE = 25;\n\nconst CATEGORY_OPTIONS = [\n \"Travel\",\n \"Meals\",\n \"Software\",\n \"Hardware\",\n \"Office\",\n \"Training\",\n \"Other\",\n];\n\nconst inputClass =\n \"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/**\n * Resolves a presigned download URL for an uploaded receipt.\n *\n * KNOWN LIMITATION: `getFileDownloadUrl` returns a presigned URL that expires\n * after `expiresIn` seconds (capped at 604800 = 7 days by wspace-files-svc).\n * We persist that URL in the expense's `receiptUrl` scalar, so a stored link\n * stops resolving after 7 days. Re-uploading the receipt (or resolving a fresh\n * URL on read) would be needed for longer-lived access.\n */\nconst GET_FILE_DOWNLOAD_URL = gql`\n query TimeCampusExpense_GetFileDownloadUrl($id: ID!, $expiresIn: Int) {\n getFileDownloadUrl(id: $id, expiresIn: $expiresIn)\n }\n`;\n\n// wspace-files requires a real folder id (File.folderId FK); resolve/create a\n// TimeCampus folder rather than passing an empty string.\nconst ENSURE_FOLDER = gql`\n mutation TimeCampusExpense_EnsureFolder($path: String!) {\n ensureFolderByPath(path: $path) {\n id\n }\n }\n`;\n\nconst RECEIPT_URL_EXPIRES_IN = 604800; // 7 days — the max wspace-files allows.\n\ninterface ExpenseFormState {\n amount: string;\n category: string;\n description: string;\n projectId: string;\n date: string;\n receiptUrl: string;\n}\n\n/**\n * Child component that mounts the per-expense review conversation thread.\n * Kept as a separate component so `useRegisterPageConversationContext` runs\n * (registering + tearing down the entity context) exactly while the review\n * modal is mounted. The widget self-scopes the thread to this entity and\n * self-guards its own errors, so the existing scalar notes/reason flow is\n * left completely untouched.\n */\nfunction ExpenseReviewThread({ expense }: { expense: ExpenseFieldsFragment }) {\n useRegisterPageConversationContext({\n entityType: \"TIMECAMPUS_EXPENSE\",\n entityId: expense.id,\n contextTitle: `Expense · ${expense.description ?? expense.id}`,\n });\n return <ContextConversationWidget widgetKey=\"expense-review\" />;\n}\n\nfunction todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nconst emptyForm: ExpenseFormState = {\n amount: \"\",\n category: CATEGORY_OPTIONS[0],\n description: \"\",\n projectId: \"\",\n date: todayIso(),\n receiptUrl: \"\",\n};\n\nexport function ExpenseTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { toasts, addToast, dismissToast } = useToast();\n const apollo = useApolloClient();\n\n const {\n data: expensesData,\n loading: expensesLoading,\n error: expensesError,\n refetch,\n fetchMore,\n } = useListExpensesQuery({\n variables: { workspaceId, pagination: { limit: PAGE_SIZE, offset: 0 } },\n notifyOnNetworkStatusChange: true,\n });\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n refetch: refetchStats,\n } = useGetExpenseStatsQuery({\n variables: { workspaceId },\n });\n\n const [createExpense, { loading: creating }] = useCreateExpenseMutation();\n const [updateExpense, { loading: updating }] = useUpdateExpenseMutation();\n const [deleteExpense, { loading: deleting }] = useDeleteExpenseMutation();\n const [submitExpense] = useSubmitExpenseForApprovalMutation();\n const [approveExpense] = useApproveExpenseMutation();\n const [rejectExpense, { loading: rejecting }] = useRejectExpenseMutation();\n\n const expenses = expensesData?.expenses ?? [];\n const stats = statsData?.expenseStats;\n\n // Chart data derived only from data the page already fetches.\n const displayCurrency = expenses[0]?.currency ?? \"USD\";\n\n const categorySpend: DonutSlice[] = stats?.byCategory\n ? Object.entries(stats.byCategory)\n .map(([name, raw]) => ({\n name,\n value: typeof raw === \"number\" ? raw : Number(raw),\n }))\n .filter((slice) => Number.isFinite(slice.value) && slice.value > 0)\n : [];\n\n const decidedCount = (stats?.approvedCount ?? 0) + (stats?.pendingCount ?? 0);\n\n const [loadingMore, setLoadingMore] = useState(false);\n const [canLoadMore, setCanLoadMore] = useState(true);\n\n // Create / edit modal\n const [formOpen, setFormOpen] = useState(false);\n const [editing, setEditing] = useState<ExpenseFieldsFragment | null>(null);\n const [form, setForm] = useState<ExpenseFormState>(emptyForm);\n const [uploadingReceipt, setUploadingReceipt] = useState(false);\n\n // Per-expense review conversation thread\n const [reviewTarget, setReviewTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n\n // Delete confirm\n const [deleteTarget, setDeleteTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n\n // Reject reason\n const [rejectTarget, setRejectTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n const [rejectReason, setRejectReason] = useState(\"\");\n\n // Per-row busy state for status transitions\n const [busyId, setBusyId] = useState<string | null>(null);\n\n const refreshAll = async () => {\n await Promise.all([refetch(), refetchStats()]);\n };\n\n const openCreate = () => {\n setEditing(null);\n setForm({ ...emptyForm, date: todayIso() });\n setFormOpen(true);\n };\n\n const openEdit = (expense: ExpenseFieldsFragment) => {\n setEditing(expense);\n setForm({\n amount: String(expense.amount),\n category: expense.category,\n description: expense.description ?? \"\",\n projectId: expense.projectId ?? \"\",\n date: expense.date ? expense.date.slice(0, 10) : todayIso(),\n receiptUrl: expense.receiptUrl ?? \"\",\n });\n setFormOpen(true);\n };\n\n const handleReceiptUpload = async (file: File) => {\n setUploadingReceipt(true);\n try {\n const { data: folderData } = await apollo.mutate({\n mutation: ENSURE_FOLDER,\n variables: { path: \"/TimeCampus/Receipts\" },\n });\n const folderId = (\n folderData as { ensureFolderByPath?: { id: string } } | null\n )?.ensureFolderByPath?.id;\n if (!folderId) throw new Error(\"Could not resolve upload folder\");\n const uploaded = await uploadBlobToFiles({\n client: apollo,\n blob: file,\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n folderId,\n });\n const { data } = await apollo.query({\n query: GET_FILE_DOWNLOAD_URL,\n variables: { id: uploaded.id, expiresIn: RECEIPT_URL_EXPIRES_IN },\n fetchPolicy: \"no-cache\",\n });\n const url = (data as { getFileDownloadUrl?: string } | null | undefined)\n ?.getFileDownloadUrl;\n if (!url) throw new Error(\"No download URL returned\");\n setForm((f) => ({ ...f, receiptUrl: url }));\n addToast({ title: \"Receipt attached\", variant: \"success\" });\n } catch {\n // Upload is best-effort: never block the modal, just surface the failure.\n addToast({ title: \"Failed to upload receipt\", variant: \"error\" });\n } finally {\n setUploadingReceipt(false);\n }\n };\n\n const closeForm = () => {\n setFormOpen(false);\n setEditing(null);\n };\n\n const handleSubmit = async () => {\n const amount = Number(form.amount);\n if (!form.amount || Number.isNaN(amount) || !form.category.trim()) return;\n const isoDate = new Date(form.date).toISOString();\n try {\n if (editing) {\n await updateExpense({\n variables: {\n id: editing.id,\n workspaceId,\n input: {\n amount,\n category: form.category.trim(),\n description: form.description.trim() || undefined,\n projectId: form.projectId.trim() || undefined,\n date: isoDate,\n receiptUrl: form.receiptUrl || undefined,\n },\n },\n });\n addToast({ title: \"Expense updated\", variant: \"success\" });\n } else {\n await createExpense({\n variables: {\n input: {\n workspaceId,\n amount,\n category: form.category.trim(),\n description: form.description.trim() || undefined,\n projectId: form.projectId.trim() || undefined,\n date: isoDate,\n receiptUrl: form.receiptUrl || undefined,\n },\n },\n });\n addToast({ title: \"Expense added\", variant: \"success\" });\n }\n closeForm();\n await refreshAll();\n } catch {\n addToast({\n title: editing ? \"Failed to update expense\" : \"Failed to add expense\",\n variant: \"error\",\n });\n }\n };\n\n const handleDelete = async () => {\n if (!deleteTarget) return;\n try {\n await deleteExpense({\n variables: { id: deleteTarget.id, workspaceId },\n });\n addToast({ title: \"Expense deleted\", variant: \"success\" });\n setDeleteTarget(null);\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to delete expense\", variant: \"error\" });\n }\n };\n\n const handleSubmitForApproval = async (expense: ExpenseFieldsFragment) => {\n setBusyId(expense.id);\n try {\n await submitExpense({ variables: { id: expense.id, workspaceId } });\n addToast({ title: \"Submitted for approval\", variant: \"success\" });\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to submit expense\", variant: \"error\" });\n } finally {\n setBusyId(null);\n }\n };\n\n const handleApprove = async (expense: ExpenseFieldsFragment) => {\n setBusyId(expense.id);\n try {\n await approveExpense({ variables: { id: expense.id, workspaceId } });\n addToast({ title: \"Expense approved\", variant: \"success\" });\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to approve expense\", variant: \"error\" });\n } finally {\n setBusyId(null);\n }\n };\n\n const handleReject = async () => {\n if (!rejectTarget) return;\n try {\n await rejectExpense({\n variables: {\n id: rejectTarget.id,\n workspaceId,\n reason: rejectReason.trim() || undefined,\n },\n });\n addToast({ title: \"Expense rejected\", variant: \"success\" });\n setRejectTarget(null);\n setRejectReason(\"\");\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to reject expense\", variant: \"error\" });\n }\n };\n\n const handleLoadMore = async () => {\n setLoadingMore(true);\n try {\n const res = await fetchMore({\n variables: {\n workspaceId,\n pagination: { limit: PAGE_SIZE, offset: expenses.length },\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n return {\n ...prev,\n expenses: [...prev.expenses, ...fetchMoreResult.expenses],\n };\n },\n });\n if ((res.data?.expenses?.length ?? 0) < PAGE_SIZE) {\n setCanLoadMore(false);\n }\n } finally {\n setLoadingMore(false);\n }\n };\n\n if (expensesLoading && statsLoading && expenses.length === 0) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (expensesError && statsError) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\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 expense data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const addButton = (\n <button\n onClick={openCreate}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus className=\"h-4 w-4\" />\n Add Expense\n </button>\n );\n\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n purpose=\"Capture project-related costs alongside the hours you log — receipts, categories and approvals in one place — so the bill you send a client reflects the full cost of the work, not just time.\"\n actions={addButton}\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 This Month\"\n value={formatCurrency(stats?.totalAmount ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Pending\"\n value={String(stats?.pendingCount ?? 0)}\n description=\"expenses awaiting approval\"\n />\n <StatCard\n title=\"Approved\"\n value={String(stats?.approvedCount ?? 0)}\n description=\"expenses approved\"\n />\n <StatCard\n title=\"Average\"\n value={formatCurrency(stats?.averageAmount ?? 0)}\n icon={<Receipt className=\"h-5 w-5\" />}\n description=\"per expense\"\n />\n </div>\n\n {expenses.length === 0 && !expensesLoading ? (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No expenses recorded yet\"\n description=\"Add your first expense to track project costs and route them for approval.\"\n action={addButton}\n />\n ) : (\n <>\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <ChartCard\n title=\"Spend by category\"\n description=\"Total tracked spend grouped by category\"\n className=\"lg:col-span-2\"\n >\n <DonutChart\n data={categorySpend}\n centerLabel=\"Total\"\n centerValue={stats?.totalAmount ?? 0}\n valueFormat={(value) => formatCurrency(value, displayCurrency)}\n height={240}\n emptyLabel=\"No categorised spend yet.\"\n ariaLabel=\"Spend by category\"\n />\n </ChartCard>\n <ChartCard\n title=\"Approval progress\"\n description=\"Approved vs. awaiting review\"\n >\n <RadialGauge\n value={stats?.approvedCount ?? 0}\n min={0}\n max={decidedCount > 0 ? decidedCount : 1}\n label=\"Approved\"\n sublabel={`of ${decidedCount} to review`}\n format={(value) => `${Math.round(value)}`}\n height={240}\n ariaLabel=\"Approved expenses share\"\n />\n </ChartCard>\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 {expenses.map((expense: ExpenseFieldsFragment) => {\n const rowBusy = busyId === expense.id;\n const isPending = expense.status === ExpenseStatus.Pending;\n const isRejected = expense.status === ExpenseStatus.Rejected;\n return (\n <div\n key={expense.id}\n className=\"flex flex-col gap-3 p-4 hover:bg-bg-sunken/50 transition-colors sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"flex items-center gap-3\">\n <Receipt className=\"h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {expense.description ?? \"Untitled expense\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {expense.category} ·{\" \"}\n {expense.projectId ?? \"No project\"} ·{\" \"}\n {formatDate(expense.date)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(expense.amount, expense.currency)}\n </p>\n <StatusBadge\n label={expense.status.toLowerCase()}\n status={expense.status.toLowerCase()}\n />\n <div className=\"flex items-center gap-1\">\n {isPending && (\n <>\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => handleApprove(expense)}\n title=\"Approve expense\"\n className=\"rounded-md p-1.5 text-status-success-text hover:bg-status-success-bg disabled:opacity-50\"\n >\n <Check className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => {\n setRejectTarget(expense);\n setRejectReason(\"\");\n }}\n title=\"Reject expense\"\n className=\"rounded-md p-1.5 text-status-error-text hover:bg-status-error-bg disabled:opacity-50\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </>\n )}\n {isRejected && (\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => handleSubmitForApproval(expense)}\n title=\"Resubmit for approval\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken disabled:opacity-50\"\n >\n <Send className=\"h-4 w-4\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setReviewTarget(expense)}\n title=\"Review expense\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken\"\n >\n <MessageSquare className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => openEdit(expense)}\n title=\"Edit expense\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setDeleteTarget(expense)}\n title=\"Delete expense\"\n className=\"rounded-md p-1.5 text-status-error-text hover:bg-status-error-bg\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {canLoadMore && expenses.length >= PAGE_SIZE && (\n <div className=\"mt-4 flex justify-center\">\n <button\n onClick={handleLoadMore}\n disabled={loadingMore}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50 disabled:opacity-50\"\n >\n {loadingMore ? \"Loading...\" : \"Load more\"}\n </button>\n </div>\n )}\n </>\n )}\n\n <Modal\n open={formOpen}\n onClose={closeForm}\n title={editing ? \"Edit Expense\" : \"Add Expense\"}\n description={\n editing\n ? \"Update this expense's details.\"\n : \"Record a project-related cost to track alongside your logged hours.\"\n }\n footer={\n <>\n <button\n onClick={closeForm}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={\n creating ||\n updating ||\n !form.amount ||\n Number.isNaN(Number(form.amount)) ||\n !form.category.trim()\n }\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 || updating\n ? \"Saving...\"\n : editing\n ? \"Save Changes\"\n : \"Add Expense\"}\n </button>\n </>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Amount\n </label>\n <input\n type=\"number\"\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={form.amount}\n onChange={(e) => setForm({ ...form, amount: e.target.value })}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Category\n </label>\n <select\n value={form.category}\n onChange={(e) => setForm({ ...form, category: e.target.value })}\n className={inputClass}\n >\n {CATEGORY_OPTIONS.map((c) => (\n <option key={c} value={c}>\n {c}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n </label>\n <input\n type=\"text\"\n placeholder=\"What was this expense for?\"\n value={form.description}\n onChange={(e) =>\n setForm({ ...form, description: e.target.value })\n }\n className={inputClass}\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Project ID\n </label>\n <input\n type=\"text\"\n placeholder=\"Optional project ID\"\n value={form.projectId}\n onChange={(e) =>\n setForm({ ...form, projectId: e.target.value })\n }\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Date\n </label>\n <input\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n className={inputClass}\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Receipt\n </label>\n <div className=\"mt-1 flex flex-col gap-2\">\n <label\n className={`inline-flex w-fit cursor-pointer 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 uploadingReceipt ? \"opacity-50\" : \"\"\n }`}\n >\n <Upload className=\"h-4 w-4\" />\n {uploadingReceipt ? \"Uploading...\" : \"Upload receipt\"}\n <input\n type=\"file\"\n accept=\"image/*,application/pdf\"\n disabled={uploadingReceipt}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-selecting the same file re-triggers change.\n e.target.value = \"\";\n if (file) void handleReceiptUpload(file);\n }}\n />\n </label>\n {form.receiptUrl && (\n <a\n href={form.receiptUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex w-fit items-center gap-1.5 text-sm font-medium text-action-primary-text/90 underline decoration-border-subtle underline-offset-2 hover:text-action-primary-text\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n View current receipt\n </a>\n )}\n <p className=\"text-xs text-text-secondary\">\n Attach an image or PDF. Uploading is optional and never blocks\n saving the expense.\n </p>\n </div>\n </div>\n </div>\n </Modal>\n\n <Modal\n open={deleteTarget !== null}\n onClose={() => setDeleteTarget(null)}\n title=\"Delete expense?\"\n description={\n deleteTarget\n ? `${formatCurrency(deleteTarget.amount, deleteTarget.currency)} · ${deleteTarget.category} will be removed.`\n : undefined\n }\n size=\"sm\"\n footer={\n <>\n <button\n onClick={() => setDeleteTarget(null)}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleDelete}\n disabled={deleting}\n className=\"rounded-md bg-status-error-bg px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/80 disabled:opacity-50\"\n >\n {deleting ? \"Deleting...\" : \"Delete\"}\n </button>\n </>\n }\n >\n <p className=\"text-sm text-text-secondary\">\n This permanently removes the expense. This action cannot be undone.\n </p>\n </Modal>\n\n <Modal\n open={rejectTarget !== null}\n onClose={() => setRejectTarget(null)}\n title=\"Reject expense\"\n description=\"Let the submitter know why this expense was rejected.\"\n size=\"sm\"\n footer={\n <>\n <button\n onClick={() => setRejectTarget(null)}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleReject}\n disabled={rejecting}\n className=\"rounded-md bg-status-error-bg px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/80 disabled:opacity-50\"\n >\n {rejecting ? \"Rejecting...\" : \"Reject Expense\"}\n </button>\n </>\n }\n >\n <label className=\"block text-sm font-medium text-text-primary\">\n Reason\n </label>\n <textarea\n rows={3}\n placeholder=\"Reason for rejection (optional)\"\n value={rejectReason}\n onChange={(e) => setRejectReason(e.target.value)}\n className={inputClass}\n />\n </Modal>\n\n <Modal\n open={reviewTarget !== null}\n onClose={() => setReviewTarget(null)}\n title=\"Expense review\"\n description={\n reviewTarget\n ? `Discuss ${reviewTarget.description ?? \"this expense\"} with your team.`\n : undefined\n }\n >\n {reviewTarget && <ExpenseReviewThread expense={reviewTarget} />}\n </Modal>\n\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExpenseTrackingPage.js","names":[],"sources":["../../../../src/timecampus/pages/expense-tracking/ExpenseTrackingPage.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport {\n Receipt,\n Plus,\n DollarSign,\n Pencil,\n Trash2,\n Send,\n Check,\n X,\n Upload,\n ExternalLink,\n MessageSquare,\n} from \"lucide-react\";\nimport { gql } from \"@apollo/client\";\nimport { useApolloClient } from \"@apollo/client/react\";\nimport { uploadBlobToFiles } from \"@burdenoff/fe-libs/storage\";\nimport { ContextConversationWidget } from \"@burdenoff/fe-libs/shared\";\nimport { useRegisterPageConversationContext } from \"@burdenoff/fe-libs/shared/providers/shell\";\nimport { PageLayout } from \"../../components/PageLayout\";\nimport { StatCard } from \"../../components/StatCard\";\nimport { EmptyState } from \"../../components/EmptyState\";\nimport { LoadingSkeleton } from \"../../components/LoadingSkeleton\";\nimport { StatusBadge } from \"../../components/StatusBadge\";\nimport { Modal } from \"../../components/Modal\";\nimport { ToastContainer, useToast } from \"../../components/Toast\";\nimport {\n ChartCard,\n DonutChart,\n RadialGauge,\n type DonutSlice,\n} from \"../../components\";\nimport { formatCurrency, formatDate } from \"../../utils/helpers\";\nimport { useTimeCampus } from \"../../providers/TimeCampusProvider\";\nimport {\n useListExpensesQuery,\n useGetExpenseStatsQuery,\n useCreateExpenseMutation,\n useUpdateExpenseMutation,\n useDeleteExpenseMutation,\n useSubmitExpenseForApprovalMutation,\n useApproveExpenseMutation,\n useRejectExpenseMutation,\n type ExpenseFieldsFragment,\n} from \"@/generated/wspace-operations\";\nimport { ExpenseStatus } from \"@/generated/wspace-types\";\n\nconst PAGE_SIZE = 25;\n\nconst CATEGORY_OPTIONS = [\n \"Travel\",\n \"Meals\",\n \"Software\",\n \"Hardware\",\n \"Office\",\n \"Training\",\n \"Other\",\n];\n\nconst inputClass =\n \"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/**\n * Resolves a short-lived preview URL for a just-uploaded receipt (shown only\n * while the create/edit modal is open). The persisted value is the stable\n * `receiptFileId`, NOT this URL — the backend's `receiptDownloadUrl` field\n * resolver mints a fresh presigned URL on every read instead (BOFF-4038:\n * a URL persisted directly used to go dead after wspace-files' 7-day cap).\n */\nconst GET_FILE_DOWNLOAD_URL = gql`\n query TimeCampusExpense_GetFileDownloadUrl($id: ID!, $expiresIn: Int) {\n getFileDownloadUrl(id: $id, expiresIn: $expiresIn)\n }\n`;\n\n// wspace-files requires a real folder id (File.folderId FK); resolve/create a\n// TimeCampus folder rather than passing an empty string.\nconst ENSURE_FOLDER = gql`\n mutation TimeCampusExpense_EnsureFolder($path: String!) {\n ensureFolderByPath(path: $path) {\n id\n }\n }\n`;\n\nconst RECEIPT_PREVIEW_URL_EXPIRES_IN = 3600; // Just for the modal preview link.\n\ninterface ExpenseFormState {\n amount: string;\n category: string;\n description: string;\n projectId: string;\n date: string;\n receiptFileId: string;\n receiptPreviewUrl: string;\n}\n\n/**\n * Child component that mounts the per-expense review conversation thread.\n * Kept as a separate component so `useRegisterPageConversationContext` runs\n * (registering + tearing down the entity context) exactly while the review\n * modal is mounted. The widget self-scopes the thread to this entity and\n * self-guards its own errors, so the existing scalar notes/reason flow is\n * left completely untouched.\n */\nfunction ExpenseReviewThread({ expense }: { expense: ExpenseFieldsFragment }) {\n useRegisterPageConversationContext({\n entityType: \"TIMECAMPUS_EXPENSE\",\n entityId: expense.id,\n contextTitle: `Expense · ${expense.description ?? expense.id}`,\n });\n return <ContextConversationWidget widgetKey=\"expense-review\" />;\n}\n\nfunction todayIso(): string {\n return new Date().toISOString().slice(0, 10);\n}\n\nconst emptyForm: ExpenseFormState = {\n amount: \"\",\n category: CATEGORY_OPTIONS[0],\n description: \"\",\n projectId: \"\",\n date: todayIso(),\n receiptFileId: \"\",\n receiptPreviewUrl: \"\",\n};\n\nexport function ExpenseTrackingPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const { toasts, addToast, dismissToast } = useToast();\n const apollo = useApolloClient();\n\n const {\n data: expensesData,\n loading: expensesLoading,\n error: expensesError,\n refetch,\n fetchMore,\n } = useListExpensesQuery({\n variables: { workspaceId, pagination: { limit: PAGE_SIZE, offset: 0 } },\n notifyOnNetworkStatusChange: true,\n });\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n refetch: refetchStats,\n } = useGetExpenseStatsQuery({\n variables: { workspaceId },\n });\n\n const [createExpense, { loading: creating }] = useCreateExpenseMutation();\n const [updateExpense, { loading: updating }] = useUpdateExpenseMutation();\n const [deleteExpense, { loading: deleting }] = useDeleteExpenseMutation();\n const [submitExpense] = useSubmitExpenseForApprovalMutation();\n const [approveExpense] = useApproveExpenseMutation();\n const [rejectExpense, { loading: rejecting }] = useRejectExpenseMutation();\n\n const expenses = expensesData?.expenses ?? [];\n const stats = statsData?.expenseStats;\n\n // Chart data derived only from data the page already fetches.\n const displayCurrency = expenses[0]?.currency ?? \"USD\";\n\n const categorySpend: DonutSlice[] = stats?.byCategory\n ? Object.entries(stats.byCategory)\n .map(([name, raw]) => ({\n name,\n value: typeof raw === \"number\" ? raw : Number(raw),\n }))\n .filter((slice) => Number.isFinite(slice.value) && slice.value > 0)\n : [];\n\n const decidedCount = (stats?.approvedCount ?? 0) + (stats?.pendingCount ?? 0);\n\n const [loadingMore, setLoadingMore] = useState(false);\n const [canLoadMore, setCanLoadMore] = useState(true);\n\n // Create / edit modal\n const [formOpen, setFormOpen] = useState(false);\n const [editing, setEditing] = useState<ExpenseFieldsFragment | null>(null);\n const [form, setForm] = useState<ExpenseFormState>(emptyForm);\n const [uploadingReceipt, setUploadingReceipt] = useState(false);\n\n // Per-expense review conversation thread\n const [reviewTarget, setReviewTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n\n // Delete confirm\n const [deleteTarget, setDeleteTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n\n // Reject reason\n const [rejectTarget, setRejectTarget] =\n useState<ExpenseFieldsFragment | null>(null);\n const [rejectReason, setRejectReason] = useState(\"\");\n\n // Per-row busy state for status transitions\n const [busyId, setBusyId] = useState<string | null>(null);\n\n const refreshAll = async () => {\n await Promise.all([refetch(), refetchStats()]);\n };\n\n const openCreate = () => {\n setEditing(null);\n setForm({ ...emptyForm, date: todayIso() });\n setFormOpen(true);\n };\n\n const openEdit = (expense: ExpenseFieldsFragment) => {\n setEditing(expense);\n setForm({\n amount: String(expense.amount),\n category: expense.category,\n description: expense.description ?? \"\",\n projectId: expense.projectId ?? \"\",\n date: expense.date ? expense.date.slice(0, 10) : todayIso(),\n receiptFileId: expense.receiptFileId ?? \"\",\n // Resolved fresh from the backend on every read — never a stale stored link.\n receiptPreviewUrl: expense.receiptDownloadUrl ?? \"\",\n });\n setFormOpen(true);\n };\n\n const handleReceiptUpload = async (file: File) => {\n setUploadingReceipt(true);\n try {\n const { data: folderData } = await apollo.mutate({\n mutation: ENSURE_FOLDER,\n variables: { path: \"/TimeCampus/Receipts\" },\n });\n const folderId = (\n folderData as { ensureFolderByPath?: { id: string } } | null\n )?.ensureFolderByPath?.id;\n if (!folderId) throw new Error(\"Could not resolve upload folder\");\n const uploaded = await uploadBlobToFiles({\n client: apollo,\n blob: file,\n filename: file.name,\n mimeType: file.type || \"application/octet-stream\",\n folderId,\n });\n // Persist the stable File id (BOFF-4038) — never a presigned URL, which\n // would go dead after wspace-files' 7-day cap. Only fetch a URL here for\n // the modal's own \"view current receipt\" preview link.\n const { data } = await apollo.query({\n query: GET_FILE_DOWNLOAD_URL,\n variables: {\n id: uploaded.id,\n expiresIn: RECEIPT_PREVIEW_URL_EXPIRES_IN,\n },\n fetchPolicy: \"no-cache\",\n });\n const url = (data as { getFileDownloadUrl?: string } | null | undefined)\n ?.getFileDownloadUrl;\n setForm((f) => ({\n ...f,\n receiptFileId: uploaded.id,\n receiptPreviewUrl: url ?? \"\",\n }));\n addToast({ title: \"Receipt attached\", variant: \"success\" });\n } catch {\n // Upload is best-effort: never block the modal, just surface the failure.\n addToast({ title: \"Failed to upload receipt\", variant: \"error\" });\n } finally {\n setUploadingReceipt(false);\n }\n };\n\n const closeForm = () => {\n setFormOpen(false);\n setEditing(null);\n };\n\n const handleSubmit = async () => {\n const amount = Number(form.amount);\n if (!form.amount || Number.isNaN(amount) || !form.category.trim()) return;\n const isoDate = new Date(form.date).toISOString();\n try {\n if (editing) {\n await updateExpense({\n variables: {\n id: editing.id,\n workspaceId,\n input: {\n amount,\n category: form.category.trim(),\n description: form.description.trim() || undefined,\n projectId: form.projectId.trim() || undefined,\n date: isoDate,\n receiptFileId: form.receiptFileId || undefined,\n },\n },\n });\n addToast({ title: \"Expense updated\", variant: \"success\" });\n } else {\n await createExpense({\n variables: {\n input: {\n workspaceId,\n amount,\n category: form.category.trim(),\n description: form.description.trim() || undefined,\n projectId: form.projectId.trim() || undefined,\n date: isoDate,\n receiptFileId: form.receiptFileId || undefined,\n },\n },\n });\n addToast({ title: \"Expense added\", variant: \"success\" });\n }\n closeForm();\n await refreshAll();\n } catch {\n addToast({\n title: editing ? \"Failed to update expense\" : \"Failed to add expense\",\n variant: \"error\",\n });\n }\n };\n\n const handleDelete = async () => {\n if (!deleteTarget) return;\n try {\n await deleteExpense({\n variables: { id: deleteTarget.id, workspaceId },\n });\n addToast({ title: \"Expense deleted\", variant: \"success\" });\n setDeleteTarget(null);\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to delete expense\", variant: \"error\" });\n }\n };\n\n const handleSubmitForApproval = async (expense: ExpenseFieldsFragment) => {\n setBusyId(expense.id);\n try {\n await submitExpense({ variables: { id: expense.id, workspaceId } });\n addToast({ title: \"Submitted for approval\", variant: \"success\" });\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to submit expense\", variant: \"error\" });\n } finally {\n setBusyId(null);\n }\n };\n\n const handleApprove = async (expense: ExpenseFieldsFragment) => {\n setBusyId(expense.id);\n try {\n await approveExpense({ variables: { id: expense.id, workspaceId } });\n addToast({ title: \"Expense approved\", variant: \"success\" });\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to approve expense\", variant: \"error\" });\n } finally {\n setBusyId(null);\n }\n };\n\n const handleReject = async () => {\n if (!rejectTarget) return;\n try {\n await rejectExpense({\n variables: {\n id: rejectTarget.id,\n workspaceId,\n reason: rejectReason.trim() || undefined,\n },\n });\n addToast({ title: \"Expense rejected\", variant: \"success\" });\n setRejectTarget(null);\n setRejectReason(\"\");\n await refreshAll();\n } catch {\n addToast({ title: \"Failed to reject expense\", variant: \"error\" });\n }\n };\n\n const handleLoadMore = async () => {\n setLoadingMore(true);\n try {\n const res = await fetchMore({\n variables: {\n workspaceId,\n pagination: { limit: PAGE_SIZE, offset: expenses.length },\n },\n updateQuery: (prev, { fetchMoreResult }) => {\n if (!fetchMoreResult) return prev;\n return {\n ...prev,\n expenses: [...prev.expenses, ...fetchMoreResult.expenses],\n };\n },\n });\n if ((res.data?.expenses?.length ?? 0) < PAGE_SIZE) {\n setCanLoadMore(false);\n }\n } finally {\n setLoadingMore(false);\n }\n };\n\n if (expensesLoading && statsLoading && expenses.length === 0) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n >\n <LoadingSkeleton variant=\"list\" count={4} />\n </PageLayout>\n );\n }\n\n if (expensesError && statsError) {\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\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 expense data. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const addButton = (\n <button\n onClick={openCreate}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Plus className=\"h-4 w-4\" />\n Add Expense\n </button>\n );\n\n return (\n <PageLayout\n title=\"Expense Tracking\"\n description=\"Track and manage work expenses\"\n purpose=\"Capture project-related costs alongside the hours you log — receipts, categories and approvals in one place — so the bill you send a client reflects the full cost of the work, not just time.\"\n actions={addButton}\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 This Month\"\n value={formatCurrency(stats?.totalAmount ?? 0)}\n icon={<DollarSign className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Pending\"\n value={String(stats?.pendingCount ?? 0)}\n description=\"expenses awaiting approval\"\n />\n <StatCard\n title=\"Approved\"\n value={String(stats?.approvedCount ?? 0)}\n description=\"expenses approved\"\n />\n <StatCard\n title=\"Average\"\n value={formatCurrency(stats?.averageAmount ?? 0)}\n icon={<Receipt className=\"h-5 w-5\" />}\n description=\"per expense\"\n />\n </div>\n\n {expenses.length === 0 && !expensesLoading ? (\n <EmptyState\n illustration=\"empty-data\"\n title=\"No expenses recorded yet\"\n description=\"Add your first expense to track project costs and route them for approval.\"\n action={addButton}\n />\n ) : (\n <>\n <div className=\"grid grid-cols-1 gap-4 lg:grid-cols-3\">\n <ChartCard\n title=\"Spend by category\"\n description=\"Total tracked spend grouped by category\"\n className=\"lg:col-span-2\"\n >\n <DonutChart\n data={categorySpend}\n centerLabel=\"Total\"\n centerValue={stats?.totalAmount ?? 0}\n valueFormat={(value) => formatCurrency(value, displayCurrency)}\n height={240}\n emptyLabel=\"No categorised spend yet.\"\n ariaLabel=\"Spend by category\"\n />\n </ChartCard>\n <ChartCard\n title=\"Approval progress\"\n description=\"Approved vs. awaiting review\"\n >\n <RadialGauge\n value={stats?.approvedCount ?? 0}\n min={0}\n max={decidedCount > 0 ? decidedCount : 1}\n label=\"Approved\"\n sublabel={`of ${decidedCount} to review`}\n format={(value) => `${Math.round(value)}`}\n height={240}\n ariaLabel=\"Approved expenses share\"\n />\n </ChartCard>\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 {expenses.map((expense: ExpenseFieldsFragment) => {\n const rowBusy = busyId === expense.id;\n const isPending = expense.status === ExpenseStatus.Pending;\n const isRejected = expense.status === ExpenseStatus.Rejected;\n return (\n <div\n key={expense.id}\n className=\"flex flex-col gap-3 p-4 hover:bg-bg-sunken/50 transition-colors sm:flex-row sm:items-center sm:justify-between\"\n >\n <div className=\"flex items-center gap-3\">\n <Receipt className=\"h-5 w-5 shrink-0 text-text-secondary\" />\n <div>\n <p className=\"text-sm font-medium text-text-primary\">\n {expense.description ?? \"Untitled expense\"}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {expense.category} ·{\" \"}\n {expense.projectId ?? \"No project\"} ·{\" \"}\n {formatDate(expense.date)}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <p className=\"text-sm font-medium text-text-primary\">\n {formatCurrency(expense.amount, expense.currency)}\n </p>\n <StatusBadge\n label={expense.status.toLowerCase()}\n status={expense.status.toLowerCase()}\n />\n <div className=\"flex items-center gap-1\">\n {isPending && (\n <>\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => handleApprove(expense)}\n title=\"Approve expense\"\n className=\"rounded-md p-1.5 text-status-success-text hover:bg-status-success-bg disabled:opacity-50\"\n >\n <Check className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => {\n setRejectTarget(expense);\n setRejectReason(\"\");\n }}\n title=\"Reject expense\"\n className=\"rounded-md p-1.5 text-status-error-text hover:bg-status-error-bg disabled:opacity-50\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </>\n )}\n {isRejected && (\n <button\n type=\"button\"\n disabled={rowBusy}\n onClick={() => handleSubmitForApproval(expense)}\n title=\"Resubmit for approval\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken disabled:opacity-50\"\n >\n <Send className=\"h-4 w-4\" />\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setReviewTarget(expense)}\n title=\"Review expense\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken\"\n >\n <MessageSquare className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => openEdit(expense)}\n title=\"Edit expense\"\n className=\"rounded-md p-1.5 text-text-secondary hover:bg-bg-sunken\"\n >\n <Pencil className=\"h-4 w-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => setDeleteTarget(expense)}\n title=\"Delete expense\"\n className=\"rounded-md p-1.5 text-status-error-text hover:bg-status-error-bg\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n\n {canLoadMore && expenses.length >= PAGE_SIZE && (\n <div className=\"mt-4 flex justify-center\">\n <button\n onClick={handleLoadMore}\n disabled={loadingMore}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50 disabled:opacity-50\"\n >\n {loadingMore ? \"Loading...\" : \"Load more\"}\n </button>\n </div>\n )}\n </>\n )}\n\n <Modal\n open={formOpen}\n onClose={closeForm}\n title={editing ? \"Edit Expense\" : \"Add Expense\"}\n description={\n editing\n ? \"Update this expense's details.\"\n : \"Record a project-related cost to track alongside your logged hours.\"\n }\n footer={\n <>\n <button\n onClick={closeForm}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleSubmit}\n disabled={\n creating ||\n updating ||\n !form.amount ||\n Number.isNaN(Number(form.amount)) ||\n !form.category.trim()\n }\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 || updating\n ? \"Saving...\"\n : editing\n ? \"Save Changes\"\n : \"Add Expense\"}\n </button>\n </>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Amount\n </label>\n <input\n type=\"number\"\n min={0}\n step=\"0.01\"\n placeholder=\"0.00\"\n value={form.amount}\n onChange={(e) => setForm({ ...form, amount: e.target.value })}\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Category\n </label>\n <select\n value={form.category}\n onChange={(e) => setForm({ ...form, category: e.target.value })}\n className={inputClass}\n >\n {CATEGORY_OPTIONS.map((c) => (\n <option key={c} value={c}>\n {c}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Description\n </label>\n <input\n type=\"text\"\n placeholder=\"What was this expense for?\"\n value={form.description}\n onChange={(e) =>\n setForm({ ...form, description: e.target.value })\n }\n className={inputClass}\n />\n </div>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Project ID\n </label>\n <input\n type=\"text\"\n placeholder=\"Optional project ID\"\n value={form.projectId}\n onChange={(e) =>\n setForm({ ...form, projectId: e.target.value })\n }\n className={inputClass}\n />\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Date\n </label>\n <input\n type=\"date\"\n value={form.date}\n onChange={(e) => setForm({ ...form, date: e.target.value })}\n className={inputClass}\n />\n </div>\n </div>\n <div>\n <label className=\"block text-sm font-medium text-text-primary\">\n Receipt\n </label>\n <div className=\"mt-1 flex flex-col gap-2\">\n <label\n className={`inline-flex w-fit cursor-pointer 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 uploadingReceipt ? \"opacity-50\" : \"\"\n }`}\n >\n <Upload className=\"h-4 w-4\" />\n {uploadingReceipt ? \"Uploading...\" : \"Upload receipt\"}\n <input\n type=\"file\"\n accept=\"image/*,application/pdf\"\n disabled={uploadingReceipt}\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n // Reset the input so re-selecting the same file re-triggers change.\n e.target.value = \"\";\n if (file) void handleReceiptUpload(file);\n }}\n />\n </label>\n {form.receiptFileId && form.receiptPreviewUrl && (\n <a\n href={form.receiptPreviewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex w-fit items-center gap-1.5 text-sm font-medium text-action-primary-text/90 underline decoration-border-subtle underline-offset-2 hover:text-action-primary-text\"\n >\n <ExternalLink className=\"h-3.5 w-3.5\" />\n View current receipt\n </a>\n )}\n <p className=\"text-xs text-text-secondary\">\n Attach an image or PDF. Uploading is optional and never blocks\n saving the expense.\n </p>\n </div>\n </div>\n </div>\n </Modal>\n\n <Modal\n open={deleteTarget !== null}\n onClose={() => setDeleteTarget(null)}\n title=\"Delete expense?\"\n description={\n deleteTarget\n ? `${formatCurrency(deleteTarget.amount, deleteTarget.currency)} · ${deleteTarget.category} will be removed.`\n : undefined\n }\n size=\"sm\"\n footer={\n <>\n <button\n onClick={() => setDeleteTarget(null)}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleDelete}\n disabled={deleting}\n className=\"rounded-md bg-status-error-bg px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/80 disabled:opacity-50\"\n >\n {deleting ? \"Deleting...\" : \"Delete\"}\n </button>\n </>\n }\n >\n <p className=\"text-sm text-text-secondary\">\n This permanently removes the expense. This action cannot be undone.\n </p>\n </Modal>\n\n <Modal\n open={rejectTarget !== null}\n onClose={() => setRejectTarget(null)}\n title=\"Reject expense\"\n description=\"Let the submitter know why this expense was rejected.\"\n size=\"sm\"\n footer={\n <>\n <button\n onClick={() => setRejectTarget(null)}\n className=\"rounded-md border border-border-subtle px-4 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken/50\"\n >\n Cancel\n </button>\n <button\n onClick={handleReject}\n disabled={rejecting}\n className=\"rounded-md bg-status-error-bg px-4 py-2 text-sm font-medium text-status-error-text hover:bg-status-error-bg/80 disabled:opacity-50\"\n >\n {rejecting ? \"Rejecting...\" : \"Reject Expense\"}\n </button>\n </>\n }\n >\n <label className=\"block text-sm font-medium text-text-primary\">\n Reason\n </label>\n <textarea\n rows={3}\n placeholder=\"Reason for rejection (optional)\"\n value={rejectReason}\n onChange={(e) => setRejectReason(e.target.value)}\n className={inputClass}\n />\n </Modal>\n\n <Modal\n open={reviewTarget !== null}\n onClose={() => setReviewTarget(null)}\n title=\"Expense review\"\n description={\n reviewTarget\n ? `Discuss ${reviewTarget.description ?? \"this expense\"} with your team.`\n : undefined\n }\n >\n {reviewTarget && <ExpenseReviewThread expense={reviewTarget} />}\n </Modal>\n\n <ToastContainer toasts={toasts} onDismiss={dismissToast} />\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/team/TeamAnalyticsPage.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"TeamAnalyticsPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/team/TeamAnalyticsPage.tsx"],"names":[],"mappings":"AAkCA,wBAAgB,iBAAiB,gCA0PhC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useTimeCampus as e, useTimeCampusNavigate as t } from "../../providers/TimeCampusProvider.js";
|
|
2
2
|
import { StatCard as n } from "../../components/StatCard.js";
|
|
3
3
|
import { LoadingSkeleton as r } from "../../components/LoadingSkeleton.js";
|
|
4
|
-
import {
|
|
4
|
+
import { useGetTeamWorkPatternSummaryQuery as i, useGetTimeEntryStatsQuery as a } from "../../../generated/wspace-operations.js";
|
|
5
5
|
import { PageLayout as o } from "../../components/PageLayout.js";
|
|
6
6
|
import { StatusBadge as s } from "../../components/StatusBadge.js";
|
|
7
7
|
import { ChartCard as c } from "../../components/ChartCard.js";
|
|
@@ -29,7 +29,7 @@ function S() {
|
|
|
29
29
|
className: "inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
|
|
30
30
|
children: [/* @__PURE__ */ _(g, { className: "h-4 w-4" }), "View Members"]
|
|
31
31
|
})]
|
|
32
|
-
}), { data: T, loading: E, error: D } =
|
|
32
|
+
}), { data: T, loading: E, error: D } = a({ skip: !S }), { data: O, loading: k } = i({ skip: !S }), A = T?.timeEntryStats, j = O?.teamWorkPatternSummary;
|
|
33
33
|
if (E || k) return /* @__PURE__ */ _(o, {
|
|
34
34
|
title: "Team Analytics",
|
|
35
35
|
description: "Team performance insights and metrics",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/team/TeamAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Users, Clock, TrendingUp, Lightbulb } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport {\n PageLayout,\n StatCard,\n ChartCard,\n StatusBadge,\n LoadingSkeleton,\n BarsChart,\n DonutChart,\n RadialGauge,\n} from \"../../components\";\nimport {\n useTimeCampus,\n useTimeCampusNavigate,\n} from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetWorkPatternSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nconst formatHrs = (v: number): string =>\n `${Number.isInteger(v) ? v : v.toFixed(1)}h`;\n\nconst impactVariant = (\n impact?: string | null,\n): \"success\" | \"warning\" | \"info\" | \"muted\" => {\n const value = (impact ?? \"\").toLowerCase();\n if (value.includes(\"high\") || value.includes(\"critical\")) return \"warning\";\n if (value.includes(\"low\")) return \"muted\";\n if (value.includes(\"positive\") || value.includes(\"good\")) return \"success\";\n return \"info\";\n};\n\nexport function TeamAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const navigate = useTimeCampusNavigate();\n\n const analyticsActions = (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => navigate(\"/team\")}\n 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 >\n Team Overview\n </button>\n <button\n onClick={() => navigate(\"/team/members\")}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Users className=\"h-4 w-4\" />\n View Members\n </button>\n </div>\n );\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n const { data: patternData, loading: patternLoading } =\n useGetWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const pattern = patternData?.workPatternSummary;\n\n if (statsLoading || patternLoading) {\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\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 analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalHours = stats?.totalHours ?? 0;\n const billableHours = stats?.billableHours ?? 0;\n const nonBillableHours = Math.max(0, totalHours - billableHours);\n const billablePercent =\n totalHours > 0 ? Math.round((billableHours / totalHours) * 100) : 0;\n\n const avgFocus = pattern?.averageFocusHours ?? 0;\n const avgMeeting = pattern?.averageMeetingHours ?? 0;\n const avgProductivity = pattern?.averageProductivity ?? 0;\n const insights = pattern?.insights ?? [];\n\n // Aggregate team composition — never individual — from the fetched stats.\n const distributionData = [\n {\n label: \"Logged\",\n billable: Math.round(billableHours * 10) / 10,\n nonBillable: Math.round(nonBillableHours * 10) / 10,\n },\n ];\n\n // Focus vs meeting balance from the work-pattern summary (avg per person).\n const balanceData = [\n { name: \"Deep Work / Focus\", value: Math.round(avgFocus * 10) / 10 },\n { name: \"Meetings\", value: Math.round(avgMeeting * 10) / 10 },\n ];\n\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\n purpose=\"Compare how your team works — hours by member, productive days, focus versus meeting time — so you can rebalance workload, recognise top contributors, and fix the patterns that slow everyone down.\"\n actions={analyticsActions}\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=\"Total Team Hours\"\n value={formatHrs(Math.round(totalHours))}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Billable Hours\"\n value={formatHrs(Math.round(billableHours))}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trend={{ value: billablePercent, label: \"billable rate\" }}\n />\n <StatCard\n title=\"Avg Productivity\"\n value={`${Math.round(avgProductivity)}%`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n <StatCard\n title=\"Meeting Load\"\n value={formatHrs(avgMeeting)}\n icon={<Users className=\"h-5 w-5\" />}\n description=\"Avg / person — the true cost of meetings\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <ChartCard\n title=\"Team Time Distribution\"\n description=\"All data aggregate, not individual.\"\n >\n <BarsChart\n data={distributionData}\n xKey=\"label\"\n orientation=\"horizontal\"\n stacked\n height={150}\n categoryWidth={72}\n valueFormat={formatHrs}\n series={[\n { key: \"billable\", label: \"Billable\" },\n { key: \"nonBillable\", label: \"Non-billable\" },\n ]}\n emptyLabel=\"No logged hours yet\"\n />\n <p className=\"mt-2 text-xs text-text-secondary\">\n {billablePercent}% of {formatHrs(Math.round(totalHours))} logged\n is billable.\n </p>\n </ChartCard>\n\n <ChartCard\n title=\"Focus vs Meeting Balance\"\n description=\"Average deep-work versus meeting time per person.\"\n >\n <DonutChart\n data={balanceData}\n centerValue={Math.round((avgFocus + avgMeeting) * 10) / 10}\n centerLabel=\"Avg / person\"\n valueFormat={formatHrs}\n height={220}\n emptyLabel=\"No work-pattern data yet\"\n />\n </ChartCard>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <ChartCard\n title=\"Team Productivity\"\n description=\"Aggregate productivity score across the team.\"\n >\n <RadialGauge\n value={Math.round(avgProductivity)}\n min={0}\n max={100}\n label=\"Productivity\"\n sublabel={\n pattern?.mostProductiveDay\n ? `Peak day: ${pattern.mostProductiveDay}`\n : undefined\n }\n format={(v) => `${Math.round(v)}%`}\n height={220}\n />\n <div className=\"mt-4 flex flex-wrap items-center justify-center gap-2\">\n {pattern?.mostProductiveDay && (\n <StatusBadge\n variant=\"success\"\n label={`Most productive: ${pattern.mostProductiveDay}`}\n />\n )}\n {pattern?.leastProductiveDay && (\n <StatusBadge\n variant=\"muted\"\n label={`Quietest: ${pattern.leastProductiveDay}`}\n />\n )}\n </div>\n </ChartCard>\n\n <GlassCard treatment=\"glass\" glow className=\"p-4 sm:p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Team Insights\n </h3>\n </div>\n {insights.length === 0 ? (\n <div className=\"flex h-40 items-center justify-center rounded-lg border border-border-subtle bg-bg-sunken/30 text-center\">\n <p className=\"max-w-xs text-sm text-text-secondary\">\n Insights appear here as your team logs more work patterns.\n </p>\n </div>\n ) : (\n <ul className=\"space-y-3\">\n {insights.map(\n (insight: (typeof insights)[number], index: number) => (\n <li\n key={`${insight.type}-${index}`}\n className=\"rounded-lg border border-border-subtle bg-bg-surface/40 p-3\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm font-medium text-text-primary\">\n {insight.title}\n </p>\n {insight.impact && (\n <StatusBadge\n variant={impactVariant(insight.impact)}\n label={insight.impact}\n />\n )}\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {insight.description}\n </p>\n {insight.recommendation && (\n <p className=\"mt-2 text-xs text-primary\">\n {insight.recommendation}\n </p>\n )}\n </li>\n ),\n )}\n </ul>\n )}\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TeamAnalyticsPage.js","names":[],"sources":["../../../../src/timecampus/pages/team/TeamAnalyticsPage.tsx"],"sourcesContent":["import { BarChart3, Users, Clock, TrendingUp, Lightbulb } from \"lucide-react\";\nimport { GlassCard } from \"@burdenoff/fe-libs/ui\";\nimport {\n PageLayout,\n StatCard,\n ChartCard,\n StatusBadge,\n LoadingSkeleton,\n BarsChart,\n DonutChart,\n RadialGauge,\n} from \"../../components\";\nimport {\n useTimeCampus,\n useTimeCampusNavigate,\n} from \"../../providers/TimeCampusProvider\";\nimport {\n useGetTimeEntryStatsQuery,\n useGetTeamWorkPatternSummaryQuery,\n} from \"@/generated/wspace-operations\";\n\nconst formatHrs = (v: number): string =>\n `${Number.isInteger(v) ? v : v.toFixed(1)}h`;\n\nconst impactVariant = (\n impact?: string | null,\n): \"success\" | \"warning\" | \"info\" | \"muted\" => {\n const value = (impact ?? \"\").toLowerCase();\n if (value.includes(\"high\") || value.includes(\"critical\")) return \"warning\";\n if (value.includes(\"low\")) return \"muted\";\n if (value.includes(\"positive\") || value.includes(\"good\")) return \"success\";\n return \"info\";\n};\n\nexport function TeamAnalyticsPage() {\n const { workspaceId = \"\" } = useTimeCampus();\n const navigate = useTimeCampusNavigate();\n\n const analyticsActions = (\n <div className=\"flex items-center gap-2\">\n <button\n onClick={() => navigate(\"/team\")}\n 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 >\n Team Overview\n </button>\n <button\n onClick={() => navigate(\"/team/members\")}\n className=\"inline-flex items-center gap-1.5 rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n <Users className=\"h-4 w-4\" />\n View Members\n </button>\n </div>\n );\n\n const {\n data: statsData,\n loading: statsLoading,\n error: statsError,\n } = useGetTimeEntryStatsQuery({\n skip: !workspaceId,\n });\n\n // Team-wide (BOFF-4037): aggregates every active workspace member, never\n // just the calling actor — see workPatternSummary for the self-scoped\n // equivalent used by the personal dashboard.\n const { data: patternData, loading: patternLoading } =\n useGetTeamWorkPatternSummaryQuery({\n skip: !workspaceId,\n });\n\n const stats = statsData?.timeEntryStats;\n const pattern = patternData?.teamWorkPatternSummary;\n\n if (statsLoading || patternLoading) {\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\n >\n <LoadingSkeleton variant=\"card\" count={4} />\n </PageLayout>\n );\n }\n\n if (statsError) {\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\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 analytics. Please try again later.\n </div>\n </PageLayout>\n );\n }\n\n const totalHours = stats?.totalHours ?? 0;\n const billableHours = stats?.billableHours ?? 0;\n const nonBillableHours = Math.max(0, totalHours - billableHours);\n const billablePercent =\n totalHours > 0 ? Math.round((billableHours / totalHours) * 100) : 0;\n\n const avgFocus = pattern?.averageFocusHours ?? 0;\n const avgMeeting = pattern?.averageMeetingHours ?? 0;\n const avgProductivity = pattern?.averageProductivity ?? 0;\n const insights = pattern?.insights ?? [];\n\n // Aggregate team composition — never individual — from the fetched stats.\n const distributionData = [\n {\n label: \"Logged\",\n billable: Math.round(billableHours * 10) / 10,\n nonBillable: Math.round(nonBillableHours * 10) / 10,\n },\n ];\n\n // Focus vs meeting balance from the work-pattern summary (avg per person).\n const balanceData = [\n { name: \"Deep Work / Focus\", value: Math.round(avgFocus * 10) / 10 },\n { name: \"Meetings\", value: Math.round(avgMeeting * 10) / 10 },\n ];\n\n return (\n <PageLayout\n title=\"Team Analytics\"\n description=\"Team performance insights and metrics\"\n purpose=\"Compare how your team works — hours by member, productive days, focus versus meeting time — so you can rebalance workload, recognise top contributors, and fix the patterns that slow everyone down.\"\n actions={analyticsActions}\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=\"Total Team Hours\"\n value={formatHrs(Math.round(totalHours))}\n icon={<Clock className=\"h-5 w-5\" />}\n />\n <StatCard\n title=\"Billable Hours\"\n value={formatHrs(Math.round(billableHours))}\n icon={<TrendingUp className=\"h-5 w-5\" />}\n trend={{ value: billablePercent, label: \"billable rate\" }}\n />\n <StatCard\n title=\"Avg Productivity\"\n value={`${Math.round(avgProductivity)}%`}\n icon={<BarChart3 className=\"h-5 w-5\" />}\n iconBgColor=\"bg-status-success-bg text-status-success-text\"\n />\n <StatCard\n title=\"Meeting Load\"\n value={formatHrs(avgMeeting)}\n icon={<Users className=\"h-5 w-5\" />}\n description=\"Avg / person — the true cost of meetings\"\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <ChartCard\n title=\"Team Time Distribution\"\n description=\"All data aggregate, not individual.\"\n >\n <BarsChart\n data={distributionData}\n xKey=\"label\"\n orientation=\"horizontal\"\n stacked\n height={150}\n categoryWidth={72}\n valueFormat={formatHrs}\n series={[\n { key: \"billable\", label: \"Billable\" },\n { key: \"nonBillable\", label: \"Non-billable\" },\n ]}\n emptyLabel=\"No logged hours yet\"\n />\n <p className=\"mt-2 text-xs text-text-secondary\">\n {billablePercent}% of {formatHrs(Math.round(totalHours))} logged\n is billable.\n </p>\n </ChartCard>\n\n <ChartCard\n title=\"Focus vs Meeting Balance\"\n description=\"Average deep-work versus meeting time per person.\"\n >\n <DonutChart\n data={balanceData}\n centerValue={Math.round((avgFocus + avgMeeting) * 10) / 10}\n centerLabel=\"Avg / person\"\n valueFormat={formatHrs}\n height={220}\n emptyLabel=\"No work-pattern data yet\"\n />\n </ChartCard>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-2\">\n <ChartCard\n title=\"Team Productivity\"\n description=\"Aggregate productivity score across the team.\"\n >\n <RadialGauge\n value={Math.round(avgProductivity)}\n min={0}\n max={100}\n label=\"Productivity\"\n sublabel={\n pattern?.mostProductiveDay\n ? `Peak day: ${pattern.mostProductiveDay}`\n : undefined\n }\n format={(v) => `${Math.round(v)}%`}\n height={220}\n />\n <div className=\"mt-4 flex flex-wrap items-center justify-center gap-2\">\n {pattern?.mostProductiveDay && (\n <StatusBadge\n variant=\"success\"\n label={`Most productive: ${pattern.mostProductiveDay}`}\n />\n )}\n {pattern?.leastProductiveDay && (\n <StatusBadge\n variant=\"muted\"\n label={`Quietest: ${pattern.leastProductiveDay}`}\n />\n )}\n </div>\n </ChartCard>\n\n <GlassCard treatment=\"glass\" glow className=\"p-4 sm:p-6\">\n <div className=\"mb-4 flex items-center gap-2\">\n <Lightbulb className=\"h-5 w-5 text-primary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n Team Insights\n </h3>\n </div>\n {insights.length === 0 ? (\n <div className=\"flex h-40 items-center justify-center rounded-lg border border-border-subtle bg-bg-sunken/30 text-center\">\n <p className=\"max-w-xs text-sm text-text-secondary\">\n Insights appear here as your team logs more work patterns.\n </p>\n </div>\n ) : (\n <ul className=\"space-y-3\">\n {insights.map(\n (insight: (typeof insights)[number], index: number) => (\n <li\n key={`${insight.type}-${index}`}\n className=\"rounded-lg border border-border-subtle bg-bg-surface/40 p-3\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <p className=\"text-sm font-medium text-text-primary\">\n {insight.title}\n </p>\n {insight.impact && (\n <StatusBadge\n variant={impactVariant(insight.impact)}\n label={insight.impact}\n />\n )}\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {insight.description}\n </p>\n {insight.recommendation && (\n <p className=\"mt-2 text-xs text-primary\">\n {insight.recommendation}\n </p>\n )}\n </li>\n ),\n )}\n </ul>\n )}\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamActivityPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"TeamActivityPage.d.ts","sourceRoot":"","sources":["../../../../src/timecampus/pages/team-activity/TeamActivityPage.tsx"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,gCAwP/B"}
|