@burdenoff/microfe-planmagnet 2026.928.3 → 2026.928.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +126 -84
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +192 -64
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts +5 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.d.ts.map +1 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js +107 -0
- package/dist/planmagnet/automation/AutomationExecutionsPanel.js.map +1 -0
- package/dist/planmagnet/automation/AutomationRuleFields.d.ts +29 -0
- package/dist/planmagnet/automation/AutomationRuleFields.d.ts.map +1 -0
- package/dist/planmagnet/automation/AutomationRuleFields.js +308 -0
- package/dist/planmagnet/automation/AutomationRuleFields.js.map +1 -0
- package/dist/planmagnet/automation/automationRuleTypes.d.ts +60 -0
- package/dist/planmagnet/automation/automationRuleTypes.d.ts.map +1 -0
- package/dist/planmagnet/automation/automationRuleTypes.js +113 -0
- package/dist/planmagnet/automation/automationRuleTypes.js.map +1 -0
- package/dist/planmagnet/board/BulkActions.d.ts +11 -0
- package/dist/planmagnet/board/BulkActions.d.ts.map +1 -0
- package/dist/planmagnet/board/BulkActions.js +182 -0
- package/dist/planmagnet/board/BulkActions.js.map +1 -0
- package/dist/planmagnet/board/ProjectBoard.d.ts.map +1 -1
- package/dist/planmagnet/board/ProjectBoard.js +289 -254
- package/dist/planmagnet/board/ProjectBoard.js.map +1 -1
- package/dist/planmagnet/budgets/BudgetControls.d.ts +30 -0
- package/dist/planmagnet/budgets/BudgetControls.d.ts.map +1 -0
- package/dist/planmagnet/budgets/BudgetControls.js +470 -0
- package/dist/planmagnet/budgets/BudgetControls.js.map +1 -0
- package/dist/planmagnet/budgets/ExpenseControls.d.ts +27 -0
- package/dist/planmagnet/budgets/ExpenseControls.d.ts.map +1 -0
- package/dist/planmagnet/budgets/ExpenseControls.js +366 -0
- package/dist/planmagnet/budgets/ExpenseControls.js.map +1 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts +5 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.d.ts.map +1 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js +112 -0
- package/dist/planmagnet/budgets/ProjectBudgetsSummary.js.map +1 -0
- package/dist/planmagnet/budgets/budgetMath.d.ts +26 -0
- package/dist/planmagnet/budgets/budgetMath.d.ts.map +1 -0
- package/dist/planmagnet/budgets/budgetMath.js +49 -0
- package/dist/planmagnet/budgets/budgetMath.js.map +1 -0
- package/dist/planmagnet/controls/AutomationRuleControls.d.ts +23 -0
- package/dist/planmagnet/controls/AutomationRuleControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/AutomationRuleControls.js +172 -0
- package/dist/planmagnet/controls/AutomationRuleControls.js.map +1 -0
- package/dist/planmagnet/controls/CompetitorControls.d.ts +20 -0
- package/dist/planmagnet/controls/CompetitorControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/CompetitorControls.js +172 -0
- package/dist/planmagnet/controls/CompetitorControls.js.map +1 -0
- package/dist/planmagnet/controls/CustomFieldControls.d.ts +42 -0
- package/dist/planmagnet/controls/CustomFieldControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/CustomFieldControls.js +84 -0
- package/dist/planmagnet/controls/CustomFieldControls.js.map +1 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts +8 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.d.ts.map +1 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js +315 -0
- package/dist/planmagnet/controls/CustomFieldValuesPanel.js.map +1 -0
- package/dist/planmagnet/controls/FeatureControls.js +53 -53
- package/dist/planmagnet/controls/FeatureTriage.js +11 -11
- package/dist/planmagnet/controls/ObjectiveControls.js +37 -37
- package/dist/planmagnet/controls/Pickers.d.ts +17 -2
- package/dist/planmagnet/controls/Pickers.d.ts.map +1 -1
- package/dist/planmagnet/controls/Pickers.js +100 -9
- package/dist/planmagnet/controls/Pickers.js.map +1 -1
- package/dist/planmagnet/controls/PortfolioControls.d.ts +13 -0
- package/dist/planmagnet/controls/PortfolioControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/PortfolioControls.js +114 -0
- package/dist/planmagnet/controls/PortfolioControls.js.map +1 -0
- package/dist/planmagnet/controls/ProgramControls.d.ts +25 -0
- package/dist/planmagnet/controls/ProgramControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/ProgramControls.js +187 -0
- package/dist/planmagnet/controls/ProgramControls.js.map +1 -0
- package/dist/planmagnet/controls/ProjectControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/ProjectControls.js +54 -47
- package/dist/planmagnet/controls/ProjectControls.js.map +1 -1
- package/dist/planmagnet/controls/ReleaseControls.js +7 -7
- package/dist/planmagnet/controls/RiskControls.d.ts +27 -0
- package/dist/planmagnet/controls/RiskControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/RiskControls.js +346 -0
- package/dist/planmagnet/controls/RiskControls.js.map +1 -0
- package/dist/planmagnet/controls/TemplateControls.d.ts +15 -0
- package/dist/planmagnet/controls/TemplateControls.d.ts.map +1 -0
- package/dist/planmagnet/controls/TemplateControls.js +55 -0
- package/dist/planmagnet/controls/TemplateControls.js.map +1 -0
- package/dist/planmagnet/controls/WorkItemControls.js +1 -1
- package/dist/planmagnet/create/CreateDialogs.d.ts +20 -0
- package/dist/planmagnet/create/CreateDialogs.d.ts.map +1 -1
- package/dist/planmagnet/create/CreateDialogs.js +455 -116
- package/dist/planmagnet/create/CreateDialogs.js.map +1 -1
- package/dist/planmagnet/dependency/DependencyPanel.d.ts +6 -0
- package/dist/planmagnet/dependency/DependencyPanel.d.ts.map +1 -0
- package/dist/planmagnet/dependency/DependencyPanel.js +310 -0
- package/dist/planmagnet/dependency/DependencyPanel.js.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js +171 -0
- package/dist/planmagnet/pages/AutomationAutomationRuleDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js +232 -0
- package/dist/planmagnet/pages/AutomationAutomationRulesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js +93 -0
- package/dist/planmagnet/pages/AutomationCreateAutomationRulePagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js +127 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js +129 -0
- package/dist/planmagnet/pages/CompetitorsCompetitorsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js +132 -0
- package/dist/planmagnet/pages/CompetitorsCreateCompetitorPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js +181 -0
- package/dist/planmagnet/pages/CompetitorsEditCompetitorPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js +242 -0
- package/dist/planmagnet/pages/PortfoliosCreatePortfolioPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js +302 -0
- package/dist/planmagnet/pages/PortfoliosEditPortfolioPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js +335 -0
- package/dist/planmagnet/pages/PortfoliosPortfolioDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js +154 -0
- package/dist/planmagnet/pages/PortfoliosPortfoliosPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +124 -138
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js +221 -0
- package/dist/planmagnet/pages/ProgramsCreateProgramPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js +279 -0
- package/dist/planmagnet/pages/ProgramsEditProgramPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js +178 -0
- package/dist/planmagnet/pages/ProgramsProgramDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js +157 -0
- package/dist/planmagnet/pages/ProgramsProgramsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js +315 -0
- package/dist/planmagnet/pages/ProjectsBudgetDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js +186 -0
- package/dist/planmagnet/pages/ProjectsBudgetsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js +164 -0
- package/dist/planmagnet/pages/ProjectsCriticalPathPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js +348 -0
- package/dist/planmagnet/pages/ProjectsCustomFieldsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +130 -103
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +4 -4
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +4 -4
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +6 -6
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +325 -189
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +81 -72
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js +278 -0
- package/dist/planmagnet/pages/RisksRiskDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js +191 -0
- package/dist/planmagnet/pages/RisksRiskRegisterPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +5 -5
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +4 -4
- package/dist/planmagnet/pages/TasksImportPagePage.js +5 -5
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +161 -137
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +124 -113
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js +263 -0
- package/dist/planmagnet/pages/TasksTimeEntriesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js +254 -0
- package/dist/planmagnet/pages/TasksTimesheetDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js +165 -0
- package/dist/planmagnet/pages/TasksTimesheetsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js +316 -0
- package/dist/planmagnet/pages/TemplatesEditTemplatePagePage.js.map +1 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js +208 -0
- package/dist/planmagnet/pages/TemplatesTemplatesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts +0 -5
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.d.ts.map +1 -1
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js +47 -89
- package/dist/planmagnet/pages/analytics/DeliveryHealthCards.js.map +1 -1
- package/dist/planmagnet/roadmaps/RoadmapControls.js +24 -24
- package/dist/planmagnet/time/TaskTimePanel.d.ts +7 -0
- package/dist/planmagnet/time/TaskTimePanel.d.ts.map +1 -0
- package/dist/planmagnet/time/TaskTimePanel.js +104 -0
- package/dist/planmagnet/time/TaskTimePanel.js.map +1 -0
- package/dist/planmagnet/time/TimeEntryControls.d.ts +37 -0
- package/dist/planmagnet/time/TimeEntryControls.d.ts.map +1 -0
- package/dist/planmagnet/time/TimeEntryControls.js +338 -0
- package/dist/planmagnet/time/TimeEntryControls.js.map +1 -0
- package/dist/planmagnet/time/TimesheetControls.d.ts +18 -0
- package/dist/planmagnet/time/TimesheetControls.d.ts.map +1 -0
- package/dist/planmagnet/time/TimesheetControls.js +244 -0
- package/dist/planmagnet/time/TimesheetControls.js.map +1 -0
- package/dist/planmagnet/time/timeShared.d.ts +29 -0
- package/dist/planmagnet/time/timeShared.d.ts.map +1 -0
- package/dist/planmagnet/time/timeShared.js +34 -0
- package/dist/planmagnet/time/timeShared.js.map +1 -0
- package/dist/planmagnet/utils/rowNavigation.js +5 -2
- package/dist/planmagnet/utils/rowNavigation.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { PersonName as t } from "../people/People.js";
|
|
3
|
+
import { useEntityId as n } from "../hooks/useEntityId.js";
|
|
4
|
+
import { enumLabel as r } from "../controls/WorkItemControls.js";
|
|
5
|
+
import { FROZEN_TIMESHEET_STATUSES as i, formatMinutes as a } from "../time/timeShared.js";
|
|
6
|
+
import { DeleteTimeEntryButton as o, EditTimeEntryDialog as s } from "../time/TimeEntryControls.js";
|
|
7
|
+
import { SubmitTimesheetButton as c, TimesheetApprovalActions as l } from "../time/TimesheetControls.js";
|
|
8
|
+
import { ArrowLeft as u, Lock as d } from "lucide-react";
|
|
9
|
+
import { gql as f } from "@apollo/client";
|
|
10
|
+
import { useQuery as p } from "@apollo/client/react";
|
|
11
|
+
import { Fragment as m, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
12
|
+
import { Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
|
|
13
|
+
//#region src/planmagnet/pages/TasksTimesheetDetailPagePage.tsx
|
|
14
|
+
var S = f`
|
|
15
|
+
query TimesheetDetail($id: ID!) {
|
|
16
|
+
planmagnetTimesheet(id: $id) {
|
|
17
|
+
id
|
|
18
|
+
userId
|
|
19
|
+
periodStart
|
|
20
|
+
periodEnd
|
|
21
|
+
status
|
|
22
|
+
totalMinutes
|
|
23
|
+
billableMinutes
|
|
24
|
+
approverId
|
|
25
|
+
approvedAt
|
|
26
|
+
rejectionReason
|
|
27
|
+
createdBy
|
|
28
|
+
createdAt
|
|
29
|
+
entries {
|
|
30
|
+
id
|
|
31
|
+
workItemId
|
|
32
|
+
workItem {
|
|
33
|
+
id
|
|
34
|
+
key
|
|
35
|
+
title
|
|
36
|
+
}
|
|
37
|
+
description
|
|
38
|
+
durationMinutes
|
|
39
|
+
date
|
|
40
|
+
billingType
|
|
41
|
+
status
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`;
|
|
46
|
+
function C() {
|
|
47
|
+
let f = n("timesheetId"), C = e(), { data: w, loading: T, error: E } = p(S, {
|
|
48
|
+
variables: { id: f },
|
|
49
|
+
skip: !f
|
|
50
|
+
});
|
|
51
|
+
if (!f) return /* @__PURE__ */ h("div", {
|
|
52
|
+
className: "p-6 text-sm text-muted-foreground",
|
|
53
|
+
children: "No timesheet selected. Open one from the list."
|
|
54
|
+
});
|
|
55
|
+
if (T && !w) return /* @__PURE__ */ h("div", {
|
|
56
|
+
className: "flex items-center justify-center p-12",
|
|
57
|
+
children: /* @__PURE__ */ h("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
58
|
+
});
|
|
59
|
+
if (E) return /* @__PURE__ */ g("div", {
|
|
60
|
+
className: "p-6 space-y-3",
|
|
61
|
+
children: [/* @__PURE__ */ g("p", {
|
|
62
|
+
role: "alert",
|
|
63
|
+
className: "text-sm text-destructive",
|
|
64
|
+
children: ["The timesheet could not be loaded: ", E.message]
|
|
65
|
+
}), /* @__PURE__ */ g(_, {
|
|
66
|
+
size: "sm",
|
|
67
|
+
variant: "ghost",
|
|
68
|
+
onClick: () => C("/tasks/timesheets-page"),
|
|
69
|
+
children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
|
|
70
|
+
})]
|
|
71
|
+
});
|
|
72
|
+
let D = w?.planmagnetTimesheet;
|
|
73
|
+
if (!D) return /* @__PURE__ */ g("div", {
|
|
74
|
+
className: "p-6 space-y-3",
|
|
75
|
+
children: [/* @__PURE__ */ h("p", {
|
|
76
|
+
className: "text-sm text-muted-foreground",
|
|
77
|
+
children: "This timesheet does not exist in this workspace."
|
|
78
|
+
}), /* @__PURE__ */ g(_, {
|
|
79
|
+
size: "sm",
|
|
80
|
+
variant: "ghost",
|
|
81
|
+
onClick: () => C("/tasks/timesheets-page"),
|
|
82
|
+
children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
|
|
83
|
+
})]
|
|
84
|
+
});
|
|
85
|
+
let O = ["TimesheetDetail", "TimesheetsList"], k = i.has(D.status), A = [...D.entries].sort((e, t) => e.date.localeCompare(t.date));
|
|
86
|
+
return /* @__PURE__ */ g("div", {
|
|
87
|
+
className: "space-y-6 p-6",
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ g(_, {
|
|
90
|
+
size: "sm",
|
|
91
|
+
variant: "ghost",
|
|
92
|
+
onClick: () => C("/tasks/timesheets-page"),
|
|
93
|
+
children: [/* @__PURE__ */ h(u, { className: "mr-1 h-4 w-4" }), "All timesheets"]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ g("div", {
|
|
96
|
+
className: "flex flex-wrap items-start justify-between gap-4",
|
|
97
|
+
children: [/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ g("h1", {
|
|
98
|
+
className: "text-2xl font-semibold",
|
|
99
|
+
children: [
|
|
100
|
+
new Date(D.periodStart).toLocaleDateString(),
|
|
101
|
+
" –",
|
|
102
|
+
" ",
|
|
103
|
+
new Date(D.periodEnd).toLocaleDateString()
|
|
104
|
+
]
|
|
105
|
+
}), /* @__PURE__ */ g("p", {
|
|
106
|
+
className: "text-sm text-muted-foreground mt-1",
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ h(t, { id: D.userId }),
|
|
109
|
+
" · ",
|
|
110
|
+
r(D.status)
|
|
111
|
+
]
|
|
112
|
+
})] }), /* @__PURE__ */ g("div", {
|
|
113
|
+
className: "flex flex-col items-end gap-2",
|
|
114
|
+
children: [/* @__PURE__ */ h(c, {
|
|
115
|
+
id: D.id,
|
|
116
|
+
status: D.status,
|
|
117
|
+
refetchQueries: O
|
|
118
|
+
}), /* @__PURE__ */ h(l, {
|
|
119
|
+
id: D.id,
|
|
120
|
+
status: D.status,
|
|
121
|
+
refetchQueries: O
|
|
122
|
+
})]
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
D.status === "REJECTED" && D.rejectionReason && /* @__PURE__ */ g("p", {
|
|
126
|
+
role: "alert",
|
|
127
|
+
className: "text-sm text-status-error-text rounded-md border border-destructive/40 p-3",
|
|
128
|
+
children: ["Rejected: ", D.rejectionReason]
|
|
129
|
+
}),
|
|
130
|
+
D.approverId && D.approvedAt && /* @__PURE__ */ g("p", {
|
|
131
|
+
className: "text-sm text-muted-foreground",
|
|
132
|
+
children: [
|
|
133
|
+
"Approved by ",
|
|
134
|
+
/* @__PURE__ */ h(t, { id: D.approverId }),
|
|
135
|
+
" on",
|
|
136
|
+
" ",
|
|
137
|
+
new Date(D.approvedAt).toLocaleDateString()
|
|
138
|
+
]
|
|
139
|
+
}),
|
|
140
|
+
/* @__PURE__ */ g("div", {
|
|
141
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
142
|
+
children: [
|
|
143
|
+
/* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
|
|
144
|
+
className: "pt-4",
|
|
145
|
+
children: [/* @__PURE__ */ h("p", {
|
|
146
|
+
className: "text-xs text-muted-foreground",
|
|
147
|
+
children: "Total"
|
|
148
|
+
}), /* @__PURE__ */ h("p", {
|
|
149
|
+
className: "text-xl font-bold mt-1",
|
|
150
|
+
children: a(D.totalMinutes)
|
|
151
|
+
})]
|
|
152
|
+
}) }),
|
|
153
|
+
/* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
|
|
154
|
+
className: "pt-4",
|
|
155
|
+
children: [/* @__PURE__ */ h("p", {
|
|
156
|
+
className: "text-xs text-muted-foreground",
|
|
157
|
+
children: "Billable"
|
|
158
|
+
}), /* @__PURE__ */ h("p", {
|
|
159
|
+
className: "text-xl font-bold mt-1",
|
|
160
|
+
children: a(D.billableMinutes)
|
|
161
|
+
})]
|
|
162
|
+
}) }),
|
|
163
|
+
/* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
|
|
164
|
+
className: "pt-4",
|
|
165
|
+
children: [/* @__PURE__ */ h("p", {
|
|
166
|
+
className: "text-xs text-muted-foreground",
|
|
167
|
+
children: "Entries"
|
|
168
|
+
}), /* @__PURE__ */ h("p", {
|
|
169
|
+
className: "text-xl font-bold mt-1",
|
|
170
|
+
children: A.length
|
|
171
|
+
})]
|
|
172
|
+
}) }),
|
|
173
|
+
/* @__PURE__ */ h(v, { children: /* @__PURE__ */ g(y, {
|
|
174
|
+
className: "pt-4",
|
|
175
|
+
children: [/* @__PURE__ */ h("p", {
|
|
176
|
+
className: "text-xs text-muted-foreground",
|
|
177
|
+
children: "Created"
|
|
178
|
+
}), /* @__PURE__ */ h("p", {
|
|
179
|
+
className: "text-sm font-medium mt-1",
|
|
180
|
+
children: new Date(D.createdAt).toLocaleDateString()
|
|
181
|
+
})]
|
|
182
|
+
}) })
|
|
183
|
+
]
|
|
184
|
+
}),
|
|
185
|
+
/* @__PURE__ */ g(v, { children: [/* @__PURE__ */ h(b, { children: /* @__PURE__ */ g(x, {
|
|
186
|
+
className: "flex items-center gap-2",
|
|
187
|
+
children: [
|
|
188
|
+
"Entries (",
|
|
189
|
+
A.length,
|
|
190
|
+
")",
|
|
191
|
+
k && /* @__PURE__ */ g("span", {
|
|
192
|
+
className: "flex items-center gap-1 text-xs font-normal text-muted-foreground",
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ h(d, {
|
|
195
|
+
className: "h-3 w-3",
|
|
196
|
+
"aria-hidden": !0
|
|
197
|
+
}),
|
|
198
|
+
"Locked while ",
|
|
199
|
+
r(D.status).toLowerCase()
|
|
200
|
+
]
|
|
201
|
+
})
|
|
202
|
+
]
|
|
203
|
+
}) }), /* @__PURE__ */ g(y, {
|
|
204
|
+
className: "space-y-2",
|
|
205
|
+
children: [A.length === 0 && /* @__PURE__ */ h("p", {
|
|
206
|
+
className: "text-sm text-muted-foreground text-center py-4",
|
|
207
|
+
children: "No entries in this period yet."
|
|
208
|
+
}), A.map((e) => {
|
|
209
|
+
let t = e.workItem;
|
|
210
|
+
return /* @__PURE__ */ g("div", {
|
|
211
|
+
className: "flex items-start justify-between gap-3 rounded-md border p-3",
|
|
212
|
+
children: [/* @__PURE__ */ g("div", {
|
|
213
|
+
className: "min-w-0 space-y-1",
|
|
214
|
+
children: [/* @__PURE__ */ g("p", {
|
|
215
|
+
className: "text-sm font-medium",
|
|
216
|
+
children: [
|
|
217
|
+
new Date(e.date).toLocaleDateString(),
|
|
218
|
+
" ·",
|
|
219
|
+
" ",
|
|
220
|
+
a(e.durationMinutes),
|
|
221
|
+
" · ",
|
|
222
|
+
r(e.billingType)
|
|
223
|
+
]
|
|
224
|
+
}), /* @__PURE__ */ g("p", {
|
|
225
|
+
className: "text-xs text-muted-foreground truncate",
|
|
226
|
+
children: [t ? /* @__PURE__ */ g(m, { children: [
|
|
227
|
+
/* @__PURE__ */ h("span", {
|
|
228
|
+
className: "font-medium",
|
|
229
|
+
children: t.key
|
|
230
|
+
}),
|
|
231
|
+
" ",
|
|
232
|
+
t.title
|
|
233
|
+
] }) : "—", e.description ? ` · ${e.description}` : ""]
|
|
234
|
+
})]
|
|
235
|
+
}), !k && /* @__PURE__ */ g("div", {
|
|
236
|
+
className: "flex shrink-0 gap-1",
|
|
237
|
+
children: [/* @__PURE__ */ h(s, {
|
|
238
|
+
entry: e,
|
|
239
|
+
refetchQueries: O
|
|
240
|
+
}), /* @__PURE__ */ h(o, {
|
|
241
|
+
id: e.id,
|
|
242
|
+
refetchQueries: O
|
|
243
|
+
})]
|
|
244
|
+
})]
|
|
245
|
+
}, e.id);
|
|
246
|
+
})]
|
|
247
|
+
})] })
|
|
248
|
+
]
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
//#endregion
|
|
252
|
+
export { C as TasksTimesheetDetailPagePage };
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=TasksTimesheetDetailPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksTimesheetDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTimesheetDetailPagePage.tsx"],"sourcesContent":["import { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Button, Card, CardContent, CardHeader, CardTitle } from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Lock } from 'lucide-react';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport { SubmitTimesheetButton, TimesheetApprovalActions } from '../time/TimesheetControls';\nimport { EditTimeEntryDialog, DeleteTimeEntryButton } from '../time/TimeEntryControls';\nimport { FROZEN_TIMESHEET_STATUSES, formatMinutes } from '../time/timeShared';\nimport { PersonName } from '../people/People';\nimport { useEntityId } from '../hooks/useEntityId';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\n/**\n * One timesheet (BOFF-8047): its totals, its lifecycle (Submit; Approve/Reject once submitted) and the entries\n * it owns. Entries stay editable here for as long as the SERVICE allows it — DRAFT or REJECTED\n * (`FROZEN_TIMESHEET_STATUSES` mirrors `TimeTrackingService.FROZEN_STATUSES`) — because this page, unlike the\n * Time Entries list, knows its one sheet's status directly and does not need to guess.\n */\n\nconst GET_TIMESHEET = gql`\n query TimesheetDetail($id: ID!) {\n planmagnetTimesheet(id: $id) {\n id\n userId\n periodStart\n periodEnd\n status\n totalMinutes\n billableMinutes\n approverId\n approvedAt\n rejectionReason\n createdBy\n createdAt\n entries {\n id\n workItemId\n workItem {\n id\n key\n title\n }\n description\n durationMinutes\n date\n billingType\n status\n }\n }\n }\n`;\n\ninterface EntryNode {\n id: string;\n workItemId: string;\n workItem: { id: string; key: string; title: string } | null;\n description: string | null;\n durationMinutes: number;\n date: string;\n billingType: string;\n status: string;\n}\n\ninterface TimesheetNode {\n id: string;\n userId: string;\n periodStart: string;\n periodEnd: string;\n status: string;\n totalMinutes: number;\n billableMinutes: number;\n approverId: string | null;\n approvedAt: string | null;\n rejectionReason: string | null;\n createdBy: string;\n createdAt: string;\n entries: EntryNode[];\n}\n\nexport function TasksTimesheetDetailPagePage() {\n const timesheetId = useEntityId('timesheetId');\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<{ planmagnetTimesheet: TimesheetNode | null }>(\n GET_TIMESHEET,\n { variables: { id: timesheetId }, skip: !timesheetId }\n );\n\n if (!timesheetId) {\n return (\n <div className=\"p-6 text-sm text-muted-foreground\">\n No timesheet selected. Open one from the list.\n </div>\n );\n }\n // Only before the first load: a refetch after Submit/Approve/Reject or an entry edit must not blank the page.\n if (loading && !data) {\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"p-6 space-y-3\">\n <p role=\"alert\" className=\"text-sm text-destructive\">\n The timesheet could not be loaded: {error.message}\n </p>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n </div>\n );\n }\n const sheet = data?.planmagnetTimesheet;\n if (!sheet) {\n return (\n <div className=\"p-6 space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n This timesheet does not exist in this workspace.\n </p>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n </div>\n );\n }\n\n const refetchQueries = ['TimesheetDetail', 'TimesheetsList'];\n const frozen = FROZEN_TIMESHEET_STATUSES.has(sheet.status);\n const entries = [...sheet.entries].sort((a, b) => a.date.localeCompare(b.date));\n\n return (\n <div className=\"space-y-6 p-6\">\n <Button size=\"sm\" variant=\"ghost\" onClick={() => navigate('/tasks/timesheets-page')}>\n <ArrowLeft className=\"mr-1 h-4 w-4\" />\n All timesheets\n </Button>\n\n <div className=\"flex flex-wrap items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {new Date(sheet.periodStart).toLocaleDateString()} –{' '}\n {new Date(sheet.periodEnd).toLocaleDateString()}\n </h1>\n <p className=\"text-sm text-muted-foreground mt-1\">\n <PersonName id={sheet.userId} /> · {enumLabel(sheet.status)}\n </p>\n </div>\n <div className=\"flex flex-col items-end gap-2\">\n <SubmitTimesheetButton\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n <TimesheetApprovalActions\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n </div>\n </div>\n\n {sheet.status === 'REJECTED' && sheet.rejectionReason && (\n <p\n role=\"alert\"\n className=\"text-sm text-status-error-text rounded-md border border-destructive/40 p-3\"\n >\n Rejected: {sheet.rejectionReason}\n </p>\n )}\n {sheet.approverId && sheet.approvedAt && (\n <p className=\"text-sm text-muted-foreground\">\n Approved by <PersonName id={sheet.approverId} /> on{' '}\n {new Date(sheet.approvedAt).toLocaleDateString()}\n </p>\n )}\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Total</p>\n <p className=\"text-xl font-bold mt-1\">{formatMinutes(sheet.totalMinutes)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Billable</p>\n <p className=\"text-xl font-bold mt-1\">{formatMinutes(sheet.billableMinutes)}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Entries</p>\n <p className=\"text-xl font-bold mt-1\">{entries.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-xs text-muted-foreground\">Created</p>\n <p className=\"text-sm font-medium mt-1\">\n {new Date(sheet.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n Entries ({entries.length})\n {frozen && (\n <span className=\"flex items-center gap-1 text-xs font-normal text-muted-foreground\">\n <Lock className=\"h-3 w-3\" aria-hidden={true} />\n Locked while {enumLabel(sheet.status).toLowerCase()}\n </span>\n )}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {entries.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">\n No entries in this period yet.\n </p>\n )}\n {entries.map((entry) => {\n const workItem = entry.workItem;\n return (\n <div\n key={entry.id}\n className=\"flex items-start justify-between gap-3 rounded-md border p-3\"\n >\n <div className=\"min-w-0 space-y-1\">\n <p className=\"text-sm font-medium\">\n {new Date(entry.date).toLocaleDateString()} ·{' '}\n {formatMinutes(entry.durationMinutes)} · {enumLabel(entry.billingType)}\n </p>\n <p className=\"text-xs text-muted-foreground truncate\">\n {workItem ? (\n <>\n <span className=\"font-medium\">{workItem.key}</span> {workItem.title}\n </>\n ) : (\n '—'\n )}\n {entry.description ? ` · ${entry.description}` : ''}\n </p>\n </div>\n {!frozen && (\n <div className=\"flex shrink-0 gap-1\">\n <EditTimeEntryDialog entry={entry} refetchQueries={refetchQueries} />\n <DeleteTimeEntryButton id={entry.id} refetchQueries={refetchQueries} />\n </div>\n )}\n </div>\n );\n })}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksTimesheetsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTimesheetsPagePage.tsx"],"names":[],"mappings":"AA6DA,wBAAgB,uBAAuB,4CA4JtC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { PersonName as n } from "../people/People.js";
|
|
3
|
+
import { enumLabel as r } from "../controls/WorkItemControls.js";
|
|
4
|
+
import { ROW_LINK_CLASS as i, detailPath as a, rowLinkProps as o, stopRowActivation as s } from "../utils/rowNavigation.js";
|
|
5
|
+
import { TIME_ENTRY_STATUSES as c, formatMinutes as l } from "../time/timeShared.js";
|
|
6
|
+
import { CreateTimesheetDialog as u, SubmitTimesheetButton as d, TimesheetApprovalActions as f } from "../time/TimesheetControls.js";
|
|
7
|
+
import { useState as p } from "react";
|
|
8
|
+
import { gql as m } from "@apollo/client";
|
|
9
|
+
import { useQuery as h } from "@apollo/client/react";
|
|
10
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
11
|
+
import { useI18n as y } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
12
|
+
//#region src/planmagnet/pages/TasksTimesheetsPagePage.tsx
|
|
13
|
+
var b = m`
|
|
14
|
+
query TimesheetsList(
|
|
15
|
+
$workspaceId: ID!
|
|
16
|
+
$filter: PlanmagnetTimesheetFilter
|
|
17
|
+
$pagination: PlanmagnetPaginationInput
|
|
18
|
+
) {
|
|
19
|
+
planmagnetTimesheets(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
|
|
20
|
+
items {
|
|
21
|
+
id
|
|
22
|
+
userId
|
|
23
|
+
periodStart
|
|
24
|
+
periodEnd
|
|
25
|
+
status
|
|
26
|
+
totalMinutes
|
|
27
|
+
billableMinutes
|
|
28
|
+
}
|
|
29
|
+
totalCount
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
`, x = ["ALL", ...c];
|
|
33
|
+
function S() {
|
|
34
|
+
let { workspaceId: c, currentUser: m } = e(), S = t(), { t: C } = y(), [w, T] = p("mine"), [E, D] = p("ALL"), O = {
|
|
35
|
+
...w === "mine" && m?.id ? { userId: m.id } : {},
|
|
36
|
+
...E === "ALL" ? {} : { status: E }
|
|
37
|
+
}, { data: k, loading: A, error: j } = h(b, {
|
|
38
|
+
variables: {
|
|
39
|
+
workspaceId: c ?? "",
|
|
40
|
+
filter: O,
|
|
41
|
+
pagination: { first: 100 }
|
|
42
|
+
},
|
|
43
|
+
skip: !c
|
|
44
|
+
}), M = k?.planmagnetTimesheets.items ?? [], N = ["TimesheetsList"];
|
|
45
|
+
return /* @__PURE__ */ v("div", {
|
|
46
|
+
className: "space-y-6 p-6",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ v("div", {
|
|
49
|
+
className: "flex flex-wrap items-center justify-between gap-3",
|
|
50
|
+
children: [/* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("h1", {
|
|
51
|
+
className: "text-2xl font-semibold",
|
|
52
|
+
children: C("planmagnet.timesheets.title", "Timesheets")
|
|
53
|
+
}), /* @__PURE__ */ _("p", {
|
|
54
|
+
className: "text-sm text-muted-foreground",
|
|
55
|
+
children: k ? C("planmagnet.timesheets.subtitle", "{{count}} timesheet(s)", { count: k.planmagnetTimesheets.totalCount }) : C("planmagnet.timesheets.subtitleFallback", "Periods of logged time, for approval and billing")
|
|
56
|
+
})] }), /* @__PURE__ */ _(u, {
|
|
57
|
+
refetchQueries: N,
|
|
58
|
+
onCreated: (e) => S(a("/tasks/timesheet-detail-page", e))
|
|
59
|
+
})]
|
|
60
|
+
}),
|
|
61
|
+
/* @__PURE__ */ v("div", {
|
|
62
|
+
className: "flex flex-wrap items-center gap-3",
|
|
63
|
+
children: [/* @__PURE__ */ _("div", {
|
|
64
|
+
className: "flex gap-1",
|
|
65
|
+
role: "group",
|
|
66
|
+
"aria-label": C("planmagnet.timesheets.scope", "Whose timesheets"),
|
|
67
|
+
children: ["mine", "all"].map((e) => /* @__PURE__ */ _("button", {
|
|
68
|
+
type: "button",
|
|
69
|
+
"aria-pressed": w === e,
|
|
70
|
+
onClick: () => T(e),
|
|
71
|
+
className: `px-3 py-1.5 text-sm rounded-md ${w === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
|
|
72
|
+
children: e === "mine" ? C("planmagnet.timesheets.mine", "Mine") : C("planmagnet.timesheets.all", "Everyone")
|
|
73
|
+
}, e))
|
|
74
|
+
}), /* @__PURE__ */ _("div", {
|
|
75
|
+
className: "flex flex-wrap gap-1",
|
|
76
|
+
role: "group",
|
|
77
|
+
"aria-label": C("planmagnet.timesheets.statusFilter", "Filter by status"),
|
|
78
|
+
children: x.map((e) => /* @__PURE__ */ _("button", {
|
|
79
|
+
type: "button",
|
|
80
|
+
"aria-pressed": E === e,
|
|
81
|
+
onClick: () => D(e),
|
|
82
|
+
className: `px-3 py-1.5 text-sm rounded-md ${E === e ? "bg-primary text-primary-foreground" : "text-muted-foreground hover:bg-muted"}`,
|
|
83
|
+
children: e === "ALL" ? C("planmagnet.timesheets.allStatuses", "All") : r(e)
|
|
84
|
+
}, e))
|
|
85
|
+
})]
|
|
86
|
+
}),
|
|
87
|
+
w === "all" && E === "SUBMITTED" && /* @__PURE__ */ _("p", {
|
|
88
|
+
className: "text-xs text-muted-foreground",
|
|
89
|
+
children: C("planmagnet.timesheets.approvalQueueHint", "This is the approval queue: every submitted timesheet in the workspace, waiting on Approve or Reject.")
|
|
90
|
+
}),
|
|
91
|
+
j && /* @__PURE__ */ v("p", {
|
|
92
|
+
role: "alert",
|
|
93
|
+
className: "text-sm text-destructive",
|
|
94
|
+
children: [
|
|
95
|
+
C("planmagnet.timesheets.errorLoading", "Timesheets could not be loaded"),
|
|
96
|
+
":",
|
|
97
|
+
" ",
|
|
98
|
+
j.message
|
|
99
|
+
]
|
|
100
|
+
}),
|
|
101
|
+
A && !k && /* @__PURE__ */ _("div", {
|
|
102
|
+
className: "flex items-center justify-center p-12",
|
|
103
|
+
children: /* @__PURE__ */ _("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
104
|
+
}),
|
|
105
|
+
k && M.length === 0 && !j && /* @__PURE__ */ _("p", {
|
|
106
|
+
className: "text-center text-sm text-muted-foreground py-8",
|
|
107
|
+
children: C("planmagnet.timesheets.empty", "No timesheets match these filters.")
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ _("div", {
|
|
110
|
+
className: "space-y-2",
|
|
111
|
+
children: M.map((e) => /* @__PURE__ */ v("div", {
|
|
112
|
+
...o(() => S(a("/tasks/timesheet-detail-page", e.id)), `${new Date(e.periodStart).toLocaleDateString()} – ${new Date(e.periodEnd).toLocaleDateString()}`),
|
|
113
|
+
className: `flex flex-wrap items-center justify-between gap-3 rounded-md border p-3 ${i}`,
|
|
114
|
+
children: [/* @__PURE__ */ v("div", {
|
|
115
|
+
className: "min-w-0",
|
|
116
|
+
children: [/* @__PURE__ */ v("p", {
|
|
117
|
+
className: "text-sm font-medium",
|
|
118
|
+
children: [
|
|
119
|
+
new Date(e.periodStart).toLocaleDateString(),
|
|
120
|
+
" –",
|
|
121
|
+
" ",
|
|
122
|
+
new Date(e.periodEnd).toLocaleDateString()
|
|
123
|
+
]
|
|
124
|
+
}), /* @__PURE__ */ v("p", {
|
|
125
|
+
className: "text-xs text-muted-foreground",
|
|
126
|
+
children: [
|
|
127
|
+
w === "all" ? /* @__PURE__ */ v(g, { children: [
|
|
128
|
+
/* @__PURE__ */ _(n, { id: e.userId }),
|
|
129
|
+
" ·",
|
|
130
|
+
" "
|
|
131
|
+
] }) : null,
|
|
132
|
+
l(e.totalMinutes),
|
|
133
|
+
" total · ",
|
|
134
|
+
l(e.billableMinutes),
|
|
135
|
+
" ",
|
|
136
|
+
"billable"
|
|
137
|
+
]
|
|
138
|
+
})]
|
|
139
|
+
}), /* @__PURE__ */ v("div", {
|
|
140
|
+
className: "flex items-center gap-2",
|
|
141
|
+
children: [/* @__PURE__ */ _("span", {
|
|
142
|
+
className: "text-xs px-2 py-0.5 rounded-full bg-muted",
|
|
143
|
+
children: r(e.status)
|
|
144
|
+
}), /* @__PURE__ */ v("div", {
|
|
145
|
+
onClick: s,
|
|
146
|
+
children: [/* @__PURE__ */ _(d, {
|
|
147
|
+
id: e.id,
|
|
148
|
+
status: e.status,
|
|
149
|
+
refetchQueries: N
|
|
150
|
+
}), /* @__PURE__ */ _(f, {
|
|
151
|
+
id: e.id,
|
|
152
|
+
status: e.status,
|
|
153
|
+
refetchQueries: N
|
|
154
|
+
})]
|
|
155
|
+
})]
|
|
156
|
+
})]
|
|
157
|
+
}, e.id))
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
//#endregion
|
|
163
|
+
export { S as TasksTimesheetsPagePage };
|
|
164
|
+
|
|
165
|
+
//# sourceMappingURL=TasksTimesheetsPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TasksTimesheetsPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTimesheetsPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { enumLabel } from '../controls/WorkItemControls';\nimport {\n CreateTimesheetDialog,\n SubmitTimesheetButton,\n TimesheetApprovalActions,\n} from '../time/TimesheetControls';\nimport { formatMinutes, TIME_ENTRY_STATUSES } from '../time/timeShared';\nimport { PersonName } from '../people/People';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport {\n rowLinkProps,\n detailPath,\n stopRowActivation,\n ROW_LINK_CLASS,\n} from '../utils/rowNavigation';\n\n/**\n * Timesheets (BOFF-8047): create one for a period, submit it, and — the \"approver view\" the ticket asks for —\n * approve or reject one someone else submitted. There is no separate approvals screen: switching scope to\n * \"Everyone\" and status to \"Submitted\" IS the approval queue, so an approver never has to guess where it is,\n * and the RBAC boundary is enforced where it always is in this MFE — by the gateway refusing the mutation for\n * a caller without the `approve` permission, not by hiding the button (see `TimesheetControls.tsx`).\n */\n\nconst TIMESHEETS = gql`\n query TimesheetsList(\n $workspaceId: ID!\n $filter: PlanmagnetTimesheetFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetTimesheets(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n userId\n periodStart\n periodEnd\n status\n totalMinutes\n billableMinutes\n }\n totalCount\n }\n }\n`;\n\ninterface TimesheetRow {\n id: string;\n userId: string;\n periodStart: string;\n periodEnd: string;\n status: string;\n totalMinutes: number;\n billableMinutes: number;\n}\n\nconst STATUS_TABS = ['ALL', ...TIME_ENTRY_STATUSES] as const;\n\nexport function TasksTimesheetsPagePage() {\n const { workspaceId, currentUser } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n const { t } = useI18n();\n const [scope, setScope] = useState<'mine' | 'all'>('mine');\n const [status, setStatus] = useState<(typeof STATUS_TABS)[number]>('ALL');\n\n const filter = {\n ...(scope === 'mine' && currentUser?.id ? { userId: currentUser.id } : {}),\n ...(status !== 'ALL' ? { status } : {}),\n };\n const { data, loading, error } = useQuery<{\n planmagnetTimesheets: { items: TimesheetRow[]; totalCount: number };\n }>(TIMESHEETS, {\n variables: { workspaceId: workspaceId ?? '', filter, pagination: { first: 100 } },\n skip: !workspaceId,\n });\n\n const timesheets = data?.planmagnetTimesheets.items ?? [];\n const refetchQueries = ['TimesheetsList'];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {t('planmagnet.timesheets.title', 'Timesheets')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {data\n ? t('planmagnet.timesheets.subtitle', '{{count}} timesheet(s)', {\n count: data.planmagnetTimesheets.totalCount,\n })\n : t(\n 'planmagnet.timesheets.subtitleFallback',\n 'Periods of logged time, for approval and billing'\n )}\n </p>\n </div>\n <CreateTimesheetDialog\n refetchQueries={refetchQueries}\n onCreated={(id) => navigate(detailPath('/tasks/timesheet-detail-page', id))}\n />\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <div\n className=\"flex gap-1\"\n role=\"group\"\n aria-label={t('planmagnet.timesheets.scope', 'Whose timesheets')}\n >\n {(['mine', 'all'] as const).map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={scope === s}\n onClick={() => setScope(s)}\n className={`px-3 py-1.5 text-sm rounded-md ${scope === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'mine'\n ? t('planmagnet.timesheets.mine', 'Mine')\n : t('planmagnet.timesheets.all', 'Everyone')}\n </button>\n ))}\n </div>\n <div\n className=\"flex flex-wrap gap-1\"\n role=\"group\"\n aria-label={t('planmagnet.timesheets.statusFilter', 'Filter by status')}\n >\n {STATUS_TABS.map((s) => (\n <button\n key={s}\n type=\"button\"\n aria-pressed={status === s}\n onClick={() => setStatus(s)}\n className={`px-3 py-1.5 text-sm rounded-md ${status === s ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-muted'}`}\n >\n {s === 'ALL' ? t('planmagnet.timesheets.allStatuses', 'All') : enumLabel(s)}\n </button>\n ))}\n </div>\n </div>\n {scope === 'all' && status === 'SUBMITTED' && (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'planmagnet.timesheets.approvalQueueHint',\n 'This is the approval queue: every submitted timesheet in the workspace, waiting on Approve or Reject.'\n )}\n </p>\n )}\n\n {error && (\n <p role=\"alert\" className=\"text-sm text-destructive\">\n {t('planmagnet.timesheets.errorLoading', 'Timesheets could not be loaded')}:{' '}\n {error.message}\n </p>\n )}\n {loading && !data && (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n )}\n {data && timesheets.length === 0 && !error && (\n <p className=\"text-center text-sm text-muted-foreground py-8\">\n {t('planmagnet.timesheets.empty', 'No timesheets match these filters.')}\n </p>\n )}\n\n <div className=\"space-y-2\">\n {timesheets.map((sheet) => (\n <div\n key={sheet.id}\n {...rowLinkProps(\n () => navigate(detailPath('/tasks/timesheet-detail-page', sheet.id)),\n `${new Date(sheet.periodStart).toLocaleDateString()} – ${new Date(sheet.periodEnd).toLocaleDateString()}`\n )}\n className={`flex flex-wrap items-center justify-between gap-3 rounded-md border p-3 ${ROW_LINK_CLASS}`}\n >\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium\">\n {new Date(sheet.periodStart).toLocaleDateString()} –{' '}\n {new Date(sheet.periodEnd).toLocaleDateString()}\n </p>\n <p className=\"text-xs text-muted-foreground\">\n {scope === 'all' ? (\n <>\n <PersonName id={sheet.userId} /> ·{' '}\n </>\n ) : null}\n {formatMinutes(sheet.totalMinutes)} total · {formatMinutes(sheet.billableMinutes)}{' '}\n billable\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs px-2 py-0.5 rounded-full bg-muted\">\n {enumLabel(sheet.status)}\n </span>\n <div onClick={stopRowActivation}>\n <SubmitTimesheetButton\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n <TimesheetApprovalActions\n id={sheet.id}\n status={sheet.status}\n refetchQueries={refetchQueries}\n />\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA4BA,IAAM,IAAa,CAAG;;;;;;;;;;;;;;;;;;;GA+BhB,IAAc,CAAC,OAAO,GAAG,EAAoB;AAEnD,SAAgB,IAA0B;CACxC,IAAM,EAAE,gBAAa,mBAAgB,GAAe,EAC9C,IAAW,GAAuB,EAClC,EAAE,SAAM,GAAS,EACjB,CAAC,GAAO,KAAY,EAAyB,OAAO,EACpD,CAAC,GAAQ,KAAa,EAAuC,MAAM,EAEnE,IAAS;EACb,GAAI,MAAU,UAAU,GAAa,KAAK,EAAE,QAAQ,EAAY,IAAI,GAAG,EAAE;EACzE,GAAI,MAAW,QAAqB,EAAE,GAAf,EAAE,WAAQ;EAClC,EACK,EAAE,SAAM,YAAS,aAAU,EAE9B,GAAY;EACb,WAAW;GAAE,aAAa,KAAe;GAAI;GAAQ,YAAY,EAAE,OAAO,KAAK;GAAE;EACjF,MAAM,CAAC;EACR,CAAC,EAEI,IAAa,GAAM,qBAAqB,SAAS,EAAE,EACnD,IAAiB,CAAC,iBAAiB;AAEzC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACX,EAAE,+BAA+B,aAAa;KAC5C,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eACV,IACG,EAAE,kCAAkC,0BAA0B,EAC5D,OAAO,EAAK,qBAAqB,YAClC,CAAC,GACF,EACE,0CACA,mDACD;KACH,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,GAAD;KACkB;KAChB,YAAY,MAAO,EAAS,EAAW,gCAAgC,EAAG,CAAC;KAC3E,CAAA,CACE;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KACE,WAAU;KACV,MAAK;KACL,cAAY,EAAE,+BAA+B,mBAAmB;eAE9D,CAAC,QAAQ,MAAM,CAAW,KAAK,MAC/B,kBAAC,UAAD;MAEE,MAAK;MACL,gBAAc,MAAU;MACxB,eAAe,EAAS,EAAE;MAC1B,WAAW,kCAAkC,MAAU,IAAI,uCAAuC;gBAEjG,MAAM,SACH,EAAE,8BAA8B,OAAO,GACvC,EAAE,6BAA6B,WAAW;MACvC,EATF,EASE,CACT;KACE,CAAA,EACN,kBAAC,OAAD;KACE,WAAU;KACV,MAAK;KACL,cAAY,EAAE,sCAAsC,mBAAmB;eAEtE,EAAY,KAAK,MAChB,kBAAC,UAAD;MAEE,MAAK;MACL,gBAAc,MAAW;MACzB,eAAe,EAAU,EAAE;MAC3B,WAAW,kCAAkC,MAAW,IAAI,uCAAuC;gBAElG,MAAM,QAAQ,EAAE,qCAAqC,MAAM,GAAG,EAAU,EAAE;MACpE,EAPF,EAOE,CACT;KACE,CAAA,CACF;;GACL,MAAU,SAAS,MAAW,eAC7B,kBAAC,KAAD;IAAG,WAAU;cACV,EACC,2CACA,wGACD;IACC,CAAA;GAGL,KACC,kBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;cAA1B;KACG,EAAE,sCAAsC,iCAAiC;KAAC;KAAE;KAC5E,EAAM;KACL;;GAEL,KAAW,CAAC,KACX,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;IAC9F,CAAA;GAEP,KAAQ,EAAW,WAAW,KAAK,CAAC,KACnC,kBAAC,KAAD;IAAG,WAAU;cACV,EAAE,+BAA+B,qCAAqC;IACrE,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAW,KAAK,MACf,kBAAC,OAAD;KAEE,GAAI,QACI,EAAS,EAAW,gCAAgC,EAAM,GAAG,CAAC,EACpE,GAAG,IAAI,KAAK,EAAM,YAAY,CAAC,oBAAoB,CAAC,KAAK,IAAI,KAAK,EAAM,UAAU,CAAC,oBAAoB,GACxG;KACD,WAAW,2EAA2E;eANxF,CAQE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,IAAI,KAAK,EAAM,YAAY,CAAC,oBAAoB;QAAC;QAAG;QACpD,IAAI,KAAK,EAAM,UAAU,CAAC,oBAAoB;QAC7C;UACJ,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,MAAU,QACT,kBAAA,GAAA,EAAA,UAAA;SACE,kBAAC,GAAD,EAAY,IAAI,EAAM,QAAU,CAAA;;SAAG;SAClC,EAAA,CAAA,GACD;QACH,EAAc,EAAM,aAAa;QAAC;QAAU,EAAc,EAAM,gBAAgB;QAAE;QAAI;QAErF;SACA;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,QAAD;OAAM,WAAU;iBACb,EAAU,EAAM,OAAO;OACnB,CAAA,EACP,kBAAC,OAAD;OAAK,SAAS;iBAAd,CACE,kBAAC,GAAD;QACE,IAAI,EAAM;QACV,QAAQ,EAAM;QACE;QAChB,CAAA,EACF,kBAAC,GAAD;QACE,IAAI,EAAM;QACV,QAAQ,EAAM;QACE;QAChB,CAAA,CACE;SACF;QACF;OAvCC,EAAM,GAuCP,CACN;IACE,CAAA;GACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesEditTemplatePagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TemplatesEditTemplatePagePage.tsx"],"names":[],"mappings":"AAoHA,wBAAgB,6BAA6B,4CAmQ5C"}
|