@open-mercato/core 0.7.1-develop.7178.1.ab93fbaf4e → 0.7.1-develop.7180.1.9717fbbb43
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/.turbo/turbo-build.log +2 -2
- package/dist/generated/entities/staff_time_entry/index.js +14 -0
- package/dist/generated/entities/staff_time_entry/index.js.map +2 -2
- package/dist/generated/entities/staff_time_entry_tag/index.js +15 -0
- package/dist/generated/entities/staff_time_entry_tag/index.js.map +7 -0
- package/dist/generated/entities/staff_time_project/index.js +16 -0
- package/dist/generated/entities/staff_time_project/index.js.map +2 -2
- package/dist/generated/entities/staff_time_report/index.js +57 -0
- package/dist/generated/entities/staff_time_report/index.js.map +7 -0
- package/dist/generated/entities/staff_time_report_entry/index.js +27 -0
- package/dist/generated/entities/staff_time_report_entry/index.js.map +7 -0
- package/dist/generated/entities/staff_time_report_event/index.js +21 -0
- package/dist/generated/entities/staff_time_report_event/index.js.map +7 -0
- package/dist/generated/entities/staff_time_report_project/index.js +15 -0
- package/dist/generated/entities/staff_time_report_project/index.js.map +7 -0
- package/dist/generated/entities/staff_time_tag/index.js +21 -0
- package/dist/generated/entities/staff_time_tag/index.js.map +7 -0
- package/dist/generated/entities/staff_time_task/index.js +37 -0
- package/dist/generated/entities/staff_time_task/index.js.map +7 -0
- package/dist/generated/entities/staff_time_task_comment/index.js +21 -0
- package/dist/generated/entities/staff_time_task_comment/index.js.map +7 -0
- package/dist/generated/entities/staff_time_task_status/index.js +29 -0
- package/dist/generated/entities/staff_time_task_status/index.js.map +7 -0
- package/dist/generated/entities/staff_time_task_tag/index.js +15 -0
- package/dist/generated/entities/staff_time_task_tag/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +11 -1
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +149 -0
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/timesheetFixtures.js +7 -0
- package/dist/helpers/integration/timesheetFixtures.js.map +2 -2
- package/dist/modules/auth/cli.js +16 -0
- package/dist/modules/auth/cli.js.map +2 -2
- package/dist/modules/auth/lib/backendChrome.js +1 -0
- package/dist/modules/auth/lib/backendChrome.js.map +2 -2
- package/dist/modules/customer_accounts/lib/customerRoleAcls.js +44 -0
- package/dist/modules/customer_accounts/lib/customerRoleAcls.js.map +7 -0
- package/dist/modules/customer_accounts/setup.js +1 -28
- package/dist/modules/customer_accounts/setup.js.map +2 -2
- package/dist/modules/data_sync/api/options.js +2 -0
- package/dist/modules/data_sync/api/options.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +39 -17
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/lib/start-controls.js +42 -0
- package/dist/modules/data_sync/lib/start-controls.js.map +7 -0
- package/dist/modules/staff/acl.js +9 -1
- package/dist/modules/staff/acl.js.map +2 -2
- package/dist/modules/staff/ai-agents.js +142 -0
- package/dist/modules/staff/ai-agents.js.map +7 -0
- package/dist/modules/staff/ai-tools/time-tracking-pack.js +348 -0
- package/dist/modules/staff/ai-tools/time-tracking-pack.js.map +7 -0
- package/dist/modules/staff/ai-tools/types.js +54 -0
- package/dist/modules/staff/ai-tools/types.js.map +7 -0
- package/dist/modules/staff/ai-tools.js +8 -0
- package/dist/modules/staff/ai-tools.js.map +7 -0
- package/dist/modules/staff/analytics.js +84 -1
- package/dist/modules/staff/analytics.js.map +2 -2
- package/dist/modules/staff/api/guards.js +37 -3
- package/dist/modules/staff/api/guards.js.map +2 -2
- package/dist/modules/staff/api/leave-requests/accept/route.js +1 -3
- package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
- package/dist/modules/staff/api/leave-requests/reject/route.js +1 -3
- package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
- package/dist/modules/staff/api/portal/time-reports/[id]/route.js +131 -0
- package/dist/modules/staff/api/portal/time-reports/[id]/route.js.map +7 -0
- package/dist/modules/staff/api/portal/time-reports/route.js +179 -0
- package/dist/modules/staff/api/portal/time-reports/route.js.map +7 -0
- package/dist/modules/staff/api/team-members/self/route.js +1 -3
- package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
- package/dist/modules/staff/api/team-members/tags/assign/route.js +1 -3
- package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
- package/dist/modules/staff/api/team-members/tags/unassign/route.js +1 -3
- package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js +174 -0
- package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js.map +7 -0
- package/dist/modules/staff/api/timesheets/access-requests/route.js +226 -0
- package/dist/modules/staff/api/timesheets/access-requests/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +15 -8
- package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/my-projects/route.js +13 -1
- package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js +42 -0
- package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js.map +7 -0
- package/dist/modules/staff/api/timesheets/my-work/route.js +383 -0
- package/dist/modules/staff/api/timesheets/my-work/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/projects/kpis/route.js +14 -2
- package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js +168 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js +246 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js +183 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js +164 -0
- package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/preview/route.js +360 -0
- package/dist/modules/staff/api/timesheets/reports/preview/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/route.js +316 -0
- package/dist/modules/staff/api/timesheets/reports/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/reports/shared.js +63 -0
- package/dist/modules/staff/api/timesheets/reports/shared.js.map +7 -0
- package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js +164 -0
- package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js +168 -0
- package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/settings/route.js +199 -0
- package/dist/modules/staff/api/timesheets/settings/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tags/access.js +76 -0
- package/dist/modules/staff/api/timesheets/tags/access.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js +235 -0
- package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tags/route.js +160 -0
- package/dist/modules/staff/api/timesheets/tags/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js +233 -0
- package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/task-statuses/route.js +188 -0
- package/dist/modules/staff/api/timesheets/task-statuses/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +399 -0
- package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js +210 -0
- package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/tasks/route.js +333 -0
- package/dist/modules/staff/api/timesheets/tasks/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js +228 -0
- package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +29 -10
- package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +31 -18
- package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +21 -7
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +27 -7
- package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +215 -32
- package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js +378 -0
- package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js +340 -0
- package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/time-entries/route.js +238 -26
- package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +23 -8
- package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js +209 -0
- package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js.map +7 -0
- package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +59 -2
- package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
- package/dist/modules/staff/api/timesheets/time-projects/route.js +264 -22
- package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
- package/dist/modules/staff/backend/staff/time-tracking/board/page.js +110 -0
- package/dist/modules/staff/backend/staff/time-tracking/board/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js +18 -0
- package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.js +981 -0
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js +18 -0
- package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/page.js +583 -0
- package/dist/modules/staff/backend/staff/time-tracking/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/page.meta.js +15 -0
- package/dist/modules/staff/backend/staff/time-tracking/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js +65 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +229 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +1014 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js +97 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/page.js +1040 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js +19 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +353 -0
- package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js +457 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js +697 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js +16 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/page.js +174 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js +18 -0
- package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +546 -0
- package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js +18 -0
- package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js +710 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js +646 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js.map +7 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js +18 -0
- package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js.map +7 -0
- package/dist/modules/staff/backend/staff/timesheets/page.js +4 -793
- package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/page.meta.js +2 -7
- package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +5 -136
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +1 -7
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +5 -445
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +3 -3
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +1 -7
- package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +4 -76
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +1 -7
- package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js +4 -613
- package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
- package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +2 -17
- package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +2 -2
- package/dist/modules/staff/ce.js +40 -0
- package/dist/modules/staff/ce.js.map +2 -2
- package/dist/modules/staff/cli.js +166 -1
- package/dist/modules/staff/cli.js.map +2 -2
- package/dist/modules/staff/commands/index.js +5 -0
- package/dist/modules/staff/commands/index.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-entries.js +569 -21
- package/dist/modules/staff/commands/timesheets-entries.js.map +3 -3
- package/dist/modules/staff/commands/timesheets-projects.js +450 -7
- package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
- package/dist/modules/staff/commands/timesheets-reports.js +1036 -0
- package/dist/modules/staff/commands/timesheets-reports.js.map +7 -0
- package/dist/modules/staff/commands/timesheets-tags.js +1015 -0
- package/dist/modules/staff/commands/timesheets-tags.js.map +7 -0
- package/dist/modules/staff/commands/timesheets-task-comments.js +438 -0
- package/dist/modules/staff/commands/timesheets-task-comments.js.map +7 -0
- package/dist/modules/staff/commands/timesheets-task-statuses.js +723 -0
- package/dist/modules/staff/commands/timesheets-task-statuses.js.map +7 -0
- package/dist/modules/staff/commands/timesheets-tasks.js +834 -0
- package/dist/modules/staff/commands/timesheets-tasks.js.map +7 -0
- package/dist/modules/staff/data/enrichers.js +426 -12
- package/dist/modules/staff/data/enrichers.js.map +2 -2
- package/dist/modules/staff/data/entities.js +552 -3
- package/dist/modules/staff/data/entities.js.map +2 -2
- package/dist/modules/staff/data/extensions.js +41 -0
- package/dist/modules/staff/data/extensions.js.map +7 -0
- package/dist/modules/staff/data/validators.js +254 -9
- package/dist/modules/staff/data/validators.js.map +2 -2
- package/dist/modules/staff/di.js +42 -1
- package/dist/modules/staff/di.js.map +2 -2
- package/dist/modules/staff/events.js +84 -6
- package/dist/modules/staff/events.js.map +2 -2
- package/dist/modules/staff/events.payloads.js +158 -0
- package/dist/modules/staff/events.payloads.js.map +7 -0
- package/dist/modules/staff/extension-points.js +261 -0
- package/dist/modules/staff/extension-points.js.map +7 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js +138 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js.map +7 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js +12 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js.map +7 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js +133 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js.map +7 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js +19 -0
- package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js.map +7 -0
- package/dist/modules/staff/lib/crud.js +11 -1
- package/dist/modules/staff/lib/crud.js.map +2 -2
- package/dist/modules/staff/lib/time-tracking/access.js +92 -0
- package/dist/modules/staff/lib/time-tracking/access.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/billability.js +39 -0
- package/dist/modules/staff/lib/time-tracking/billability.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/capacity.js +68 -0
- package/dist/modules/staff/lib/time-tracking/capacity.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/componentContracts.js +15 -0
- package/dist/modules/staff/lib/time-tracking/componentContracts.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/cost.js +82 -0
- package/dist/modules/staff/lib/time-tracking/cost.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/duration.js +55 -0
- package/dist/modules/staff/lib/time-tracking/duration.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/featureAccess.js +41 -0
- package/dist/modules/staff/lib/time-tracking/featureAccess.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/interval.js +72 -0
- package/dist/modules/staff/lib/time-tracking/interval.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js +88 -0
- package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/moneyVisibility.js +10 -0
- package/dist/modules/staff/lib/time-tracking/moneyVisibility.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/overlap.js +87 -0
- package/dist/modules/staff/lib/time-tracking/overlap.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/portalRecipients.js +27 -0
- package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/portalReports.js +16 -0
- package/dist/modules/staff/lib/time-tracking/portalReports.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/projectCode.js +135 -0
- package/dist/modules/staff/lib/time-tracking/projectCode.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/reapplyRounding.js +187 -0
- package/dist/modules/staff/lib/time-tracking/reapplyRounding.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/recalculationRunner.js +80 -0
- package/dist/modules/staff/lib/time-tracking/recalculationRunner.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/recalculations.js +56 -0
- package/dist/modules/staff/lib/time-tracking/recalculations.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/registries/invoke.js +63 -0
- package/dist/modules/staff/lib/time-tracking/registries/invoke.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/registries/registry.js +62 -0
- package/dist/modules/staff/lib/time-tracking/registries/registry.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/registries/scope.js +21 -0
- package/dist/modules/staff/lib/time-tracking/registries/scope.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/rollup.js +34 -0
- package/dist/modules/staff/lib/time-tracking/rollup.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/rounding.js +66 -0
- package/dist/modules/staff/lib/time-tracking/rounding.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/roundingImpact.js +39 -0
- package/dist/modules/staff/lib/time-tracking/roundingImpact.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/settingKeys.js +214 -0
- package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/settings.js +87 -0
- package/dist/modules/staff/lib/time-tracking/settings.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/sqlInClause.js +9 -0
- package/dist/modules/staff/lib/time-tracking/sqlInClause.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking/timeEntrySources.js +48 -0
- package/dist/modules/staff/lib/time-tracking/timeEntrySources.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +283 -0
- package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js +324 -0
- package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js +121 -0
- package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js +188 -0
- package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js +89 -0
- package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +855 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +360 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js +259 -0
- package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js +238 -0
- package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js +130 -0
- package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js +98 -0
- package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js +27 -0
- package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js +166 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js +295 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +212 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js +729 -0
- package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js +217 -0
- package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js +158 -0
- package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +224 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +93 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +1196 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js +176 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js +307 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js +284 -0
- package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js +73 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js +1499 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js +95 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js +188 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js +61 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js +45 -0
- package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +176 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +82 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js +5 -0
- package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +152 -0
- package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js +92 -0
- package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +111 -0
- package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js +243 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js +151 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +105 -0
- package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js +132 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js +205 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js +53 -0
- package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js +77 -0
- package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js.map +7 -0
- package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js +151 -0
- package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js.map +7 -0
- package/dist/modules/staff/lib/timeTrackingSeeds.js +809 -0
- package/dist/modules/staff/lib/timeTrackingSeeds.js.map +7 -0
- package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js +2 -3
- package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js.map +2 -2
- package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js +152 -0
- package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js +36 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js +66 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js +78 -0
- package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js +81 -0
- package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects/reportSelection.js +44 -0
- package/dist/modules/staff/lib/timesheets-projects/reportSelection.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js +169 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js +22 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +51 -1
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +2 -2
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js +70 -0
- package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js +63 -0
- package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/loadReportData.js +170 -0
- package/dist/modules/staff/lib/timesheets-reports/loadReportData.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/pdf.js +205 -0
- package/dist/modules/staff/lib/timesheets-reports/pdf.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js +68 -0
- package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js +135 -0
- package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js +48 -0
- package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportExport.js +262 -0
- package/dist/modules/staff/lib/timesheets-reports/reportExport.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js +34 -0
- package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js +79 -0
- package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportLabels.js +11 -0
- package/dist/modules/staff/lib/timesheets-reports/reportLabels.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportReference.js +83 -0
- package/dist/modules/staff/lib/timesheets-reports/reportReference.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportRows.js +42 -0
- package/dist/modules/staff/lib/timesheets-reports/reportRows.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js +107 -0
- package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/reportTotals.js +289 -0
- package/dist/modules/staff/lib/timesheets-reports/reportTotals.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-reports/xlsx.js +145 -0
- package/dist/modules/staff/lib/timesheets-reports/xlsx.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js +116 -0
- package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js +50 -0
- package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js +27 -0
- package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js +65 -0
- package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js +31 -0
- package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js +31 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js +17 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskReference.js +51 -0
- package/dist/modules/staff/lib/timesheets-tasks/taskReference.js.map +7 -0
- package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +11 -4
- package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +2 -2
- package/dist/modules/staff/lib/timesheets-ui/ListView.js +369 -111
- package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +2 -2
- package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +47 -2
- package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +2 -2
- package/dist/modules/staff/migrations/Migration20260813073131_staff.js +79 -0
- package/dist/modules/staff/migrations/Migration20260813073131_staff.js.map +7 -0
- package/dist/modules/staff/migrations/Migration20260824143357_staff.js +15 -0
- package/dist/modules/staff/migrations/Migration20260824143357_staff.js.map +7 -0
- package/dist/modules/staff/notifications.client.js +16 -0
- package/dist/modules/staff/notifications.client.js.map +7 -0
- package/dist/modules/staff/notifications.handlers.js +80 -0
- package/dist/modules/staff/notifications.handlers.js.map +7 -0
- package/dist/modules/staff/notifications.js +168 -0
- package/dist/modules/staff/notifications.js.map +2 -2
- package/dist/modules/staff/search.js +159 -1
- package/dist/modules/staff/search.js.map +2 -2
- package/dist/modules/staff/setup.js +20 -1
- package/dist/modules/staff/setup.js.map +2 -2
- package/dist/modules/staff/subscribers/time-project-access-requested-notification.js +68 -0
- package/dist/modules/staff/subscribers/time-project-access-requested-notification.js.map +7 -0
- package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js +149 -0
- package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js.map +7 -0
- package/dist/modules/staff/subscribers/time-report-approved-notification.js +78 -0
- package/dist/modules/staff/subscribers/time-report-approved-notification.js.map +7 -0
- package/dist/modules/staff/subscribers/time-report-portal-broadcast.js +78 -0
- package/dist/modules/staff/subscribers/time-report-portal-broadcast.js.map +7 -0
- package/dist/modules/staff/translations.js +4 -1
- package/dist/modules/staff/translations.js.map +2 -2
- package/dist/modules/staff/widgets/components.js +7 -0
- package/dist/modules/staff/widgets/components.js.map +7 -0
- package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +5 -4
- package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +2 -2
- package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js +135 -0
- package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js.map +7 -0
- package/dist/modules/staff/widgets/notifications/index.js +5 -0
- package/dist/modules/staff/widgets/notifications/index.js.map +7 -0
- package/dist/modules/staff/workers/timesheets-reapply-rounding.js +43 -0
- package/dist/modules/staff/workers/timesheets-reapply-rounding.js.map +7 -0
- package/generated/entities/staff_time_entry/index.ts +7 -0
- package/generated/entities/staff_time_entry_tag/index.ts +6 -0
- package/generated/entities/staff_time_project/index.ts +8 -0
- package/generated/entities/staff_time_report/index.ts +27 -0
- package/generated/entities/staff_time_report_entry/index.ts +12 -0
- package/generated/entities/staff_time_report_event/index.ts +9 -0
- package/generated/entities/staff_time_report_project/index.ts +6 -0
- package/generated/entities/staff_time_tag/index.ts +9 -0
- package/generated/entities/staff_time_task/index.ts +17 -0
- package/generated/entities/staff_time_task_comment/index.ts +9 -0
- package/generated/entities/staff_time_task_status/index.ts +13 -0
- package/generated/entities/staff_time_task_tag/index.ts +6 -0
- package/generated/entities.ids.generated.ts +11 -1
- package/generated/entity-fields-registry.ts +149 -0
- package/package.json +7 -7
- package/src/helpers/integration/timesheetFixtures.ts +31 -1
- package/src/modules/auth/README.md +1 -1
- package/src/modules/auth/cli.ts +35 -1
- package/src/modules/auth/i18n/de.json +7 -0
- package/src/modules/auth/i18n/en.json +7 -0
- package/src/modules/auth/i18n/es.json +7 -0
- package/src/modules/auth/i18n/ko.json +7 -0
- package/src/modules/auth/i18n/pl.json +7 -0
- package/src/modules/auth/lib/backendChrome.tsx +1 -0
- package/src/modules/customer_accounts/lib/customerRoleAcls.ts +79 -0
- package/src/modules/customer_accounts/setup.ts +1 -45
- package/src/modules/data_sync/AGENTS.md +34 -0
- package/src/modules/data_sync/api/options.ts +2 -0
- package/src/modules/data_sync/backend/data-sync/page.tsx +82 -33
- package/src/modules/data_sync/i18n/de.json +1 -0
- package/src/modules/data_sync/i18n/en.json +1 -0
- package/src/modules/data_sync/i18n/es.json +1 -0
- package/src/modules/data_sync/i18n/ko.json +1 -0
- package/src/modules/data_sync/i18n/pl.json +1 -0
- package/src/modules/data_sync/lib/adapter.ts +45 -0
- package/src/modules/data_sync/lib/start-controls.ts +89 -0
- package/src/modules/staff/AGENTS.md +769 -1
- package/src/modules/staff/acl.ts +9 -0
- package/src/modules/staff/ai-agents.ts +189 -0
- package/src/modules/staff/ai-tools/time-tracking-pack.ts +494 -0
- package/src/modules/staff/ai-tools/types.ts +82 -0
- package/src/modules/staff/ai-tools.ts +13 -0
- package/src/modules/staff/analytics.ts +113 -0
- package/src/modules/staff/api/guards.ts +85 -3
- package/src/modules/staff/api/leave-requests/accept/route.ts +0 -2
- package/src/modules/staff/api/leave-requests/reject/route.ts +0 -2
- package/src/modules/staff/api/portal/time-reports/[id]/route.ts +182 -0
- package/src/modules/staff/api/portal/time-reports/route.ts +270 -0
- package/src/modules/staff/api/team-members/self/route.ts +0 -2
- package/src/modules/staff/api/team-members/tags/assign/route.ts +0 -2
- package/src/modules/staff/api/team-members/tags/unassign/route.ts +0 -2
- package/src/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.ts +292 -0
- package/src/modules/staff/api/timesheets/access-requests/route.ts +299 -0
- package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +15 -7
- package/src/modules/staff/api/timesheets/my-projects/route.ts +14 -1
- package/src/modules/staff/api/timesheets/my-work/myWorkAggregate.ts +90 -0
- package/src/modules/staff/api/timesheets/my-work/route.ts +475 -0
- package/src/modules/staff/api/timesheets/projects/kpis/route.ts +15 -2
- package/src/modules/staff/api/timesheets/reports/[id]/close/route.ts +203 -0
- package/src/modules/staff/api/timesheets/reports/[id]/export/route.ts +315 -0
- package/src/modules/staff/api/timesheets/reports/[id]/sheet/route.ts +220 -0
- package/src/modules/staff/api/timesheets/reports/[id]/unlock/route.ts +208 -0
- package/src/modules/staff/api/timesheets/reports/preview/route.ts +449 -0
- package/src/modules/staff/api/timesheets/reports/route.ts +386 -0
- package/src/modules/staff/api/timesheets/reports/shared.ts +121 -0
- package/src/modules/staff/api/timesheets/settings/reapply-rounding/route.ts +205 -0
- package/src/modules/staff/api/timesheets/settings/rounding-impact/route.ts +226 -0
- package/src/modules/staff/api/timesheets/settings/route.ts +242 -0
- package/src/modules/staff/api/timesheets/tags/access.ts +134 -0
- package/src/modules/staff/api/timesheets/tags/entry-assignments/route.ts +290 -0
- package/src/modules/staff/api/timesheets/tags/route.ts +177 -0
- package/src/modules/staff/api/timesheets/tags/task-assignments/route.ts +294 -0
- package/src/modules/staff/api/timesheets/task-statuses/route.ts +232 -0
- package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +532 -0
- package/src/modules/staff/api/timesheets/tasks/[id]/status/route.ts +271 -0
- package/src/modules/staff/api/timesheets/tasks/route.ts +443 -0
- package/src/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.ts +306 -0
- package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +32 -10
- package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +32 -17
- package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +27 -6
- package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +36 -6
- package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +331 -34
- package/src/modules/staff/api/timesheets/time-entries/copy-day/route.ts +533 -0
- package/src/modules/staff/api/timesheets/time-entries/overlaps/route.ts +457 -0
- package/src/modules/staff/api/timesheets/time-entries/route.ts +378 -24
- package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +31 -9
- package/src/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.ts +246 -0
- package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +62 -2
- package/src/modules/staff/api/timesheets/time-projects/route.ts +397 -22
- package/src/modules/staff/backend/staff/time-tracking/board/page.meta.ts +14 -0
- package/src/modules/staff/backend/staff/time-tracking/board/page.tsx +151 -0
- package/src/modules/staff/backend/staff/time-tracking/entries/page.meta.ts +14 -0
- package/src/modules/staff/backend/staff/time-tracking/entries/page.tsx +1229 -0
- package/src/modules/staff/backend/staff/time-tracking/page.meta.ts +11 -0
- package/src/modules/staff/backend/staff/time-tracking/page.tsx +823 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.tsx +81 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +275 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +1420 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/create/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/create/page.tsx +109 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/page.meta.ts +15 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/page.tsx +1254 -0
- package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +466 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.tsx +632 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/create/page.meta.ts +12 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/create/page.tsx +867 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/page.meta.ts +14 -0
- package/src/modules/staff/backend/staff/time-tracking/reports/page.tsx +246 -0
- package/src/modules/staff/backend/staff/time-tracking/settings/page.meta.ts +14 -0
- package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +701 -0
- package/src/modules/staff/backend/staff/time-tracking/timesheet/GridView.tsx +953 -0
- package/src/modules/staff/backend/staff/time-tracking/timesheet/page.meta.ts +14 -0
- package/src/modules/staff/backend/staff/time-tracking/timesheet/page.tsx +800 -0
- package/src/modules/staff/backend/staff/timesheets/page.meta.ts +6 -6
- package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1010
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +0 -6
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +4 -158
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +0 -6
- package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -609
- package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +0 -6
- package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +3 -89
- package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +2 -19
- package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +3 -778
- package/src/modules/staff/ce.ts +63 -0
- package/src/modules/staff/cli.ts +207 -1
- package/src/modules/staff/commands/index.ts +5 -0
- package/src/modules/staff/commands/timesheets-entries.ts +1006 -28
- package/src/modules/staff/commands/timesheets-projects.ts +593 -7
- package/src/modules/staff/commands/timesheets-reports.ts +1329 -0
- package/src/modules/staff/commands/timesheets-tags.ts +1315 -0
- package/src/modules/staff/commands/timesheets-task-comments.ts +583 -0
- package/src/modules/staff/commands/timesheets-task-statuses.ts +889 -0
- package/src/modules/staff/commands/timesheets-tasks.ts +1121 -0
- package/src/modules/staff/data/enrichers.ts +675 -10
- package/src/modules/staff/data/entities.ts +494 -2
- package/src/modules/staff/data/extensions.ts +68 -0
- package/src/modules/staff/data/validators.ts +348 -3
- package/src/modules/staff/di.ts +96 -0
- package/src/modules/staff/events.payloads.ts +268 -0
- package/src/modules/staff/events.ts +87 -5
- package/src/modules/staff/extension-points.ts +308 -0
- package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.ts +10 -0
- package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.tsx +225 -0
- package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.ts +17 -0
- package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.tsx +182 -0
- package/src/modules/staff/i18n/de.json +899 -0
- package/src/modules/staff/i18n/en.json +899 -0
- package/src/modules/staff/i18n/es.json +899 -0
- package/src/modules/staff/i18n/ko.json +899 -0
- package/src/modules/staff/i18n/pl.json +899 -0
- package/src/modules/staff/lib/crud.ts +14 -3
- package/src/modules/staff/lib/time-tracking/access.ts +155 -0
- package/src/modules/staff/lib/time-tracking/billability.ts +68 -0
- package/src/modules/staff/lib/time-tracking/capacity.ts +124 -0
- package/src/modules/staff/lib/time-tracking/componentContracts.ts +26 -0
- package/src/modules/staff/lib/time-tracking/cost.ts +144 -0
- package/src/modules/staff/lib/time-tracking/duration.ts +68 -0
- package/src/modules/staff/lib/time-tracking/featureAccess.ts +115 -0
- package/src/modules/staff/lib/time-tracking/interval.ts +90 -0
- package/src/modules/staff/lib/time-tracking/migrateProjectCodes.ts +161 -0
- package/src/modules/staff/lib/time-tracking/moneyVisibility.ts +37 -0
- package/src/modules/staff/lib/time-tracking/overlap.ts +159 -0
- package/src/modules/staff/lib/time-tracking/portalRecipients.ts +76 -0
- package/src/modules/staff/lib/time-tracking/portalReports.ts +31 -0
- package/src/modules/staff/lib/time-tracking/projectCode.ts +221 -0
- package/src/modules/staff/lib/time-tracking/reapplyRounding.ts +313 -0
- package/src/modules/staff/lib/time-tracking/recalculationRunner.ts +118 -0
- package/src/modules/staff/lib/time-tracking/recalculations.ts +135 -0
- package/src/modules/staff/lib/time-tracking/registries/invoke.ts +122 -0
- package/src/modules/staff/lib/time-tracking/registries/registry.ts +124 -0
- package/src/modules/staff/lib/time-tracking/registries/scope.ts +56 -0
- package/src/modules/staff/lib/time-tracking/rollup.ts +59 -0
- package/src/modules/staff/lib/time-tracking/rounding.ts +126 -0
- package/src/modules/staff/lib/time-tracking/roundingImpact.ts +75 -0
- package/src/modules/staff/lib/time-tracking/settingKeys.ts +274 -0
- package/src/modules/staff/lib/time-tracking/settings.ts +168 -0
- package/src/modules/staff/lib/time-tracking/sqlInClause.ts +22 -0
- package/src/modules/staff/lib/time-tracking/timeEntrySources.ts +85 -0
- package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +360 -0
- package/src/modules/staff/lib/time-tracking-ui/CustomerPicker.tsx +427 -0
- package/src/modules/staff/lib/time-tracking-ui/DurationInput.tsx +192 -0
- package/src/modules/staff/lib/time-tracking-ui/EntryDetailsFields.tsx +224 -0
- package/src/modules/staff/lib/time-tracking-ui/EntryFilterBar.tsx +144 -0
- package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +1065 -0
- package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +435 -0
- package/src/modules/staff/lib/time-tracking-ui/KanbanColumn.tsx +316 -0
- package/src/modules/staff/lib/time-tracking-ui/NewTaskDialog.tsx +291 -0
- package/src/modules/staff/lib/time-tracking-ui/NoProjectAccess.tsx +162 -0
- package/src/modules/staff/lib/time-tracking-ui/PeriodSelector.tsx +149 -0
- package/src/modules/staff/lib/time-tracking-ui/PhasePlaceholder.tsx +31 -0
- package/src/modules/staff/lib/time-tracking-ui/ProjectCodeField.tsx +230 -0
- package/src/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.tsx +432 -0
- package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +323 -0
- package/src/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.tsx +930 -0
- package/src/modules/staff/lib/time-tracking-ui/ReportSheet.tsx +357 -0
- package/src/modules/staff/lib/time-tracking-ui/TagPicker.tsx +195 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +243 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +137 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +1405 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskListView.tsx +260 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskPicker.tsx +435 -0
- package/src/modules/staff/lib/time-tracking-ui/TaskQuickLog.tsx +296 -0
- package/src/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.tsx +97 -0
- package/src/modules/staff/lib/time-tracking-ui/TimeEntryDialog.tsx +1929 -0
- package/src/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.tsx +126 -0
- package/src/modules/staff/lib/time-tracking-ui/TimesheetCalendar.tsx +265 -0
- package/src/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.tsx +78 -0
- package/src/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.tsx +70 -0
- package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +231 -0
- package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +128 -0
- package/src/modules/staff/lib/time-tracking-ui/boardSummary.ts +20 -0
- package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +228 -0
- package/src/modules/staff/lib/time-tracking-ui/projectTeamAssignment.ts +143 -0
- package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +194 -0
- package/src/modules/staff/lib/time-tracking-ui/timeEntryDialogState.ts +400 -0
- package/src/modules/staff/lib/time-tracking-ui/timeEntryListData.ts +271 -0
- package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +168 -0
- package/src/modules/staff/lib/time-tracking-ui/timesheetData.ts +225 -0
- package/src/modules/staff/lib/time-tracking-ui/timesheetPeriod.ts +278 -0
- package/src/modules/staff/lib/time-tracking-ui/timesheetTargets.ts +93 -0
- package/src/modules/staff/lib/time-tracking-ui/useBoardFilters.ts +107 -0
- package/src/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.ts +245 -0
- package/src/modules/staff/lib/timeTrackingSeeds.ts +1037 -0
- package/src/modules/staff/lib/timesheets/timeEntryCacheInvalidation.ts +11 -10
- package/src/modules/staff/lib/timesheets/timeEntryDecoration.ts +256 -0
- package/src/modules/staff/lib/timesheets-projects/budgetBurn.ts +60 -0
- package/src/modules/staff/lib/timesheets-projects/budgetThreshold.ts +135 -0
- package/src/modules/staff/lib/timesheets-projects/budgetThresholdState.ts +137 -0
- package/src/modules/staff/lib/timesheets-projects/computeProjectFinancials.ts +142 -0
- package/src/modules/staff/lib/timesheets-projects/reportSelection.ts +82 -0
- package/src/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.tsx +237 -0
- package/src/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.tsx +33 -0
- package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +56 -1
- package/src/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.tsx +90 -0
- package/src/modules/staff/lib/timesheets-reports/buildReportSheet.ts +125 -0
- package/src/modules/staff/lib/timesheets-reports/loadReportData.ts +251 -0
- package/src/modules/staff/lib/timesheets-reports/pdf.ts +263 -0
- package/src/modules/staff/lib/timesheets-reports/reportApprovalPolicies.ts +137 -0
- package/src/modules/staff/lib/timesheets-reports/reportConfigData.ts +247 -0
- package/src/modules/staff/lib/timesheets-reports/reportConfigState.ts +89 -0
- package/src/modules/staff/lib/timesheets-reports/reportExport.ts +373 -0
- package/src/modules/staff/lib/timesheets-reports/reportExportFormats.ts +71 -0
- package/src/modules/staff/lib/timesheets-reports/reportGroupings.ts +153 -0
- package/src/modules/staff/lib/timesheets-reports/reportLabels.ts +23 -0
- package/src/modules/staff/lib/timesheets-reports/reportReference.ts +146 -0
- package/src/modules/staff/lib/timesheets-reports/reportRows.ts +89 -0
- package/src/modules/staff/lib/timesheets-reports/reportSheetData.ts +196 -0
- package/src/modules/staff/lib/timesheets-reports/reportTotals.ts +544 -0
- package/src/modules/staff/lib/timesheets-reports/xlsx.ts +207 -0
- package/src/modules/staff/lib/timesheets-tasks/computeTaskRollups.ts +238 -0
- package/src/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.ts +90 -0
- package/src/modules/staff/lib/timesheets-tasks/seedProjectStatuses.ts +43 -0
- package/src/modules/staff/lib/timesheets-tasks/statusPositions.ts +132 -0
- package/src/modules/staff/lib/timesheets-tasks/statusSlug.ts +43 -0
- package/src/modules/staff/lib/timesheets-tasks/taskHierarchy.ts +99 -0
- package/src/modules/staff/lib/timesheets-tasks/taskHoursTotals.ts +42 -0
- package/src/modules/staff/lib/timesheets-tasks/taskReference.ts +108 -0
- package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +18 -4
- package/src/modules/staff/lib/timesheets-ui/ListView.tsx +504 -149
- package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +50 -2
- package/src/modules/staff/migrations/.snapshot-open-mercato.json +3244 -228
- package/src/modules/staff/migrations/Migration20260813073131_staff.ts +94 -0
- package/src/modules/staff/migrations/Migration20260824143357_staff.ts +17 -0
- package/src/modules/staff/notifications.client.ts +16 -0
- package/src/modules/staff/notifications.handlers.ts +88 -0
- package/src/modules/staff/notifications.ts +163 -0
- package/src/modules/staff/search.ts +191 -1
- package/src/modules/staff/setup.ts +22 -0
- package/src/modules/staff/subscribers/time-project-access-requested-notification.ts +95 -0
- package/src/modules/staff/subscribers/time-project-budget-threshold-notification.ts +226 -0
- package/src/modules/staff/subscribers/time-report-approved-notification.ts +116 -0
- package/src/modules/staff/subscribers/time-report-portal-broadcast.ts +120 -0
- package/src/modules/staff/translations.ts +17 -0
- package/src/modules/staff/widgets/components.ts +34 -0
- package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +6 -5
- package/src/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.tsx +138 -0
- package/src/modules/staff/widgets/notifications/index.ts +1 -0
- package/src/modules/staff/workers/timesheets-reapply-rounding.ts +59 -0
- package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +0 -123
- package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +0 -7
- package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +0 -138
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../src/modules/staff/backend/staff/time-tracking/timesheet/GridView.tsx"],
|
|
4
|
+
"sourcesContent": ["\"use client\"\n\n/**\n * The kept editable grid (T5.4) \u2014 project \u00D7 day cells, typed straight into, saved\n * in one pass.\n *\n * This is the one surface of the old timesheet the redesign keeps, because it is\n * the fastest way in the product to fill a week. The table's markup, column\n * widths, weekend treatment, footer and totals are carried over unchanged; the\n * functional upgrade is three things and no more:\n *\n * 1. **The shared duration parser.** Cells were a private `decimalToMinutes`\n * that understood `1.5` and silently answered `0` for `1h 40m`. They are now\n * `DurationInput`, so the grid understands exactly what the entry dialog, the\n * inline cell edit and the quick-add rows understand. The look is preserved\n * by `formatValue={formatTrimmedDecimalDuration}` \u2014 120 minutes renders `2`,\n * not `2.00` (watch item W3, closed by T4.5 with a test pinning the\n * divergence from `formatDuration(\u2026, 'decimal')`).\n *\n * A consequence worth stating: text that does not parse is **kept**, the cell\n * is flagged, and Save is disabled until it is fixed. The old grid stripped\n * every character it did not like as you typed.\n *\n * 2. **Rows can be a project or a project + task.** The row-mode toggle splits\n * each project row into its task-less entries plus one row per task with time\n * in the period, so grid entries carry `taskId` like every other entry.\n *\n * 3. **Locked cells are read-only**, badged, and never sent. The bulk endpoint\n * refuses the whole batch with `409 time_entry_locked` naming the offending\n * ids (T4.2); those ids are marked here so the refusal lands on the cells\n * that caused it rather than as an opaque batch failure.\n *\n * **Table semantics and states.** The grid is a data table, so it carries an\n * sr-only `<caption>`, `scope`d column headers and a `<th scope=\"row\">` row\n * label \u2014 without them a screen reader reads a row as eight unlabelled numbers.\n * Weekends keep their background tint but no longer depend on it alone: the\n * header also carries the day and the word in its `title` and an sr-only marker.\n * `isLoading` draws skeleton rows in the real row geometry rather than a\n * centered one-liner, and a period with no rows gets an in-table empty state\n * instead of headers over an empty body.\n *\n * **Save path \u2014 two routes, and why.**\n * The bulk endpoint now assigns `task_id` on both its create and update\n * branches, so the silent-drop defect this file used to document is fixed and\n * the note is retired. Task-row cells nonetheless keep writing through the\n * single-entry CRUD route, for a different reason: that route carries a\n * per-entry `If-Match`-style expected version, so a cell edited from another\n * tab surfaces as a conflict on the cell that caused it. The batch has no\n * per-row version contract \u2014 it is all-or-nothing and reconciles only the\n * report lock (`409 time_entry_locked`) \u2014 so project rows sent through it are\n * deliberately last-write-wins. optimistic-lock-exempt: the bulk batch has no\n * per-row version field; per-cell locking is provided by the single-entry path\n * above, and the batch's own gate is the closed-report lock.\n */\n\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { registerComponent } from '@open-mercato/shared/modules/widgets/component-registry'\nimport { useRegisteredComponent } from '@open-mercato/ui/backend/injection/useRegisteredComponent'\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport {\n callbackProp,\n opaqueProp,\n} from '../../../../lib/time-tracking/componentContracts'\nimport { Lock, X } from 'lucide-react'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { apiCallOrThrow, withScopedApiRequestHeaders } from '@open-mercato/ui/backend/utils/apiCall'\nimport { createCrud, deleteCrud, updateCrud } from '@open-mercato/ui/backend/utils/crud'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useConfirmDialog } from '@open-mercato/ui/backend/confirm-dialog'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { surfaceRecordConflict } from '@open-mercato/ui/backend/conflicts'\nimport { buildOptimisticLockHeader } from '@open-mercato/ui/backend/utils/optimisticLock'\nimport { cn } from '@open-mercato/shared/lib/utils'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { AddRowDropdown } from '../../../../lib/timesheets-ui/AddRowDropdown'\nimport { ProjectColorDot } from '../../../../lib/timesheets-ui/ProjectColorDot'\nimport { DurationInput, formatTrimmedDecimalDuration } from '../../../../lib/time-tracking-ui/DurationInput'\nimport { readErrorCode, isEntryLockedError } from '../../../../lib/time-tracking-ui/timeEntryListData'\nimport type { TimesheetEntry } from '../../../../lib/time-tracking-ui/timesheetData'\nimport { isWeekendIso, parseIsoDay } from '../../../../lib/time-tracking-ui/timesheetPeriod'\nimport {\n buildTargetKey,\n targetLabel,\n type TimesheetLogTarget,\n type TimesheetProjectRef,\n type TimesheetTaskRef,\n} from '../../../../lib/time-tracking-ui/timesheetTargets'\n\nconst logger = createLogger('staff').child({ component: 'time-tracking/timesheet/grid' })\n\n/** Placeholder rows drawn while the period loads \u2014 same geometry as a real row. */\nconst SKELETON_ROW_COUNT = 4\n\nconst ENTRIES_API_PATH = 'staff/timesheets/time-entries'\nconst BULK_ENDPOINT = '/api/staff/timesheets/time-entries/bulk'\nconst RESOURCE_KIND = 'staff.timesheets.time_entry'\n\nexport type GridRowMode = 'projects' | 'tasks'\n\nexport type GridViewProps = {\n /** Every day column of the current period, in order. */\n days: readonly string[]\n projects: readonly TimesheetProjectRef[]\n allAssignedProjects: readonly TimesheetProjectRef[]\n tasks: readonly TimesheetTaskRef[]\n entries: readonly TimesheetEntry[]\n staffMemberId: string | null\n canManage: boolean\n canManageProjects: boolean\n /** Someone else's timesheet is readable but not editable from the grid. */\n readOnly: boolean\n /** Draws skeleton rows instead of data while the period is being fetched. */\n isLoading?: boolean\n rowMode: GridRowMode\n onRowModeChange: (mode: GridRowMode) => void\n onAddProject: (project: TimesheetProjectRef) => void | Promise<void>\n onRemoveProject: (project: TimesheetProjectRef) => void | Promise<void>\n onCreateProject: () => void\n onSaved: () => void | Promise<void>\n}\n\ntype GridRow = TimesheetLogTarget & {\n removable: boolean\n}\n\ntype GridCell = {\n minutes: number\n entryIds: string[]\n lockedEntryIds: string[]\n /** `updated_at` per entry id \u2014 the expected version a task-cell write sends. */\n entryVersions: Record<string, string | null>\n}\n\ntype DirtyCell = {\n rowKey: string\n date: string\n minutes: number\n}\n\nfunction cellKey(rowKey: string, date: string): string {\n return `${rowKey}|${date}`\n}\n\n/** The grid's column header: `Mon` over `13`. */\nfunction dayHeaderParts(date: string, locale?: string): { weekday: string; dayOfMonth: string } {\n const parsed = parseIsoDay(date)\n if (!parsed) return { weekday: '', dayOfMonth: date }\n let weekday = ''\n try {\n weekday = new Intl.DateTimeFormat(locale, { weekday: 'short' }).format(parsed)\n } catch {\n weekday = ''\n }\n return { weekday, dayOfMonth: String(parsed.getDate()) }\n}\n\nexport function buildGridRows(\n projects: readonly TimesheetProjectRef[],\n tasks: readonly TimesheetTaskRef[],\n entries: readonly TimesheetEntry[],\n rowMode: GridRowMode,\n extraTaskKeys: ReadonlySet<string>,\n): GridRow[] {\n if (rowMode === 'projects') {\n return projects.map((project) => ({\n key: buildTargetKey(project.id, null),\n timeProjectId: project.id,\n taskId: null,\n projectName: project.name,\n projectCode: project.code,\n projectColor: project.color,\n taskTitle: null,\n removable: true,\n }))\n }\n\n const tasksById = new Map(tasks.map((task) => [task.id, task]))\n const usedTaskIds = new Map<string, Set<string>>()\n for (const entry of entries) {\n if (!entry.taskId || !entry.timeProjectId) continue\n const bucket = usedTaskIds.get(entry.timeProjectId) ?? new Set<string>()\n bucket.add(entry.taskId)\n usedTaskIds.set(entry.timeProjectId, bucket)\n }\n for (const key of extraTaskKeys) {\n const separator = key.indexOf(':')\n if (separator < 0) continue\n const projectId = key.slice(0, separator)\n const taskId = key.slice(separator + 1)\n const bucket = usedTaskIds.get(projectId) ?? new Set<string>()\n bucket.add(taskId)\n usedTaskIds.set(projectId, bucket)\n }\n\n const rows: GridRow[] = []\n for (const project of projects) {\n rows.push({\n key: buildTargetKey(project.id, null),\n timeProjectId: project.id,\n taskId: null,\n projectName: project.name,\n projectCode: project.code,\n projectColor: project.color,\n taskTitle: null,\n removable: true,\n })\n const taskIds = Array.from(usedTaskIds.get(project.id) ?? [])\n const named = taskIds\n .map((taskId) => ({ taskId, title: tasksById.get(taskId)?.title ?? null }))\n .sort((left, right) => (left.title ?? '').localeCompare(right.title ?? ''))\n for (const task of named) {\n rows.push({\n key: buildTargetKey(project.id, task.taskId),\n timeProjectId: project.id,\n taskId: task.taskId,\n projectName: project.name,\n projectCode: project.code,\n projectColor: project.color,\n taskTitle: task.title,\n removable: false,\n })\n }\n }\n return rows\n}\n\nexport function buildGridCells(\n entries: readonly TimesheetEntry[],\n rowMode: GridRowMode,\n): Map<string, GridCell> {\n const cells = new Map<string, GridCell>()\n for (const entry of entries) {\n if (!entry.timeProjectId) continue\n const rowKey =\n rowMode === 'projects'\n ? buildTargetKey(entry.timeProjectId, null)\n : buildTargetKey(entry.timeProjectId, entry.taskId)\n const key = cellKey(rowKey, entry.date)\n const current = cells.get(key) ?? { minutes: 0, entryIds: [], lockedEntryIds: [], entryVersions: {} }\n current.minutes += Number.isFinite(entry.durationMinutes) ? entry.durationMinutes : 0\n current.entryIds.push(entry.id)\n current.entryVersions[entry.id] = entry.updatedAt\n if (entry.isLocked) current.lockedEntryIds.push(entry.id)\n cells.set(key, current)\n }\n return cells\n}\n\nfunction DefaultGridView({\n days,\n projects,\n allAssignedProjects,\n tasks,\n entries,\n staffMemberId,\n canManage,\n canManageProjects,\n readOnly,\n isLoading = false,\n rowMode,\n onRowModeChange,\n onAddProject,\n onRemoveProject,\n onCreateProject,\n onSaved,\n}: GridViewProps) {\n const t = useT()\n const { confirm, ConfirmDialogElement } = useConfirmDialog()\n const [dirty, setDirty] = React.useState<Record<string, DirtyCell>>({})\n const [invalidCells, setInvalidCells] = React.useState<Record<string, true>>({})\n const [extraLockedEntryIds, setExtraLockedEntryIds] = React.useState<Record<string, true>>({})\n const [extraTaskKeys, setExtraTaskKeys] = React.useState<Set<string>>(() => new Set())\n const [isSaving, setIsSaving] = React.useState(false)\n\n const mutationContextId = staffMemberId ? `staff-timesheets:${staffMemberId}` : 'staff-timesheets:pending'\n const { runMutation, retryLastMutation } = useGuardedMutation<{\n formId: string\n resourceKind: string\n resourceId?: string\n staffMemberId: string | null\n retryLastMutation: () => Promise<boolean>\n }>({\n contextId: mutationContextId,\n blockedMessage: t('ui.forms.flash.saveBlocked', 'Save blocked by validation'),\n })\n\n const mutationContext = React.useCallback(\n (resourceId?: string) => ({\n formId: mutationContextId,\n resourceKind: RESOURCE_KIND,\n resourceId,\n staffMemberId,\n retryLastMutation,\n }),\n [mutationContextId, retryLastMutation, staffMemberId],\n )\n\n const rows = React.useMemo(\n () => buildGridRows(projects, tasks, entries, rowMode, extraTaskKeys),\n [entries, extraTaskKeys, projects, rowMode, tasks],\n )\n const cells = React.useMemo(() => buildGridCells(entries, rowMode), [entries, rowMode])\n const rowsByKey = React.useMemo(() => new Map(rows.map((row) => [row.key, row])), [rows])\n\n // A fresh period, a different person or a row-mode switch invalidates every\n // pending edit: the cells they belong to are no longer on screen.\n const resetToken = `${rowMode}|${days[0] ?? ''}|${days[days.length - 1] ?? ''}|${staffMemberId ?? ''}`\n const resetTokenRef = React.useRef(resetToken)\n React.useEffect(() => {\n if (resetTokenRef.current === resetToken) return\n resetTokenRef.current = resetToken\n setDirty({})\n setInvalidCells({})\n }, [resetToken])\n\n const isCellLocked = React.useCallback(\n (key: string) => {\n const cell = cells.get(key)\n if (!cell) return false\n if (cell.lockedEntryIds.length > 0) return true\n return cell.entryIds.some((id) => extraLockedEntryIds[id])\n },\n [cells, extraLockedEntryIds],\n )\n\n const cellMinutes = React.useCallback(\n (key: string) => {\n const pending = dirty[key]\n if (pending) return pending.minutes\n return cells.get(key)?.minutes ?? 0\n },\n [cells, dirty],\n )\n\n const handleCellChange = React.useCallback(\n (row: GridRow, date: string, minutes: number | null, invalid: boolean) => {\n const key = cellKey(row.key, date)\n setInvalidCells((current) => {\n if (invalid === Boolean(current[key])) return current\n const next = { ...current }\n if (invalid) next[key] = true\n else delete next[key]\n return next\n })\n // Unparseable text is never turned into a number \u2014 the previous value stands\n // and Save stays blocked until the text is fixed or cleared.\n if (invalid) return\n const nextMinutes = minutes ?? 0\n const stored = cells.get(key)\n const storedMinutes = stored?.minutes ?? 0\n const hadEntries = (stored?.entryIds.length ?? 0) > 0\n setDirty((current) => {\n const next = { ...current }\n if (nextMinutes === storedMinutes && !hadEntries) {\n delete next[key]\n return next\n }\n next[key] = { rowKey: row.key, date, minutes: nextMinutes }\n return next\n })\n },\n [cells],\n )\n\n const rowTotal = React.useCallback(\n (rowKey: string) => days.reduce((sum, date) => sum + cellMinutes(cellKey(rowKey, date)), 0),\n [cellMinutes, days],\n )\n const dayTotal = React.useCallback(\n (date: string) => rows.reduce((sum, row) => sum + cellMinutes(cellKey(row.key, date)), 0),\n [cellMinutes, rows],\n )\n const grandTotal = React.useMemo(\n () => rows.reduce((sum, row) => sum + rowTotal(row.key), 0),\n [rowTotal, rows],\n )\n\n const dirtyCount = Object.keys(dirty).length\n const invalidCount = Object.keys(invalidCells).length\n const hasChanges = dirtyCount > 0\n const dense = days.length > 10\n\n const markLockedFromError = React.useCallback((error: unknown) => {\n const body = (error as { body?: { lockedEntryIds?: unknown } } | null)?.body\n const direct = (error as { lockedEntryIds?: unknown } | null)?.lockedEntryIds\n const ids = Array.isArray(body?.lockedEntryIds)\n ? body?.lockedEntryIds\n : Array.isArray(direct)\n ? direct\n : []\n const marked = ids.filter((id): id is string => typeof id === 'string')\n if (marked.length === 0) return false\n setExtraLockedEntryIds((current) => {\n const next = { ...current }\n for (const id of marked) next[id] = true\n return next\n })\n return true\n }, [])\n\n const reportSaveFailure = React.useCallback(\n (error: unknown) => {\n if (surfaceRecordConflict(error, t)) return\n if (isEntryLockedError(error)) {\n markLockedFromError(error)\n flash(\n t(\n 'staff.time_tracking.timesheet.grid.errors.locked',\n 'Some of these cells belong to a closed report and cannot be changed. They are now marked as locked.',\n ),\n 'error',\n )\n return\n }\n logger.error('staff.time_tracking.timesheet.grid save failed', { err: error, code: readErrorCode(error) })\n flash(t('staff.timesheets.my.errors.save', 'Failed to save timesheets.'), 'error')\n },\n [markLockedFromError, t],\n )\n\n /**\n * Task-row cells, one write each through the single-entry route \u2014 see the file\n * header for why they cannot ride the batch yet. A locked cell never reaches\n * here (its input is read-only), so a 409 from this path means the entry was\n * frozen after the page loaded, which is exactly when the user needs to be\n * told which cell it was.\n */\n const saveTaskCells = React.useCallback(\n async (changes: Array<{ row: GridRow; cell: DirtyCell }>) => {\n for (const { row, cell } of changes) {\n const key = cellKey(row.key, cell.date)\n const storedCell = cells.get(key)\n const existingId = storedCell?.entryIds[0] ?? null\n const existingVersion = existingId ? storedCell?.entryVersions[existingId] ?? null : null\n const errorMessage = t('staff.timesheets.my.errors.save', 'Failed to save timesheets.')\n if (existingId && cell.minutes <= 0) {\n await runMutation({\n operation: () =>\n withScopedApiRequestHeaders(buildOptimisticLockHeader(existingVersion), () =>\n deleteCrud(ENTRIES_API_PATH, existingId, { errorMessage }),\n ),\n context: mutationContext(existingId),\n mutationPayload: { id: existingId },\n })\n continue\n }\n if (cell.minutes <= 0) continue\n if (existingId) {\n const payload = { id: existingId, durationMinutes: cell.minutes }\n await runMutation({\n operation: () =>\n withScopedApiRequestHeaders(buildOptimisticLockHeader(existingVersion), () =>\n updateCrud(ENTRIES_API_PATH, payload, { errorMessage }),\n ),\n context: mutationContext(existingId),\n mutationPayload: payload,\n })\n continue\n }\n const payload = {\n staffMemberId,\n date: cell.date,\n timeProjectId: row.timeProjectId,\n taskId: row.taskId,\n durationMinutes: cell.minutes,\n source: 'manual',\n }\n await runMutation({\n operation: () => createCrud(ENTRIES_API_PATH, payload, { errorMessage }),\n context: mutationContext(),\n mutationPayload: payload,\n })\n }\n },\n [cells, mutationContext, runMutation, staffMemberId, t],\n )\n\n const handleSave = React.useCallback(async () => {\n if (!hasChanges || invalidCount > 0) return\n const confirmed = await confirm({\n title: t('staff.timesheets.my.confirm_save.title', 'Save changes?'),\n text: t('staff.timesheets.my.confirm_save.body', 'Your timesheet entries will be saved.'),\n })\n if (!confirmed) return\n\n const bulkEntries: Array<{ id?: string; date: string; timeProjectId: string; durationMinutes: number }> = []\n const taskChanges: Array<{ row: GridRow; cell: DirtyCell }> = []\n for (const cell of Object.values(dirty)) {\n const row = rowsByKey.get(cell.rowKey)\n if (!row) continue\n if (row.taskId) {\n taskChanges.push({ row, cell })\n continue\n }\n const key = cellKey(row.key, cell.date)\n bulkEntries.push({\n id: cells.get(key)?.entryIds[0],\n date: cell.date,\n timeProjectId: row.timeProjectId,\n durationMinutes: cell.minutes,\n })\n }\n if (bulkEntries.length === 0 && taskChanges.length === 0) return\n\n setIsSaving(true)\n try {\n if (bulkEntries.length > 0) {\n const payload = { entries: bulkEntries }\n await runMutation({\n operation: () =>\n apiCallOrThrow(BULK_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n }),\n context: mutationContext(staffMemberId ?? undefined),\n mutationPayload: payload as unknown as Record<string, unknown>,\n })\n }\n if (taskChanges.length > 0) await saveTaskCells(taskChanges)\n setDirty({})\n flash(t('staff.timesheets.my.saved', 'Timesheet saved.'), 'success')\n await onSaved()\n } catch (error) {\n reportSaveFailure(error)\n } finally {\n setIsSaving(false)\n }\n }, [\n cells,\n confirm,\n dirty,\n hasChanges,\n invalidCount,\n mutationContext,\n onSaved,\n reportSaveFailure,\n rowsByKey,\n runMutation,\n saveTaskCells,\n staffMemberId,\n t,\n ])\n\n const taskRowOptions = React.useMemo(() => {\n const visibleProjectIds = new Set(projects.map((project) => project.id))\n const existing = new Set(rows.map((row) => row.key))\n return tasks\n .filter((task) => visibleProjectIds.has(task.timeProjectId))\n .map((task) => {\n const project = projects.find((candidate) => candidate.id === task.timeProjectId)!\n return {\n key: buildTargetKey(task.timeProjectId, task.id),\n label: targetLabel({\n key: buildTargetKey(task.timeProjectId, task.id),\n timeProjectId: task.timeProjectId,\n taskId: task.id,\n projectName: project.name,\n projectCode: project.code,\n projectColor: project.color,\n taskTitle: task.title,\n }),\n }\n })\n .filter((option) => !existing.has(option.key))\n }, [projects, rows, tasks])\n\n const editable = canManage && !readOnly\n const loadingLabel = t('staff.time_tracking.timesheet.grid.loading', 'Loading the timesheet grid\\u2026')\n\n return (\n <div className=\"flex flex-col gap-3\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <SegmentedControl\n value={rowMode}\n onValueChange={(value) => {\n if (value !== rowMode) onRowModeChange(value as GridRowMode)\n }}\n size=\"sm\"\n aria-label={t('staff.time_tracking.timesheet.grid.rowMode.label', 'Grid rows')}\n >\n <SegmentedControlItem value=\"projects\">\n {t('staff.time_tracking.timesheet.grid.rowMode.projects', 'Projects')}\n </SegmentedControlItem>\n <SegmentedControlItem value=\"tasks\">\n {t('staff.time_tracking.timesheet.grid.rowMode.tasks', 'Projects + tasks')}\n </SegmentedControlItem>\n </SegmentedControl>\n\n <div className=\"flex items-center gap-3\">\n {invalidCount > 0 ? (\n <span className=\"text-xs font-medium text-status-error-text\">\n {t('staff.time_tracking.timesheet.grid.invalid', 'Fix the highlighted cell before saving.')}\n </span>\n ) : hasChanges ? (\n <span className=\"text-xs font-medium text-status-warning-text\">\n {t('staff.timesheets.my.unsaved', 'Unsaved changes')}\n </span>\n ) : null}\n {editable ? (\n <Button\n size=\"sm\"\n type=\"button\"\n onClick={() => void handleSave()}\n disabled={!hasChanges || invalidCount > 0 || isSaving}\n >\n {isSaving\n ? t('staff.timesheets.my.saving', 'Saving...')\n : t('staff.timesheets.my.save_changes', 'Save Changes')}\n </Button>\n ) : null}\n </div>\n </div>\n\n {rowMode === 'tasks' && editable && taskRowOptions.length > 0 ? (\n <div className=\"flex items-center gap-2\">\n <Select\n value=\"\"\n onValueChange={(value) => setExtraTaskKeys((current) => new Set(current).add(value))}\n >\n <SelectTrigger\n className=\"w-72\"\n aria-label={t('staff.time_tracking.timesheet.grid.addTaskRow', 'Add a task row')}\n >\n <SelectValue placeholder={t('staff.time_tracking.timesheet.grid.addTaskRow', 'Add a task row')} />\n </SelectTrigger>\n <SelectContent>\n {taskRowOptions.map((option) => (\n <SelectItem key={option.key} value={option.key}>\n {option.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n ) : null}\n\n <div className=\"overflow-x-auto rounded-lg border\">\n <table className=\"w-full text-sm table-fixed\" aria-busy={isLoading || undefined}>\n <caption className=\"sr-only\">\n {t(\n 'staff.time_tracking.timesheet.grid.caption',\n 'Timesheet grid: one row per project or task, one column per day of the period.',\n )}\n </caption>\n <colgroup>\n <col className={dense ? 'w-[140px] min-w-[140px]' : 'w-[35%]'} />\n {days.map((date) => (\n <col key={date} className={dense ? 'w-[36px] min-w-[36px]' : ''} />\n ))}\n <col className={dense ? 'w-[56px] min-w-[56px]' : 'w-[72px]'} />\n </colgroup>\n <thead>\n <tr className=\"border-b bg-muted/50\">\n <th scope=\"col\" className=\"sticky left-0 z-10 bg-muted px-3 py-2 text-left font-medium\">\n {t('staff.timesheets.my.project', 'Project')}\n </th>\n {days.map((date) => {\n const { weekday, dayOfMonth } = dayHeaderParts(date)\n const weekend = isWeekendIso(date)\n // Weekends were signalled by a background tint alone, which a\n // screen reader and a monochrome display both miss. The tint stays;\n // the meaning now also travels as a title and an sr-only word.\n const weekendLabel = t('staff.time_tracking.timesheet.grid.weekend', 'Weekend day')\n return (\n <th\n scope=\"col\"\n key={date}\n title={weekend ? `${date} \u00B7 ${weekendLabel}` : date}\n className={cn(\n 'py-2 text-center font-medium px-1',\n weekend ? 'bg-muted/80 text-muted-foreground' : null,\n )}\n >\n <div className=\"text-xs uppercase text-muted-foreground\">{weekday}</div>\n <div className=\"text-xs\">{dayOfMonth}</div>\n {weekend ? <span className=\"sr-only\">{weekendLabel}</span> : null}\n </th>\n )\n })}\n <th scope=\"col\" className=\"px-3 py-2 text-right font-medium\">\n {t('staff.timesheets.my.total', 'Total')}\n </th>\n </tr>\n </thead>\n <tbody>\n {isLoading\n ? Array.from({ length: SKELETON_ROW_COUNT }).map((_, index) => (\n <tr key={`grid-skeleton-${index}`} data-testid=\"grid-skeleton-row\" className=\"border-b\">\n <th scope=\"row\" className=\"sticky left-0 z-10 bg-background px-3 py-1.5 text-left font-medium\">\n {index === 0 ? <span className=\"sr-only\">{loadingLabel}</span> : null}\n <span aria-hidden=\"true\" className=\"block h-4 w-32 animate-pulse rounded bg-muted\" />\n </th>\n {days.map((date) => (\n <td key={date} className=\"px-0.5 py-0.5\">\n <span\n aria-hidden=\"true\"\n className={cn('mx-auto block h-6 animate-pulse rounded bg-muted', dense ? 'w-10' : 'w-16')}\n />\n </td>\n ))}\n <td className=\"px-3 py-1.5\">\n <span aria-hidden=\"true\" className=\"ml-auto block h-4 w-8 animate-pulse rounded bg-muted\" />\n </td>\n </tr>\n ))\n : null}\n {!isLoading && rows.length === 0 ? (\n <tr data-testid=\"grid-empty-row\" className=\"border-b\">\n <td colSpan={days.length + 2} className=\"px-3 py-10 text-center\">\n <p className=\"text-sm font-medium text-foreground\">\n {t('staff.time_tracking.timesheet.grid.empty.title', 'This grid has no rows yet')}\n </p>\n <p className=\"mt-1 text-sm text-muted-foreground\">\n {t(\n 'staff.time_tracking.timesheet.grid.noRows',\n 'Add a project row to start filling the grid.',\n )}\n </p>\n </td>\n </tr>\n ) : null}\n {isLoading ? null : rows.map((row) => (\n <tr key={row.key} className=\"group border-b hover:bg-muted/30\">\n <th\n scope=\"row\"\n className={cn(\n 'sticky left-0 z-10 bg-background px-3 py-1.5 text-left font-medium text-foreground',\n row.taskId ? 'pl-6' : null,\n )}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-1.5 truncate\" title={targetLabel(row)}>\n {row.taskId ? null : (\n <ProjectColorDot colorKey={row.projectColor} projectName={row.projectName} size=\"sm\" />\n )}\n <span className=\"truncate\">{row.taskId ? row.taskTitle ?? targetLabel(row) : row.projectName}</span>\n </div>\n {row.taskId ? (\n <div className=\"text-xs text-muted-foreground truncate\">{row.projectName}</div>\n ) : row.projectCode ? (\n <div className=\"text-xs text-muted-foreground\">{row.projectCode}</div>\n ) : null}\n </div>\n {row.removable && editable ? (\n <button\n type=\"button\"\n onClick={() => {\n const project = projects.find((candidate) => candidate.id === row.timeProjectId)\n if (!project) return\n // Drop the row's pending errors with the row. An invalid\n // cell left behind keeps Save blocked over a row that is\n // no longer on screen, so the reader cannot reach the\n // thing they are being told to fix.\n setInvalidCells((current) => {\n const prefix = cellKey(row.key, '')\n const next = Object.fromEntries(\n Object.entries(current).filter(([key]) => !key.startsWith(prefix)),\n ) as Record<string, true>\n return Object.keys(next).length === Object.keys(current).length ? current : next\n })\n setDirty((current) => {\n const prefix = cellKey(row.key, '')\n const next = Object.fromEntries(\n Object.entries(current).filter(([key]) => !key.startsWith(prefix)),\n ) as typeof current\n return Object.keys(next).length === Object.keys(current).length ? current : next\n })\n void onRemoveProject(project)\n }}\n aria-label={t('staff.timesheets.my.removeRow', 'Remove from grid')}\n title={t('staff.timesheets.my.removeRow', 'Remove from grid')}\n className=\"opacity-0 group-hover:opacity-100 focus:opacity-100 inline-flex h-5 w-5 shrink-0 cursor-pointer items-center justify-center rounded text-muted-foreground hover:bg-muted hover:text-foreground transition-opacity\"\n >\n <X className=\"size-3.5\" />\n </button>\n ) : null}\n </div>\n </th>\n {days.map((date) => {\n const key = cellKey(row.key, date)\n const weekend = isWeekendIso(date)\n const minutes = cellMinutes(key)\n const locked = isCellLocked(key)\n const isDirty = dirty[key] !== undefined\n const isInvalid = Boolean(invalidCells[key])\n return (\n <td\n key={date}\n className={cn(\n 'px-0.5 py-0.5',\n weekend ? 'bg-muted/40' : null,\n // The old grid tinted the input itself amber; the border and\n // background of a `DurationInput` belong to the primitive, so\n // the pending-edit cue moved to the cell \u2014 same signal, DS\n // status tokens instead of raw `amber-*` (Boy Scout rule).\n isInvalid\n ? 'bg-status-error-bg'\n : isDirty\n ? 'bg-status-warning-bg'\n : null,\n )}\n >\n {weekend && minutes === 0 ? (\n <div className=\"rounded px-1 py-1 text-center text-xs text-muted-foreground/50\">-</div>\n ) : locked || !editable ? (\n <div\n className=\"flex items-center justify-center gap-1 rounded px-1 py-1 text-center text-xs tabular-nums text-muted-foreground\"\n title={\n locked\n ? t(\n 'staff.time_tracking.timesheet.grid.lockedCell',\n 'Locked by a closed report',\n )\n : undefined\n }\n >\n {locked ? <Lock className=\"size-3 shrink-0\" aria-hidden=\"true\" /> : null}\n <span>{formatTrimmedDecimalDuration(minutes) || '-'}</span>\n </div>\n ) : (\n <DurationInput\n variant=\"compact\"\n inputSize=\"sm\"\n value={minutes > 0 ? minutes : null}\n formatValue={formatTrimmedDecimalDuration}\n onChange={(nextMinutes, state) =>\n handleCellChange(row, date, nextMinutes, state.status === 'invalid')\n }\n placeholder={t('staff.timesheets.my.durationPlaceholder', '0')}\n ariaLabel={`${targetLabel(row)} \u00B7 ${date}`}\n className={cn('mx-auto', dense ? 'w-10' : 'w-16')}\n inputClassName={cn(\n 'text-center px-1 tabular-nums',\n dense ? 'text-xs' : null,\n minutes > 0 ? 'font-semibold' : 'text-muted-foreground',\n )}\n />\n )}\n </td>\n )\n })}\n <td className=\"px-3 py-1.5 text-right font-semibold text-xs tabular-nums\">\n {formatTrimmedDecimalDuration(rowTotal(row.key)) || '0'}\n </td>\n </tr>\n ))}\n {editable && !isLoading ? (\n <tr className=\"border-b\">\n <td colSpan={days.length + 2} className=\"sticky left-0 bg-background px-1 py-0.5\">\n <AddRowDropdown\n assignedProjects={allAssignedProjects.map((project) => ({\n id: project.id,\n name: project.name,\n code: project.code,\n color: project.color,\n }))}\n visibleProjectIds={new Set(projects.map((project) => project.id))}\n canCreateProject={canManageProjects}\n onAddProject={(project) => {\n void onAddProject({\n id: project.id,\n name: project.name,\n code: project.code ?? null,\n color: project.color ?? null,\n })\n }}\n onCreateProject={onCreateProject}\n />\n </td>\n </tr>\n ) : null}\n </tbody>\n <tfoot>\n <tr className=\"border-t bg-muted/50 font-semibold\">\n <th scope=\"row\" className=\"sticky left-0 z-10 bg-muted px-3 py-2 text-left\">\n {t('staff.timesheets.my.daily_total', 'Daily Total')}\n </th>\n {days.map((date) => {\n const weekend = isWeekendIso(date)\n const minutes = dayTotal(date)\n return (\n <td\n key={date}\n className={cn(\n 'py-2 text-center text-xs tabular-nums',\n weekend ? 'text-muted-foreground/50' : null,\n )}\n >\n {weekend && minutes === 0 ? '-' : formatTrimmedDecimalDuration(minutes) || '-'}\n </td>\n )\n })}\n <td className=\"px-3 py-2 text-right tabular-nums font-semibold\">\n {formatTrimmedDecimalDuration(grandTotal) || '0'}\n </td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n {ConfirmDialogElement}\n </div>\n )\n}\n\nconst gridViewPropsSchema: z.ZodType<GridViewProps> = z.object({\n days: z.array(z.string()),\n projects: z.array(opaqueProp<TimesheetProjectRef>()),\n allAssignedProjects: z.array(opaqueProp<TimesheetProjectRef>()),\n tasks: z.array(opaqueProp<TimesheetTaskRef>()),\n entries: z.array(opaqueProp<TimesheetEntry>()),\n staffMemberId: z.string().nullable(),\n canManage: z.boolean(),\n canManageProjects: z.boolean(),\n readOnly: z.boolean(),\n isLoading: z.boolean().optional(),\n rowMode: z.union([z.literal('projects'), z.literal('tasks')]),\n onRowModeChange: callbackProp<(mode: GridRowMode) => void>(),\n onAddProject: callbackProp<(project: TimesheetProjectRef) => void | Promise<void>>(),\n onRemoveProject: callbackProp<(project: TimesheetProjectRef) => void | Promise<void>>(),\n onCreateProject: callbackProp<() => void>(),\n onSaved: callbackProp<() => void | Promise<void>>(),\n})\n\nregisterComponent<GridViewProps>({\n id: extensionPoints.hosts.timesheetGridComponent.componentId,\n component: DefaultGridView,\n metadata: {\n module: 'staff',\n description: 'Timesheet grid view \u2014 projects/tasks by day, editable cells.',\n propsSchema: gridViewPropsSchema,\n },\n})\n\nexport function GridView(props: GridViewProps) {\n const Resolved = useRegisteredComponent<GridViewProps>(\n extensionPoints.hosts.timesheetGridComponent.componentId,\n DefaultGridView,\n )\n return <Resolved {...props} />\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["payload"]
|
|
7
|
+
}
|