@burdenoff/microfe-planmagnet 2026.928.8 → 2026.928.9
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/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +18 -14
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/controls/WorkItemControls.d.ts +21 -0
- package/dist/planmagnet/controls/WorkItemControls.d.ts.map +1 -1
- package/dist/planmagnet/controls/WorkItemControls.js +34 -15
- package/dist/planmagnet/controls/WorkItemControls.js.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +0 -7
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +517 -39
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksMyWorkPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksMyWorkPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksMyWorkPagePage.js +257 -0
- package/dist/planmagnet/pages/TasksMyWorkPagePage.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanMagnetRoutes.d.ts","sourceRoot":"","sources":["../../src/planmagnet/PlanMagnetRoutes.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PlanMagnetRoutes.d.ts","sourceRoot":"","sources":["../../src/planmagnet/PlanMagnetRoutes.tsx"],"names":[],"mappings":"AAmVA,wBAAgB,gBAAgB,4CAkN/B"}
|
|
@@ -4,16 +4,16 @@ import { Loader2 as ee } from "lucide-react";
|
|
|
4
4
|
import { Route as r, Routes as i } from "react-router";
|
|
5
5
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
6
|
//#region src/planmagnet/PlanMagnetRoutes.tsx
|
|
7
|
-
var te = n(() => import("./pages/NotFoundPage.js").then((e) => ({ default: e.PlanMagnetNotFoundPage }))), ne = n(() => import("./pages/DocsDocsPagePage.js").then((e) => ({ default: e.DocsDocsPagePage }))), s = n(() => import("./pages/DocsDocDetailPagePage.js").then((e) => ({ default: e.DocsDocDetailPagePage }))), c = n(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), l = n(() => import("./pages/ProductsCreateProductPagePage.js").then((e) => ({ default: e.ProductsCreateProductPagePage }))), re = n(() => import("./pages/ProductsCreateRoadmapPagePage.js").then((e) => ({ default: e.ProductsCreateRoadmapPagePage }))), u = n(() => import("./pages/ProductsEditProductPagePage.js").then((e) => ({ default: e.ProductsEditProductPagePage }))), d = n(() => import("./pages/ProductsEditReleasePagePage.js").then((e) => ({ default: e.ProductsEditReleasePagePage }))), f = n(() => import("./pages/ProductsFeatureAnalyticsPagePage.js").then((e) => ({ default: e.ProductsFeatureAnalyticsPagePage }))), p = n(() => import("./pages/ProductsFeatureDetailPagePage.js").then((e) => ({ default: e.ProductsFeatureDetailPagePage }))), m = n(() => import("./pages/ProductsFeaturesPagePage.js").then((e) => ({ default: e.ProductsFeaturesPagePage }))), h = n(() => import("./pages/ProductsNewFeaturePagePage.js").then((e) => ({ default: e.ProductsNewFeaturePagePage }))), g = n(() => import("./pages/ProductsProductDetailPagePage.js").then((e) => ({ default: e.ProductsProductDetailPagePage }))), ie = n(() => import("./pages/ProductsProductsPagePage.js").then((e) => ({ default: e.ProductsProductsPagePage }))), _ = n(() => import("./pages/ProductsReleaseDetailPagePage.js").then((e) => ({ default: e.ProductsReleaseDetailPagePage }))), ae = n(() => import("./pages/ProductsReleasesPagePage.js").then((e) => ({ default: e.ProductsReleasesPagePage }))), v = n(() => import("./pages/ProductsRoadmapAnalyticsPagePage.js").then((e) => ({ default: e.ProductsRoadmapAnalyticsPagePage }))), y = n(() => import("./pages/ProductsRoadmapDetailPagePage.js").then((e) => ({ default: e.ProductsRoadmapDetailPagePage }))), oe = n(() => import("./pages/ProductsRoadmapsPagePage.js").then((e) => ({ default: e.ProductsRoadmapsPagePage }))), se = n(() => import("./pages/PortfoliosPortfoliosPagePage.js").then((e) => ({ default: e.PortfoliosPortfoliosPagePage }))), b = n(() => import("./pages/PortfoliosCreatePortfolioPagePage.js").then((e) => ({ default: e.PortfoliosCreatePortfolioPagePage }))), x = n(() => import("./pages/PortfoliosPortfolioDetailPagePage.js").then((e) => ({ default: e.PortfoliosPortfolioDetailPagePage }))), S = n(() => import("./pages/PortfoliosEditPortfolioPagePage.js").then((e) => ({ default: e.PortfoliosEditPortfolioPagePage }))), C = n(() => import("./pages/ProgramsProgramsPagePage.js").then((e) => ({ default: e.ProgramsProgramsPagePage }))), w = n(() => import("./pages/ProgramsCreateProgramPagePage.js").then((e) => ({ default: e.ProgramsCreateProgramPagePage }))), T = n(() => import("./pages/ProgramsProgramDetailPagePage.js").then((e) => ({ default: e.ProgramsProgramDetailPagePage }))), E = n(() => import("./pages/ProgramsEditProgramPagePage.js").then((e) => ({ default: e.ProgramsEditProgramPagePage }))), D = n(() => import("./pages/CompetitorsCompetitorsPagePage.js").then((e) => ({ default: e.CompetitorsCompetitorsPagePage }))), O = n(() => import("./pages/CompetitorsCreateCompetitorPagePage.js").then((e) => ({ default: e.CompetitorsCreateCompetitorPagePage }))), k = n(() => import("./pages/CompetitorsCompetitorDetailPagePage.js").then((e) => ({ default: e.CompetitorsCompetitorDetailPagePage }))), A = n(() => import("./pages/CompetitorsEditCompetitorPagePage.js").then((e) => ({ default: e.CompetitorsEditCompetitorPagePage }))), j = n(() => import("./pages/ProjectsActiveProjectsPagePage.js").then((e) => ({ default: e.ProjectsActiveProjectsPagePage }))), M = n(() => import("./pages/ProjectsCreateProjectPagePage.js").then((e) => ({ default: e.ProjectsCreateProjectPagePage }))), N = n(() => import("./pages/ProjectsEditProjectPagePage.js").then((e) => ({ default: e.ProjectsEditProjectPagePage }))), P = n(() => import("./pages/ProjectsMilestoneDetailPagePage.js").then((e) => ({ default: e.ProjectsMilestoneDetailPagePage }))), F = n(() => import("./pages/ProjectsBudgetsPagePage.js").then((e) => ({ default: e.ProjectsBudgetsPagePage }))), I = n(() => import("./pages/ProjectsBudgetDetailPagePage.js").then((e) => ({ default: e.ProjectsBudgetDetailPagePage }))), L = n(() => import("./pages/TasksTimeEntriesPagePage.js").then((e) => ({ default: e.TasksTimeEntriesPagePage }))), R = n(() => import("./pages/TasksTimesheetsPagePage.js").then((e) => ({ default: e.TasksTimesheetsPagePage }))), z = n(() => import("./pages/TasksTimesheetDetailPagePage.js").then((e) => ({ default: e.TasksTimesheetDetailPagePage }))), B = n(() => import("./pages/GoalsGoalsPagePage.js").then((e) => ({ default: e.GoalsGoalsPagePage }))), V = n(() => import("./pages/GoalsCreateObjectivePagePage.js").then((e) => ({ default: e.GoalsCreateObjectivePagePage }))), H = n(() => import("./pages/GoalsObjectiveDetailPagePage.js").then((e) => ({ default: e.GoalsObjectiveDetailPagePage }))), U = n(() => import("./pages/ProjectsMilestonesPagePage.js").then((e) => ({ default: e.ProjectsMilestonesPagePage }))), W = n(() => import("./pages/ProjectsPlanningDetailPagePage.js").then((e) => ({ default: e.ProjectsPlanningDetailPagePage }))), G = n(() => import("./pages/ProjectsPlanningEditPagePage.js").then((e) => ({ default: e.ProjectsPlanningEditPagePage }))), K = n(() => import("./pages/ProjectsPlanningPagePage.js").then((e) => ({ default: e.ProjectsPlanningPagePage }))), q = n(() => import("./pages/ProjectsProjectDetailPagePage.js").then((e) => ({ default: e.ProjectsProjectDetailPagePage }))), ce = n(() => import("./pages/ProjectsProjectsPagePage.js").then((e) => ({ default: e.ProjectsProjectsPagePage }))), le = n(() => import("./pages/ReportsCreateReportPagePage.js").then((e) => ({ default: e.ReportsCreateReportPagePage }))), ue = n(() => import("./pages/ReportsReportsPagePage.js").then((e) => ({ default: e.ReportsReportsPagePage }))), de = n(() => import("./pages/SprintsStartSprintPagePage.js").then((e) => ({ default: e.SprintsStartSprintPagePage }))), fe = n(() => import("./pages/TasksCreateTaskPagePage.js").then((e) => ({ default: e.TasksCreateTaskPagePage }))), pe = n(() => import("./pages/TasksEditTaskPagePage.js").then((e) => ({ default: e.TasksEditTaskPagePage }))), me = n(() => import("./pages/ProjectsWorkflowPagePage.js").then((e) => ({ default: e.ProjectsWorkflowPagePage }))), he = n(() => import("./pages/ProjectsCustomFieldsPagePage.js").then((e) => ({ default: e.ProjectsCustomFieldsPagePage }))), ge = n(() => import("./pages/TasksImportPagePage.js").then((e) => ({ default: e.TasksImportPagePage }))), _e = n(() => import("./pages/TasksTaskDetailPagePage.js").then((e) => ({ default: e.TasksTaskDetailPagePage }))), ve = n(() => import("./pages/TasksTasksPagePage.js").then((e) => ({ default: e.TasksTasksPagePage }))), ye = n(() => import("./pages/TeamCreateTeamPagePage.js").then((e) => ({ default: e.TeamCreateTeamPagePage }))),
|
|
8
|
-
function
|
|
7
|
+
var te = n(() => import("./pages/NotFoundPage.js").then((e) => ({ default: e.PlanMagnetNotFoundPage }))), ne = n(() => import("./pages/DocsDocsPagePage.js").then((e) => ({ default: e.DocsDocsPagePage }))), s = n(() => import("./pages/DocsDocDetailPagePage.js").then((e) => ({ default: e.DocsDocDetailPagePage }))), c = n(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), l = n(() => import("./pages/ProductsCreateProductPagePage.js").then((e) => ({ default: e.ProductsCreateProductPagePage }))), re = n(() => import("./pages/ProductsCreateRoadmapPagePage.js").then((e) => ({ default: e.ProductsCreateRoadmapPagePage }))), u = n(() => import("./pages/ProductsEditProductPagePage.js").then((e) => ({ default: e.ProductsEditProductPagePage }))), d = n(() => import("./pages/ProductsEditReleasePagePage.js").then((e) => ({ default: e.ProductsEditReleasePagePage }))), f = n(() => import("./pages/ProductsFeatureAnalyticsPagePage.js").then((e) => ({ default: e.ProductsFeatureAnalyticsPagePage }))), p = n(() => import("./pages/ProductsFeatureDetailPagePage.js").then((e) => ({ default: e.ProductsFeatureDetailPagePage }))), m = n(() => import("./pages/ProductsFeaturesPagePage.js").then((e) => ({ default: e.ProductsFeaturesPagePage }))), h = n(() => import("./pages/ProductsNewFeaturePagePage.js").then((e) => ({ default: e.ProductsNewFeaturePagePage }))), g = n(() => import("./pages/ProductsProductDetailPagePage.js").then((e) => ({ default: e.ProductsProductDetailPagePage }))), ie = n(() => import("./pages/ProductsProductsPagePage.js").then((e) => ({ default: e.ProductsProductsPagePage }))), _ = n(() => import("./pages/ProductsReleaseDetailPagePage.js").then((e) => ({ default: e.ProductsReleaseDetailPagePage }))), ae = n(() => import("./pages/ProductsReleasesPagePage.js").then((e) => ({ default: e.ProductsReleasesPagePage }))), v = n(() => import("./pages/ProductsRoadmapAnalyticsPagePage.js").then((e) => ({ default: e.ProductsRoadmapAnalyticsPagePage }))), y = n(() => import("./pages/ProductsRoadmapDetailPagePage.js").then((e) => ({ default: e.ProductsRoadmapDetailPagePage }))), oe = n(() => import("./pages/ProductsRoadmapsPagePage.js").then((e) => ({ default: e.ProductsRoadmapsPagePage }))), se = n(() => import("./pages/PortfoliosPortfoliosPagePage.js").then((e) => ({ default: e.PortfoliosPortfoliosPagePage }))), b = n(() => import("./pages/PortfoliosCreatePortfolioPagePage.js").then((e) => ({ default: e.PortfoliosCreatePortfolioPagePage }))), x = n(() => import("./pages/PortfoliosPortfolioDetailPagePage.js").then((e) => ({ default: e.PortfoliosPortfolioDetailPagePage }))), S = n(() => import("./pages/PortfoliosEditPortfolioPagePage.js").then((e) => ({ default: e.PortfoliosEditPortfolioPagePage }))), C = n(() => import("./pages/ProgramsProgramsPagePage.js").then((e) => ({ default: e.ProgramsProgramsPagePage }))), w = n(() => import("./pages/ProgramsCreateProgramPagePage.js").then((e) => ({ default: e.ProgramsCreateProgramPagePage }))), T = n(() => import("./pages/ProgramsProgramDetailPagePage.js").then((e) => ({ default: e.ProgramsProgramDetailPagePage }))), E = n(() => import("./pages/ProgramsEditProgramPagePage.js").then((e) => ({ default: e.ProgramsEditProgramPagePage }))), D = n(() => import("./pages/CompetitorsCompetitorsPagePage.js").then((e) => ({ default: e.CompetitorsCompetitorsPagePage }))), O = n(() => import("./pages/CompetitorsCreateCompetitorPagePage.js").then((e) => ({ default: e.CompetitorsCreateCompetitorPagePage }))), k = n(() => import("./pages/CompetitorsCompetitorDetailPagePage.js").then((e) => ({ default: e.CompetitorsCompetitorDetailPagePage }))), A = n(() => import("./pages/CompetitorsEditCompetitorPagePage.js").then((e) => ({ default: e.CompetitorsEditCompetitorPagePage }))), j = n(() => import("./pages/ProjectsActiveProjectsPagePage.js").then((e) => ({ default: e.ProjectsActiveProjectsPagePage }))), M = n(() => import("./pages/ProjectsCreateProjectPagePage.js").then((e) => ({ default: e.ProjectsCreateProjectPagePage }))), N = n(() => import("./pages/ProjectsEditProjectPagePage.js").then((e) => ({ default: e.ProjectsEditProjectPagePage }))), P = n(() => import("./pages/ProjectsMilestoneDetailPagePage.js").then((e) => ({ default: e.ProjectsMilestoneDetailPagePage }))), F = n(() => import("./pages/ProjectsBudgetsPagePage.js").then((e) => ({ default: e.ProjectsBudgetsPagePage }))), I = n(() => import("./pages/ProjectsBudgetDetailPagePage.js").then((e) => ({ default: e.ProjectsBudgetDetailPagePage }))), L = n(() => import("./pages/TasksTimeEntriesPagePage.js").then((e) => ({ default: e.TasksTimeEntriesPagePage }))), R = n(() => import("./pages/TasksTimesheetsPagePage.js").then((e) => ({ default: e.TasksTimesheetsPagePage }))), z = n(() => import("./pages/TasksTimesheetDetailPagePage.js").then((e) => ({ default: e.TasksTimesheetDetailPagePage }))), B = n(() => import("./pages/GoalsGoalsPagePage.js").then((e) => ({ default: e.GoalsGoalsPagePage }))), V = n(() => import("./pages/GoalsCreateObjectivePagePage.js").then((e) => ({ default: e.GoalsCreateObjectivePagePage }))), H = n(() => import("./pages/GoalsObjectiveDetailPagePage.js").then((e) => ({ default: e.GoalsObjectiveDetailPagePage }))), U = n(() => import("./pages/ProjectsMilestonesPagePage.js").then((e) => ({ default: e.ProjectsMilestonesPagePage }))), W = n(() => import("./pages/ProjectsPlanningDetailPagePage.js").then((e) => ({ default: e.ProjectsPlanningDetailPagePage }))), G = n(() => import("./pages/ProjectsPlanningEditPagePage.js").then((e) => ({ default: e.ProjectsPlanningEditPagePage }))), K = n(() => import("./pages/ProjectsPlanningPagePage.js").then((e) => ({ default: e.ProjectsPlanningPagePage }))), q = n(() => import("./pages/ProjectsProjectDetailPagePage.js").then((e) => ({ default: e.ProjectsProjectDetailPagePage }))), ce = n(() => import("./pages/ProjectsProjectsPagePage.js").then((e) => ({ default: e.ProjectsProjectsPagePage }))), le = n(() => import("./pages/ReportsCreateReportPagePage.js").then((e) => ({ default: e.ReportsCreateReportPagePage }))), ue = n(() => import("./pages/ReportsReportsPagePage.js").then((e) => ({ default: e.ReportsReportsPagePage }))), de = n(() => import("./pages/SprintsStartSprintPagePage.js").then((e) => ({ default: e.SprintsStartSprintPagePage }))), fe = n(() => import("./pages/TasksCreateTaskPagePage.js").then((e) => ({ default: e.TasksCreateTaskPagePage }))), pe = n(() => import("./pages/TasksEditTaskPagePage.js").then((e) => ({ default: e.TasksEditTaskPagePage }))), me = n(() => import("./pages/ProjectsWorkflowPagePage.js").then((e) => ({ default: e.ProjectsWorkflowPagePage }))), he = n(() => import("./pages/ProjectsCustomFieldsPagePage.js").then((e) => ({ default: e.ProjectsCustomFieldsPagePage }))), ge = n(() => import("./pages/TasksImportPagePage.js").then((e) => ({ default: e.TasksImportPagePage }))), _e = n(() => import("./pages/TasksTaskDetailPagePage.js").then((e) => ({ default: e.TasksTaskDetailPagePage }))), ve = n(() => import("./pages/TasksTasksPagePage.js").then((e) => ({ default: e.TasksTasksPagePage }))), ye = n(() => import("./pages/TasksMyWorkPagePage.js").then((e) => ({ default: e.TasksMyWorkPagePage }))), be = n(() => import("./pages/TeamCreateTeamPagePage.js").then((e) => ({ default: e.TeamCreateTeamPagePage }))), xe = n(() => import("./pages/TeamInviteMemberPagePage.js").then((e) => ({ default: e.TeamInviteMemberPagePage }))), Se = n(() => import("./pages/TeamTeamPagePage.js").then((e) => ({ default: e.TeamTeamPagePage }))), Ce = n(() => import("./pages/TeamTeamsListPagePage.js").then((e) => ({ default: e.TeamTeamsListPagePage }))), J = n(() => import("./pages/TeamTeamDetailPagePage.js").then((e) => ({ default: e.TeamTeamDetailPagePage }))), Y = n(() => import("./pages/TeamTeamEditPagePage.js").then((e) => ({ default: e.TeamTeamEditPagePage }))), we = n(() => import("./pages/WorkspaceCreateWorkspacePagePage.js").then((e) => ({ default: e.WorkspaceCreateWorkspacePagePage }))), Te = n(() => import("./pages/AutomationAutomationRulesPagePage.js").then((e) => ({ default: e.AutomationAutomationRulesPagePage }))), Ee = n(() => import("./pages/AutomationCreateAutomationRulePagePage.js").then((e) => ({ default: e.AutomationCreateAutomationRulePagePage }))), X = n(() => import("./pages/AutomationAutomationRuleDetailPagePage.js").then((e) => ({ default: e.AutomationAutomationRuleDetailPagePage }))), De = n(() => import("./pages/TemplatesTemplatesPagePage.js").then((e) => ({ default: e.TemplatesTemplatesPagePage }))), Z = n(() => import("./pages/TemplatesEditTemplatePagePage.js").then((e) => ({ default: e.TemplatesEditTemplatePagePage }))), Oe = n(() => import("./pages/RisksRiskRegisterPagePage.js").then((e) => ({ default: e.RisksRiskRegisterPagePage }))), Q = n(() => import("./pages/RisksRiskDetailPagePage.js").then((e) => ({ default: e.RisksRiskDetailPagePage }))), $ = n(() => import("./pages/ProjectsCriticalPathPagePage.js").then((e) => ({ default: e.ProjectsCriticalPathPagePage })));
|
|
8
|
+
function ke() {
|
|
9
9
|
return /* @__PURE__ */ a("div", {
|
|
10
10
|
className: "flex min-h-[320px] items-center justify-center",
|
|
11
11
|
children: /* @__PURE__ */ a(ee, { className: "h-8 w-8 animate-spin text-primary" })
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function Ae() {
|
|
15
15
|
return /* @__PURE__ */ a(t, {
|
|
16
|
-
fallback: /* @__PURE__ */ a(
|
|
16
|
+
fallback: /* @__PURE__ */ a(ke, {}),
|
|
17
17
|
children: /* @__PURE__ */ o(i, { children: [
|
|
18
18
|
/* @__PURE__ */ a(r, {
|
|
19
19
|
index: !0,
|
|
@@ -263,6 +263,10 @@ function ke() {
|
|
|
263
263
|
path: "goals/objective-detail-page",
|
|
264
264
|
element: /* @__PURE__ */ a(H, {})
|
|
265
265
|
}),
|
|
266
|
+
/* @__PURE__ */ a(r, {
|
|
267
|
+
path: "tasks/my-work-page",
|
|
268
|
+
element: /* @__PURE__ */ a(ye, {})
|
|
269
|
+
}),
|
|
266
270
|
/* @__PURE__ */ a(r, {
|
|
267
271
|
path: "tasks/tasks-page",
|
|
268
272
|
element: /* @__PURE__ */ a(ve, {})
|
|
@@ -321,11 +325,11 @@ function ke() {
|
|
|
321
325
|
}),
|
|
322
326
|
/* @__PURE__ */ a(r, {
|
|
323
327
|
path: "team/team-page",
|
|
324
|
-
element: /* @__PURE__ */ a(
|
|
328
|
+
element: /* @__PURE__ */ a(Se, {})
|
|
325
329
|
}),
|
|
326
330
|
/* @__PURE__ */ a(r, {
|
|
327
331
|
path: "team/teams-page",
|
|
328
|
-
element: /* @__PURE__ */ a(
|
|
332
|
+
element: /* @__PURE__ */ a(Ce, {})
|
|
329
333
|
}),
|
|
330
334
|
/* @__PURE__ */ a(r, {
|
|
331
335
|
path: "team/team-detail-page",
|
|
@@ -345,23 +349,23 @@ function ke() {
|
|
|
345
349
|
}),
|
|
346
350
|
/* @__PURE__ */ a(r, {
|
|
347
351
|
path: "team/create-team-page",
|
|
348
|
-
element: /* @__PURE__ */ a(
|
|
352
|
+
element: /* @__PURE__ */ a(be, {})
|
|
349
353
|
}),
|
|
350
354
|
/* @__PURE__ */ a(r, {
|
|
351
355
|
path: "team/invite-member-page",
|
|
352
|
-
element: /* @__PURE__ */ a(
|
|
356
|
+
element: /* @__PURE__ */ a(xe, {})
|
|
353
357
|
}),
|
|
354
358
|
/* @__PURE__ */ a(r, {
|
|
355
359
|
path: "workspace/create-workspace-page",
|
|
356
|
-
element: /* @__PURE__ */ a(
|
|
360
|
+
element: /* @__PURE__ */ a(we, {})
|
|
357
361
|
}),
|
|
358
362
|
/* @__PURE__ */ a(r, {
|
|
359
363
|
path: "automation/automation-rules-page",
|
|
360
|
-
element: /* @__PURE__ */ a(
|
|
364
|
+
element: /* @__PURE__ */ a(Te, {})
|
|
361
365
|
}),
|
|
362
366
|
/* @__PURE__ */ a(r, {
|
|
363
367
|
path: "automation/create-automation-rule-page",
|
|
364
|
-
element: /* @__PURE__ */ a(
|
|
368
|
+
element: /* @__PURE__ */ a(Ee, {})
|
|
365
369
|
}),
|
|
366
370
|
/* @__PURE__ */ a(r, {
|
|
367
371
|
path: "automation/automation-rule-detail-page",
|
|
@@ -373,7 +377,7 @@ function ke() {
|
|
|
373
377
|
}),
|
|
374
378
|
/* @__PURE__ */ a(r, {
|
|
375
379
|
path: "templates/templates-page",
|
|
376
|
-
element: /* @__PURE__ */ a(
|
|
380
|
+
element: /* @__PURE__ */ a(De, {})
|
|
377
381
|
}),
|
|
378
382
|
/* @__PURE__ */ a(r, {
|
|
379
383
|
path: "templates/edit-template-page",
|
|
@@ -385,7 +389,7 @@ function ke() {
|
|
|
385
389
|
}),
|
|
386
390
|
/* @__PURE__ */ a(r, {
|
|
387
391
|
path: "risks/risk-register-page",
|
|
388
|
-
element: /* @__PURE__ */ a(
|
|
392
|
+
element: /* @__PURE__ */ a(Oe, {})
|
|
389
393
|
}),
|
|
390
394
|
/* @__PURE__ */ a(r, {
|
|
391
395
|
path: "risks/risk-detail-page",
|
|
@@ -407,6 +411,6 @@ function ke() {
|
|
|
407
411
|
});
|
|
408
412
|
}
|
|
409
413
|
//#endregion
|
|
410
|
-
export {
|
|
414
|
+
export { Ae as PlanMagnetRoutes };
|
|
411
415
|
|
|
412
416
|
//# sourceMappingURL=PlanMagnetRoutes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlanMagnetRoutes.js","names":[],"sources":["../../src/planmagnet/PlanMagnetRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Route, Routes } from 'react-router';\nimport { Loader2 } from 'lucide-react';\nimport { AnalyticsAnalyticsPagePage } from './pages/AnalyticsAnalyticsPagePage';\n\nconst PlanMagnetNotFoundPage = lazy(() =>\n import('./pages/NotFoundPage').then((m) => ({ default: m.PlanMagnetNotFoundPage }))\n);\nconst DocsDocsPagePage = lazy(() =>\n import('./pages/DocsDocsPagePage').then((m) => ({ default: m.DocsDocsPagePage }))\n);\nconst DocsDocDetailPagePage = lazy(() =>\n import('./pages/DocsDocDetailPagePage').then((m) => ({ default: m.DocsDocDetailPagePage }))\n);\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst ProductsCreateProductPagePage = lazy(() =>\n import('./pages/ProductsCreateProductPagePage').then((m) => ({\n default: m.ProductsCreateProductPagePage,\n }))\n);\nconst ProductsCreateRoadmapPagePage = lazy(() =>\n import('./pages/ProductsCreateRoadmapPagePage').then((m) => ({\n default: m.ProductsCreateRoadmapPagePage,\n }))\n);\nconst ProductsEditProductPagePage = lazy(() =>\n import('./pages/ProductsEditProductPagePage').then((m) => ({\n default: m.ProductsEditProductPagePage,\n }))\n);\nconst ProductsEditReleasePagePage = lazy(() =>\n import('./pages/ProductsEditReleasePagePage').then((m) => ({\n default: m.ProductsEditReleasePagePage,\n }))\n);\nconst ProductsFeatureAnalyticsPagePage = lazy(() =>\n import('./pages/ProductsFeatureAnalyticsPagePage').then((m) => ({\n default: m.ProductsFeatureAnalyticsPagePage,\n }))\n);\nconst ProductsFeatureDetailPagePage = lazy(() =>\n import('./pages/ProductsFeatureDetailPagePage').then((m) => ({\n default: m.ProductsFeatureDetailPagePage,\n }))\n);\nconst ProductsFeaturesPagePage = lazy(() =>\n import('./pages/ProductsFeaturesPagePage').then((m) => ({ default: m.ProductsFeaturesPagePage }))\n);\nconst ProductsNewFeaturePagePage = lazy(() =>\n import('./pages/ProductsNewFeaturePagePage').then((m) => ({\n default: m.ProductsNewFeaturePagePage,\n }))\n);\nconst ProductsProductDetailPagePage = lazy(() =>\n import('./pages/ProductsProductDetailPagePage').then((m) => ({\n default: m.ProductsProductDetailPagePage,\n }))\n);\nconst ProductsProductsPagePage = lazy(() =>\n import('./pages/ProductsProductsPagePage').then((m) => ({ default: m.ProductsProductsPagePage }))\n);\nconst ProductsReleaseDetailPagePage = lazy(() =>\n import('./pages/ProductsReleaseDetailPagePage').then((m) => ({\n default: m.ProductsReleaseDetailPagePage,\n }))\n);\nconst ProductsReleasesPagePage = lazy(() =>\n import('./pages/ProductsReleasesPagePage').then((m) => ({ default: m.ProductsReleasesPagePage }))\n);\nconst ProductsRoadmapAnalyticsPagePage = lazy(() =>\n import('./pages/ProductsRoadmapAnalyticsPagePage').then((m) => ({\n default: m.ProductsRoadmapAnalyticsPagePage,\n }))\n);\nconst ProductsRoadmapDetailPagePage = lazy(() =>\n import('./pages/ProductsRoadmapDetailPagePage').then((m) => ({\n default: m.ProductsRoadmapDetailPagePage,\n }))\n);\nconst ProductsRoadmapsPagePage = lazy(() =>\n import('./pages/ProductsRoadmapsPagePage').then((m) => ({ default: m.ProductsRoadmapsPagePage }))\n);\nconst PortfoliosPortfoliosPagePage = lazy(() =>\n import('./pages/PortfoliosPortfoliosPagePage').then((m) => ({\n default: m.PortfoliosPortfoliosPagePage,\n }))\n);\nconst PortfoliosCreatePortfolioPagePage = lazy(() =>\n import('./pages/PortfoliosCreatePortfolioPagePage').then((m) => ({\n default: m.PortfoliosCreatePortfolioPagePage,\n }))\n);\nconst PortfoliosPortfolioDetailPagePage = lazy(() =>\n import('./pages/PortfoliosPortfolioDetailPagePage').then((m) => ({\n default: m.PortfoliosPortfolioDetailPagePage,\n }))\n);\nconst PortfoliosEditPortfolioPagePage = lazy(() =>\n import('./pages/PortfoliosEditPortfolioPagePage').then((m) => ({\n default: m.PortfoliosEditPortfolioPagePage,\n }))\n);\nconst ProgramsProgramsPagePage = lazy(() =>\n import('./pages/ProgramsProgramsPagePage').then((m) => ({ default: m.ProgramsProgramsPagePage }))\n);\nconst ProgramsCreateProgramPagePage = lazy(() =>\n import('./pages/ProgramsCreateProgramPagePage').then((m) => ({\n default: m.ProgramsCreateProgramPagePage,\n }))\n);\nconst ProgramsProgramDetailPagePage = lazy(() =>\n import('./pages/ProgramsProgramDetailPagePage').then((m) => ({\n default: m.ProgramsProgramDetailPagePage,\n }))\n);\nconst ProgramsEditProgramPagePage = lazy(() =>\n import('./pages/ProgramsEditProgramPagePage').then((m) => ({\n default: m.ProgramsEditProgramPagePage,\n }))\n);\nconst CompetitorsCompetitorsPagePage = lazy(() =>\n import('./pages/CompetitorsCompetitorsPagePage').then((m) => ({\n default: m.CompetitorsCompetitorsPagePage,\n }))\n);\nconst CompetitorsCreateCompetitorPagePage = lazy(() =>\n import('./pages/CompetitorsCreateCompetitorPagePage').then((m) => ({\n default: m.CompetitorsCreateCompetitorPagePage,\n }))\n);\nconst CompetitorsCompetitorDetailPagePage = lazy(() =>\n import('./pages/CompetitorsCompetitorDetailPagePage').then((m) => ({\n default: m.CompetitorsCompetitorDetailPagePage,\n }))\n);\nconst CompetitorsEditCompetitorPagePage = lazy(() =>\n import('./pages/CompetitorsEditCompetitorPagePage').then((m) => ({\n default: m.CompetitorsEditCompetitorPagePage,\n }))\n);\nconst ProjectsActiveProjectsPagePage = lazy(() =>\n import('./pages/ProjectsActiveProjectsPagePage').then((m) => ({\n default: m.ProjectsActiveProjectsPagePage,\n }))\n);\nconst ProjectsCreateProjectPagePage = lazy(() =>\n import('./pages/ProjectsCreateProjectPagePage').then((m) => ({\n default: m.ProjectsCreateProjectPagePage,\n }))\n);\nconst ProjectsEditProjectPagePage = lazy(() =>\n import('./pages/ProjectsEditProjectPagePage').then((m) => ({\n default: m.ProjectsEditProjectPagePage,\n }))\n);\nconst ProjectsMilestoneDetailPagePage = lazy(() =>\n import('./pages/ProjectsMilestoneDetailPagePage').then((m) => ({\n default: m.ProjectsMilestoneDetailPagePage,\n }))\n);\nconst ProjectsBudgetsPagePage = lazy(() =>\n import('./pages/ProjectsBudgetsPagePage').then((m) => ({ default: m.ProjectsBudgetsPagePage }))\n);\nconst ProjectsBudgetDetailPagePage = lazy(() =>\n import('./pages/ProjectsBudgetDetailPagePage').then((m) => ({\n default: m.ProjectsBudgetDetailPagePage,\n }))\n);\nconst TasksTimeEntriesPagePage = lazy(() =>\n import('./pages/TasksTimeEntriesPagePage').then((m) => ({\n default: m.TasksTimeEntriesPagePage,\n }))\n);\nconst TasksTimesheetsPagePage = lazy(() =>\n import('./pages/TasksTimesheetsPagePage').then((m) => ({\n default: m.TasksTimesheetsPagePage,\n }))\n);\nconst TasksTimesheetDetailPagePage = lazy(() =>\n import('./pages/TasksTimesheetDetailPagePage').then((m) => ({\n default: m.TasksTimesheetDetailPagePage,\n }))\n);\nconst GoalsGoalsPagePage = lazy(() =>\n import('./pages/GoalsGoalsPagePage').then((m) => ({ default: m.GoalsGoalsPagePage }))\n);\nconst GoalsCreateObjectivePagePage = lazy(() =>\n import('./pages/GoalsCreateObjectivePagePage').then((m) => ({\n default: m.GoalsCreateObjectivePagePage,\n }))\n);\nconst GoalsObjectiveDetailPagePage = lazy(() =>\n import('./pages/GoalsObjectiveDetailPagePage').then((m) => ({\n default: m.GoalsObjectiveDetailPagePage,\n }))\n);\nconst ProjectsMilestonesPagePage = lazy(() =>\n import('./pages/ProjectsMilestonesPagePage').then((m) => ({\n default: m.ProjectsMilestonesPagePage,\n }))\n);\nconst ProjectsPlanningDetailPagePage = lazy(() =>\n import('./pages/ProjectsPlanningDetailPagePage').then((m) => ({\n default: m.ProjectsPlanningDetailPagePage,\n }))\n);\nconst ProjectsPlanningEditPagePage = lazy(() =>\n import('./pages/ProjectsPlanningEditPagePage').then((m) => ({\n default: m.ProjectsPlanningEditPagePage,\n }))\n);\nconst ProjectsPlanningPagePage = lazy(() =>\n import('./pages/ProjectsPlanningPagePage').then((m) => ({ default: m.ProjectsPlanningPagePage }))\n);\nconst ProjectsProjectDetailPagePage = lazy(() =>\n import('./pages/ProjectsProjectDetailPagePage').then((m) => ({\n default: m.ProjectsProjectDetailPagePage,\n }))\n);\nconst ProjectsProjectsPagePage = lazy(() =>\n import('./pages/ProjectsProjectsPagePage').then((m) => ({ default: m.ProjectsProjectsPagePage }))\n);\nconst ReportsCreateReportPagePage = lazy(() =>\n import('./pages/ReportsCreateReportPagePage').then((m) => ({\n default: m.ReportsCreateReportPagePage,\n }))\n);\nconst ReportsReportsPagePage = lazy(() =>\n import('./pages/ReportsReportsPagePage').then((m) => ({ default: m.ReportsReportsPagePage }))\n);\nconst SprintsStartSprintPagePage = lazy(() =>\n import('./pages/SprintsStartSprintPagePage').then((m) => ({\n default: m.SprintsStartSprintPagePage,\n }))\n);\nconst TasksCreateTaskPagePage = lazy(() =>\n import('./pages/TasksCreateTaskPagePage').then((m) => ({ default: m.TasksCreateTaskPagePage }))\n);\nconst TasksEditTaskPagePage = lazy(() =>\n import('./pages/TasksEditTaskPagePage').then((m) => ({ default: m.TasksEditTaskPagePage }))\n);\nconst ProjectsWorkflowPagePage = lazy(() =>\n import('./pages/ProjectsWorkflowPagePage').then((m) => ({ default: m.ProjectsWorkflowPagePage }))\n);\nconst ProjectsCustomFieldsPagePage = lazy(() =>\n import('./pages/ProjectsCustomFieldsPagePage').then((m) => ({\n default: m.ProjectsCustomFieldsPagePage,\n }))\n);\nconst TasksImportPagePage = lazy(() =>\n import('./pages/TasksImportPagePage').then((m) => ({ default: m.TasksImportPagePage }))\n);\nconst TasksTaskDetailPagePage = lazy(() =>\n import('./pages/TasksTaskDetailPagePage').then((m) => ({ default: m.TasksTaskDetailPagePage }))\n);\nconst TasksTasksPagePage = lazy(() =>\n import('./pages/TasksTasksPagePage').then((m) => ({ default: m.TasksTasksPagePage }))\n);\nconst TeamCreateTeamPagePage = lazy(() =>\n import('./pages/TeamCreateTeamPagePage').then((m) => ({ default: m.TeamCreateTeamPagePage }))\n);\nconst TeamInviteMemberPagePage = lazy(() =>\n import('./pages/TeamInviteMemberPagePage').then((m) => ({ default: m.TeamInviteMemberPagePage }))\n);\nconst TeamTeamPagePage = lazy(() =>\n import('./pages/TeamTeamPagePage').then((m) => ({ default: m.TeamTeamPagePage }))\n);\nconst TeamTeamsListPagePage = lazy(() =>\n import('./pages/TeamTeamsListPagePage').then((m) => ({ default: m.TeamTeamsListPagePage }))\n);\nconst TeamTeamDetailPagePage = lazy(() =>\n import('./pages/TeamTeamDetailPagePage').then((m) => ({ default: m.TeamTeamDetailPagePage }))\n);\nconst TeamTeamEditPagePage = lazy(() =>\n import('./pages/TeamTeamEditPagePage').then((m) => ({ default: m.TeamTeamEditPagePage }))\n);\nconst WorkspaceCreateWorkspacePagePage = lazy(() =>\n import('./pages/WorkspaceCreateWorkspacePagePage').then((m) => ({\n default: m.WorkspaceCreateWorkspacePagePage,\n }))\n);\n// BOFF-8047: Automation rules and Project templates\nconst AutomationAutomationRulesPagePage = lazy(() =>\n import('./pages/AutomationAutomationRulesPagePage').then((m) => ({\n default: m.AutomationAutomationRulesPagePage,\n }))\n);\nconst AutomationCreateAutomationRulePagePage = lazy(() =>\n import('./pages/AutomationCreateAutomationRulePagePage').then((m) => ({\n default: m.AutomationCreateAutomationRulePagePage,\n }))\n);\nconst AutomationAutomationRuleDetailPagePage = lazy(() =>\n import('./pages/AutomationAutomationRuleDetailPagePage').then((m) => ({\n default: m.AutomationAutomationRuleDetailPagePage,\n }))\n);\nconst TemplatesTemplatesPagePage = lazy(() =>\n import('./pages/TemplatesTemplatesPagePage').then((m) => ({\n default: m.TemplatesTemplatesPagePage,\n }))\n);\nconst TemplatesEditTemplatePagePage = lazy(() =>\n import('./pages/TemplatesEditTemplatePagePage').then((m) => ({\n default: m.TemplatesEditTemplatePagePage,\n }))\n);\nconst RisksRiskRegisterPagePage = lazy(() =>\n import('./pages/RisksRiskRegisterPagePage').then((m) => ({\n default: m.RisksRiskRegisterPagePage,\n }))\n);\nconst RisksRiskDetailPagePage = lazy(() =>\n import('./pages/RisksRiskDetailPagePage').then((m) => ({ default: m.RisksRiskDetailPagePage }))\n);\nconst ProjectsCriticalPathPagePage = lazy(() =>\n import('./pages/ProjectsCriticalPathPagePage').then((m) => ({\n default: m.ProjectsCriticalPathPagePage,\n }))\n);\n\n// Phase 2 new pages\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function PlanMagnetRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardDashboardPagePage />} />\n {/* Dashboard */}\n <Route path=\"dashboard/dashboard-page\" element={<DashboardDashboardPagePage />} />\n {/* Products */}\n {/*\n The detail/edit/analytics pages below read their record id with\n useParams<{ id: string }>(). Each therefore needs a \":id\" segment — without one the\n id is permanently undefined and the page can never load a record, however it is\n reached. The bare paths are kept alongside so previously-bookmarked URLs still\n resolve rather than falling through to the catch-all redirect.\n */}\n <Route path=\"products/products-page\" element={<ProductsProductsPagePage />} />\n <Route path=\"products/create-product-page\" element={<ProductsCreateProductPagePage />} />\n <Route path=\"products/edit-product-page\" element={<ProductsEditProductPagePage />} />\n <Route path=\"products/edit-product-page/:id\" element={<ProductsEditProductPagePage />} />\n <Route path=\"products/product-detail-page\" element={<ProductsProductDetailPagePage />} />\n <Route\n path=\"products/product-detail-page/:id\"\n element={<ProductsProductDetailPagePage />}\n />\n <Route path=\"products/features-page\" element={<ProductsFeaturesPagePage />} />\n <Route path=\"products/new-feature-page\" element={<ProductsNewFeaturePagePage />} />\n <Route path=\"products/feature-detail-page\" element={<ProductsFeatureDetailPagePage />} />\n <Route\n path=\"products/feature-detail-page/:id\"\n element={<ProductsFeatureDetailPagePage />}\n />\n <Route\n path=\"products/feature-analytics-page\"\n element={<ProductsFeatureAnalyticsPagePage />}\n />\n <Route\n path=\"products/feature-analytics-page/:id\"\n element={<ProductsFeatureAnalyticsPagePage />}\n />\n <Route path=\"products/releases-page\" element={<ProductsReleasesPagePage />} />\n <Route path=\"products/release-detail-page\" element={<ProductsReleaseDetailPagePage />} />\n <Route\n path=\"products/release-detail-page/:id\"\n element={<ProductsReleaseDetailPagePage />}\n />\n <Route path=\"products/edit-release-page\" element={<ProductsEditReleasePagePage />} />\n <Route path=\"products/edit-release-page/:id\" element={<ProductsEditReleasePagePage />} />\n <Route path=\"products/roadmaps-page\" element={<ProductsRoadmapsPagePage />} />\n <Route path=\"products/roadmap-detail-page\" element={<ProductsRoadmapDetailPagePage />} />\n <Route\n path=\"products/roadmap-detail-page/:id\"\n element={<ProductsRoadmapDetailPagePage />}\n />\n <Route path=\"products/create-roadmap-page\" element={<ProductsCreateRoadmapPagePage />} />\n <Route\n path=\"products/roadmap-analytics-page\"\n element={<ProductsRoadmapAnalyticsPagePage />}\n />\n <Route\n path=\"products/roadmap-analytics-page/:id\"\n element={<ProductsRoadmapAnalyticsPagePage />}\n />\n {/* Portfolios (BOFF-8047) */}\n <Route path=\"products/portfolios-page\" element={<PortfoliosPortfoliosPagePage />} />\n <Route\n path=\"products/create-portfolio-page\"\n element={<PortfoliosCreatePortfolioPagePage />}\n />\n <Route\n path=\"products/portfolio-detail-page/:id\"\n element={<PortfoliosPortfolioDetailPagePage />}\n />\n <Route\n path=\"products/edit-portfolio-page/:id\"\n element={<PortfoliosEditPortfolioPagePage />}\n />\n {/* Programs (BOFF-8047) */}\n <Route path=\"products/programs-page\" element={<ProgramsProgramsPagePage />} />\n <Route path=\"products/create-program-page\" element={<ProgramsCreateProgramPagePage />} />\n <Route\n path=\"products/program-detail-page/:id\"\n element={<ProgramsProgramDetailPagePage />}\n />\n <Route path=\"products/edit-program-page/:id\" element={<ProgramsEditProgramPagePage />} />\n {/* Competitors (BOFF-8047) */}\n <Route path=\"products/competitors-page\" element={<CompetitorsCompetitorsPagePage />} />\n <Route\n path=\"products/create-competitor-page\"\n element={<CompetitorsCreateCompetitorPagePage />}\n />\n <Route\n path=\"products/competitor-detail-page/:id\"\n element={<CompetitorsCompetitorDetailPagePage />}\n />\n <Route\n path=\"products/edit-competitor-page/:id\"\n element={<CompetitorsEditCompetitorPagePage />}\n />\n {/* Projects */}\n <Route path=\"projects/projects-page\" element={<ProjectsProjectsPagePage />} />\n <Route path=\"projects/active-projects-page\" element={<ProjectsActiveProjectsPagePage />} />\n <Route path=\"projects/create-project-page\" element={<ProjectsCreateProjectPagePage />} />\n <Route path=\"projects/edit-project-page\" element={<ProjectsEditProjectPagePage />} />\n <Route path=\"projects/edit-project-page/:id\" element={<ProjectsEditProjectPagePage />} />\n <Route path=\"projects/project-detail-page\" element={<ProjectsProjectDetailPagePage />} />\n <Route\n path=\"projects/project-detail-page/:id\"\n element={<ProjectsProjectDetailPagePage />}\n />\n <Route path=\"projects/project-workflow-page/:id\" element={<ProjectsWorkflowPagePage />} />\n <Route\n path=\"projects/project-custom-fields-page/:id\"\n element={<ProjectsCustomFieldsPagePage />}\n />\n <Route path=\"projects/milestones-page\" element={<ProjectsMilestonesPagePage />} />\n <Route\n path=\"projects/milestone-detail-page\"\n element={<ProjectsMilestoneDetailPagePage />}\n />\n <Route\n path=\"projects/milestone-detail-page/:id\"\n element={<ProjectsMilestoneDetailPagePage />}\n />\n <Route path=\"projects/planning-page\" element={<ProjectsPlanningPagePage />} />\n <Route path=\"projects/planning-detail-page\" element={<ProjectsPlanningDetailPagePage />} />\n <Route\n path=\"projects/planning-detail-page/:id\"\n element={<ProjectsPlanningDetailPagePage />}\n />\n <Route path=\"projects/planning-edit-page\" element={<ProjectsPlanningEditPagePage />} />\n <Route path=\"projects/planning-edit-page/:id\" element={<ProjectsPlanningEditPagePage />} />\n <Route path=\"projects/budgets-page\" element={<ProjectsBudgetsPagePage />} />\n <Route path=\"projects/budget-detail-page\" element={<ProjectsBudgetDetailPagePage />} />\n <Route path=\"projects/budget-detail-page/:id\" element={<ProjectsBudgetDetailPagePage />} />\n {/* Critical path (BOFF-8047): CPM over WorkItemDependency, scoped to a project. */}\n <Route path=\"projects/critical-path-page\" element={<ProjectsCriticalPathPagePage />} />\n <Route path=\"projects/critical-path-page/:id\" element={<ProjectsCriticalPathPagePage />} />\n {/* Goals (OKRs, BOFF-4441) */}\n <Route path=\"goals/goals-page\" element={<GoalsGoalsPagePage />} />\n <Route path=\"goals/create-objective-page\" element={<GoalsCreateObjectivePagePage />} />\n <Route path=\"goals/objective-detail-page\" element={<GoalsObjectiveDetailPagePage />} />\n {/* Tasks */}\n <Route path=\"tasks/tasks-page\" element={<TasksTasksPagePage />} />\n <Route path=\"tasks/create-task-page\" element={<TasksCreateTaskPagePage />} />\n <Route path=\"tasks/edit-task-page\" element={<TasksEditTaskPagePage />} />\n <Route path=\"tasks/task-detail-page\" element={<TasksTaskDetailPagePage />} />\n <Route path=\"tasks/import-page\" element={<TasksImportPagePage />} />\n <Route path=\"tasks/time-entries-page\" element={<TasksTimeEntriesPagePage />} />\n <Route path=\"tasks/timesheets-page\" element={<TasksTimesheetsPagePage />} />\n <Route path=\"tasks/timesheet-detail-page\" element={<TasksTimesheetDetailPagePage />} />\n <Route path=\"tasks/timesheet-detail-page/:id\" element={<TasksTimesheetDetailPagePage />} />\n {/* Sprints */}\n <Route path=\"sprints/start-sprint-page\" element={<SprintsStartSprintPagePage />} />\n\n <Route path=\"docs/docs-page\" element={<DocsDocsPagePage />} />\n <Route path=\"docs/doc-detail-page\" element={<DocsDocDetailPagePage />} />\n {/* Reports */}\n <Route path=\"reports/reports-page\" element={<ReportsReportsPagePage />} />\n <Route path=\"reports/create-report-page\" element={<ReportsCreateReportPagePage />} />\n {/* Team */}\n <Route path=\"team/team-page\" element={<TeamTeamPagePage />} />\n <Route path=\"team/teams-page\" element={<TeamTeamsListPagePage />} />\n <Route path=\"team/team-detail-page\" element={<TeamTeamDetailPagePage />} />\n <Route path=\"team/team-detail-page/:id\" element={<TeamTeamDetailPagePage />} />\n <Route path=\"team/team-edit-page\" element={<TeamTeamEditPagePage />} />\n <Route path=\"team/team-edit-page/:id\" element={<TeamTeamEditPagePage />} />\n <Route path=\"team/create-team-page\" element={<TeamCreateTeamPagePage />} />\n <Route path=\"team/invite-member-page\" element={<TeamInviteMemberPagePage />} />\n {/* Workspace */}\n <Route\n path=\"workspace/create-workspace-page\"\n element={<WorkspaceCreateWorkspacePagePage />}\n />\n {/* Automation rules (BOFF-8047) */}\n <Route\n path=\"automation/automation-rules-page\"\n element={<AutomationAutomationRulesPagePage />}\n />\n <Route\n path=\"automation/create-automation-rule-page\"\n element={<AutomationCreateAutomationRulePagePage />}\n />\n <Route\n path=\"automation/automation-rule-detail-page\"\n element={<AutomationAutomationRuleDetailPagePage />}\n />\n <Route\n path=\"automation/automation-rule-detail-page/:id\"\n element={<AutomationAutomationRuleDetailPagePage />}\n />\n {/* Project templates (BOFF-8047) */}\n <Route path=\"templates/templates-page\" element={<TemplatesTemplatesPagePage />} />\n <Route path=\"templates/edit-template-page\" element={<TemplatesEditTemplatePagePage />} />\n <Route\n path=\"templates/edit-template-page/:id\"\n element={<TemplatesEditTemplatePagePage />}\n />\n {/* Risks (BOFF-8047) */}\n <Route path=\"risks/risk-register-page\" element={<RisksRiskRegisterPagePage />} />\n <Route path=\"risks/risk-detail-page\" element={<RisksRiskDetailPagePage />} />\n <Route path=\"risks/risk-detail-page/:id\" element={<RisksRiskDetailPagePage />} />\n {/* Analytics */}\n <Route path=\"analytics/analytics-page\" element={<AnalyticsAnalyticsPagePage />} />\n {/* 404 — a real page, not a redirect to the same URL (H5) */}\n <Route path=\"*\" element={<PlanMagnetNotFoundPage />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlanMagnetRoutes.js","names":[],"sources":["../../src/planmagnet/PlanMagnetRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Route, Routes } from 'react-router';\nimport { Loader2 } from 'lucide-react';\nimport { AnalyticsAnalyticsPagePage } from './pages/AnalyticsAnalyticsPagePage';\n\nconst PlanMagnetNotFoundPage = lazy(() =>\n import('./pages/NotFoundPage').then((m) => ({ default: m.PlanMagnetNotFoundPage }))\n);\nconst DocsDocsPagePage = lazy(() =>\n import('./pages/DocsDocsPagePage').then((m) => ({ default: m.DocsDocsPagePage }))\n);\nconst DocsDocDetailPagePage = lazy(() =>\n import('./pages/DocsDocDetailPagePage').then((m) => ({ default: m.DocsDocDetailPagePage }))\n);\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst ProductsCreateProductPagePage = lazy(() =>\n import('./pages/ProductsCreateProductPagePage').then((m) => ({\n default: m.ProductsCreateProductPagePage,\n }))\n);\nconst ProductsCreateRoadmapPagePage = lazy(() =>\n import('./pages/ProductsCreateRoadmapPagePage').then((m) => ({\n default: m.ProductsCreateRoadmapPagePage,\n }))\n);\nconst ProductsEditProductPagePage = lazy(() =>\n import('./pages/ProductsEditProductPagePage').then((m) => ({\n default: m.ProductsEditProductPagePage,\n }))\n);\nconst ProductsEditReleasePagePage = lazy(() =>\n import('./pages/ProductsEditReleasePagePage').then((m) => ({\n default: m.ProductsEditReleasePagePage,\n }))\n);\nconst ProductsFeatureAnalyticsPagePage = lazy(() =>\n import('./pages/ProductsFeatureAnalyticsPagePage').then((m) => ({\n default: m.ProductsFeatureAnalyticsPagePage,\n }))\n);\nconst ProductsFeatureDetailPagePage = lazy(() =>\n import('./pages/ProductsFeatureDetailPagePage').then((m) => ({\n default: m.ProductsFeatureDetailPagePage,\n }))\n);\nconst ProductsFeaturesPagePage = lazy(() =>\n import('./pages/ProductsFeaturesPagePage').then((m) => ({ default: m.ProductsFeaturesPagePage }))\n);\nconst ProductsNewFeaturePagePage = lazy(() =>\n import('./pages/ProductsNewFeaturePagePage').then((m) => ({\n default: m.ProductsNewFeaturePagePage,\n }))\n);\nconst ProductsProductDetailPagePage = lazy(() =>\n import('./pages/ProductsProductDetailPagePage').then((m) => ({\n default: m.ProductsProductDetailPagePage,\n }))\n);\nconst ProductsProductsPagePage = lazy(() =>\n import('./pages/ProductsProductsPagePage').then((m) => ({ default: m.ProductsProductsPagePage }))\n);\nconst ProductsReleaseDetailPagePage = lazy(() =>\n import('./pages/ProductsReleaseDetailPagePage').then((m) => ({\n default: m.ProductsReleaseDetailPagePage,\n }))\n);\nconst ProductsReleasesPagePage = lazy(() =>\n import('./pages/ProductsReleasesPagePage').then((m) => ({ default: m.ProductsReleasesPagePage }))\n);\nconst ProductsRoadmapAnalyticsPagePage = lazy(() =>\n import('./pages/ProductsRoadmapAnalyticsPagePage').then((m) => ({\n default: m.ProductsRoadmapAnalyticsPagePage,\n }))\n);\nconst ProductsRoadmapDetailPagePage = lazy(() =>\n import('./pages/ProductsRoadmapDetailPagePage').then((m) => ({\n default: m.ProductsRoadmapDetailPagePage,\n }))\n);\nconst ProductsRoadmapsPagePage = lazy(() =>\n import('./pages/ProductsRoadmapsPagePage').then((m) => ({ default: m.ProductsRoadmapsPagePage }))\n);\nconst PortfoliosPortfoliosPagePage = lazy(() =>\n import('./pages/PortfoliosPortfoliosPagePage').then((m) => ({\n default: m.PortfoliosPortfoliosPagePage,\n }))\n);\nconst PortfoliosCreatePortfolioPagePage = lazy(() =>\n import('./pages/PortfoliosCreatePortfolioPagePage').then((m) => ({\n default: m.PortfoliosCreatePortfolioPagePage,\n }))\n);\nconst PortfoliosPortfolioDetailPagePage = lazy(() =>\n import('./pages/PortfoliosPortfolioDetailPagePage').then((m) => ({\n default: m.PortfoliosPortfolioDetailPagePage,\n }))\n);\nconst PortfoliosEditPortfolioPagePage = lazy(() =>\n import('./pages/PortfoliosEditPortfolioPagePage').then((m) => ({\n default: m.PortfoliosEditPortfolioPagePage,\n }))\n);\nconst ProgramsProgramsPagePage = lazy(() =>\n import('./pages/ProgramsProgramsPagePage').then((m) => ({ default: m.ProgramsProgramsPagePage }))\n);\nconst ProgramsCreateProgramPagePage = lazy(() =>\n import('./pages/ProgramsCreateProgramPagePage').then((m) => ({\n default: m.ProgramsCreateProgramPagePage,\n }))\n);\nconst ProgramsProgramDetailPagePage = lazy(() =>\n import('./pages/ProgramsProgramDetailPagePage').then((m) => ({\n default: m.ProgramsProgramDetailPagePage,\n }))\n);\nconst ProgramsEditProgramPagePage = lazy(() =>\n import('./pages/ProgramsEditProgramPagePage').then((m) => ({\n default: m.ProgramsEditProgramPagePage,\n }))\n);\nconst CompetitorsCompetitorsPagePage = lazy(() =>\n import('./pages/CompetitorsCompetitorsPagePage').then((m) => ({\n default: m.CompetitorsCompetitorsPagePage,\n }))\n);\nconst CompetitorsCreateCompetitorPagePage = lazy(() =>\n import('./pages/CompetitorsCreateCompetitorPagePage').then((m) => ({\n default: m.CompetitorsCreateCompetitorPagePage,\n }))\n);\nconst CompetitorsCompetitorDetailPagePage = lazy(() =>\n import('./pages/CompetitorsCompetitorDetailPagePage').then((m) => ({\n default: m.CompetitorsCompetitorDetailPagePage,\n }))\n);\nconst CompetitorsEditCompetitorPagePage = lazy(() =>\n import('./pages/CompetitorsEditCompetitorPagePage').then((m) => ({\n default: m.CompetitorsEditCompetitorPagePage,\n }))\n);\nconst ProjectsActiveProjectsPagePage = lazy(() =>\n import('./pages/ProjectsActiveProjectsPagePage').then((m) => ({\n default: m.ProjectsActiveProjectsPagePage,\n }))\n);\nconst ProjectsCreateProjectPagePage = lazy(() =>\n import('./pages/ProjectsCreateProjectPagePage').then((m) => ({\n default: m.ProjectsCreateProjectPagePage,\n }))\n);\nconst ProjectsEditProjectPagePage = lazy(() =>\n import('./pages/ProjectsEditProjectPagePage').then((m) => ({\n default: m.ProjectsEditProjectPagePage,\n }))\n);\nconst ProjectsMilestoneDetailPagePage = lazy(() =>\n import('./pages/ProjectsMilestoneDetailPagePage').then((m) => ({\n default: m.ProjectsMilestoneDetailPagePage,\n }))\n);\nconst ProjectsBudgetsPagePage = lazy(() =>\n import('./pages/ProjectsBudgetsPagePage').then((m) => ({ default: m.ProjectsBudgetsPagePage }))\n);\nconst ProjectsBudgetDetailPagePage = lazy(() =>\n import('./pages/ProjectsBudgetDetailPagePage').then((m) => ({\n default: m.ProjectsBudgetDetailPagePage,\n }))\n);\nconst TasksTimeEntriesPagePage = lazy(() =>\n import('./pages/TasksTimeEntriesPagePage').then((m) => ({\n default: m.TasksTimeEntriesPagePage,\n }))\n);\nconst TasksTimesheetsPagePage = lazy(() =>\n import('./pages/TasksTimesheetsPagePage').then((m) => ({\n default: m.TasksTimesheetsPagePage,\n }))\n);\nconst TasksTimesheetDetailPagePage = lazy(() =>\n import('./pages/TasksTimesheetDetailPagePage').then((m) => ({\n default: m.TasksTimesheetDetailPagePage,\n }))\n);\nconst GoalsGoalsPagePage = lazy(() =>\n import('./pages/GoalsGoalsPagePage').then((m) => ({ default: m.GoalsGoalsPagePage }))\n);\nconst GoalsCreateObjectivePagePage = lazy(() =>\n import('./pages/GoalsCreateObjectivePagePage').then((m) => ({\n default: m.GoalsCreateObjectivePagePage,\n }))\n);\nconst GoalsObjectiveDetailPagePage = lazy(() =>\n import('./pages/GoalsObjectiveDetailPagePage').then((m) => ({\n default: m.GoalsObjectiveDetailPagePage,\n }))\n);\nconst ProjectsMilestonesPagePage = lazy(() =>\n import('./pages/ProjectsMilestonesPagePage').then((m) => ({\n default: m.ProjectsMilestonesPagePage,\n }))\n);\nconst ProjectsPlanningDetailPagePage = lazy(() =>\n import('./pages/ProjectsPlanningDetailPagePage').then((m) => ({\n default: m.ProjectsPlanningDetailPagePage,\n }))\n);\nconst ProjectsPlanningEditPagePage = lazy(() =>\n import('./pages/ProjectsPlanningEditPagePage').then((m) => ({\n default: m.ProjectsPlanningEditPagePage,\n }))\n);\nconst ProjectsPlanningPagePage = lazy(() =>\n import('./pages/ProjectsPlanningPagePage').then((m) => ({ default: m.ProjectsPlanningPagePage }))\n);\nconst ProjectsProjectDetailPagePage = lazy(() =>\n import('./pages/ProjectsProjectDetailPagePage').then((m) => ({\n default: m.ProjectsProjectDetailPagePage,\n }))\n);\nconst ProjectsProjectsPagePage = lazy(() =>\n import('./pages/ProjectsProjectsPagePage').then((m) => ({ default: m.ProjectsProjectsPagePage }))\n);\nconst ReportsCreateReportPagePage = lazy(() =>\n import('./pages/ReportsCreateReportPagePage').then((m) => ({\n default: m.ReportsCreateReportPagePage,\n }))\n);\nconst ReportsReportsPagePage = lazy(() =>\n import('./pages/ReportsReportsPagePage').then((m) => ({ default: m.ReportsReportsPagePage }))\n);\nconst SprintsStartSprintPagePage = lazy(() =>\n import('./pages/SprintsStartSprintPagePage').then((m) => ({\n default: m.SprintsStartSprintPagePage,\n }))\n);\nconst TasksCreateTaskPagePage = lazy(() =>\n import('./pages/TasksCreateTaskPagePage').then((m) => ({ default: m.TasksCreateTaskPagePage }))\n);\nconst TasksEditTaskPagePage = lazy(() =>\n import('./pages/TasksEditTaskPagePage').then((m) => ({ default: m.TasksEditTaskPagePage }))\n);\nconst ProjectsWorkflowPagePage = lazy(() =>\n import('./pages/ProjectsWorkflowPagePage').then((m) => ({ default: m.ProjectsWorkflowPagePage }))\n);\nconst ProjectsCustomFieldsPagePage = lazy(() =>\n import('./pages/ProjectsCustomFieldsPagePage').then((m) => ({\n default: m.ProjectsCustomFieldsPagePage,\n }))\n);\nconst TasksImportPagePage = lazy(() =>\n import('./pages/TasksImportPagePage').then((m) => ({ default: m.TasksImportPagePage }))\n);\nconst TasksTaskDetailPagePage = lazy(() =>\n import('./pages/TasksTaskDetailPagePage').then((m) => ({ default: m.TasksTaskDetailPagePage }))\n);\nconst TasksTasksPagePage = lazy(() =>\n import('./pages/TasksTasksPagePage').then((m) => ({ default: m.TasksTasksPagePage }))\n);\n// My Work (BOFF-8048)\nconst TasksMyWorkPagePage = lazy(() =>\n import('./pages/TasksMyWorkPagePage').then((m) => ({ default: m.TasksMyWorkPagePage }))\n);\nconst TeamCreateTeamPagePage = lazy(() =>\n import('./pages/TeamCreateTeamPagePage').then((m) => ({ default: m.TeamCreateTeamPagePage }))\n);\nconst TeamInviteMemberPagePage = lazy(() =>\n import('./pages/TeamInviteMemberPagePage').then((m) => ({ default: m.TeamInviteMemberPagePage }))\n);\nconst TeamTeamPagePage = lazy(() =>\n import('./pages/TeamTeamPagePage').then((m) => ({ default: m.TeamTeamPagePage }))\n);\nconst TeamTeamsListPagePage = lazy(() =>\n import('./pages/TeamTeamsListPagePage').then((m) => ({ default: m.TeamTeamsListPagePage }))\n);\nconst TeamTeamDetailPagePage = lazy(() =>\n import('./pages/TeamTeamDetailPagePage').then((m) => ({ default: m.TeamTeamDetailPagePage }))\n);\nconst TeamTeamEditPagePage = lazy(() =>\n import('./pages/TeamTeamEditPagePage').then((m) => ({ default: m.TeamTeamEditPagePage }))\n);\nconst WorkspaceCreateWorkspacePagePage = lazy(() =>\n import('./pages/WorkspaceCreateWorkspacePagePage').then((m) => ({\n default: m.WorkspaceCreateWorkspacePagePage,\n }))\n);\n// BOFF-8047: Automation rules and Project templates\nconst AutomationAutomationRulesPagePage = lazy(() =>\n import('./pages/AutomationAutomationRulesPagePage').then((m) => ({\n default: m.AutomationAutomationRulesPagePage,\n }))\n);\nconst AutomationCreateAutomationRulePagePage = lazy(() =>\n import('./pages/AutomationCreateAutomationRulePagePage').then((m) => ({\n default: m.AutomationCreateAutomationRulePagePage,\n }))\n);\nconst AutomationAutomationRuleDetailPagePage = lazy(() =>\n import('./pages/AutomationAutomationRuleDetailPagePage').then((m) => ({\n default: m.AutomationAutomationRuleDetailPagePage,\n }))\n);\nconst TemplatesTemplatesPagePage = lazy(() =>\n import('./pages/TemplatesTemplatesPagePage').then((m) => ({\n default: m.TemplatesTemplatesPagePage,\n }))\n);\nconst TemplatesEditTemplatePagePage = lazy(() =>\n import('./pages/TemplatesEditTemplatePagePage').then((m) => ({\n default: m.TemplatesEditTemplatePagePage,\n }))\n);\nconst RisksRiskRegisterPagePage = lazy(() =>\n import('./pages/RisksRiskRegisterPagePage').then((m) => ({\n default: m.RisksRiskRegisterPagePage,\n }))\n);\nconst RisksRiskDetailPagePage = lazy(() =>\n import('./pages/RisksRiskDetailPagePage').then((m) => ({ default: m.RisksRiskDetailPagePage }))\n);\nconst ProjectsCriticalPathPagePage = lazy(() =>\n import('./pages/ProjectsCriticalPathPagePage').then((m) => ({\n default: m.ProjectsCriticalPathPagePage,\n }))\n);\n\n// Phase 2 new pages\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function PlanMagnetRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<DashboardDashboardPagePage />} />\n {/* Dashboard */}\n <Route path=\"dashboard/dashboard-page\" element={<DashboardDashboardPagePage />} />\n {/* Products */}\n {/*\n The detail/edit/analytics pages below read their record id with\n useParams<{ id: string }>(). Each therefore needs a \":id\" segment — without one the\n id is permanently undefined and the page can never load a record, however it is\n reached. The bare paths are kept alongside so previously-bookmarked URLs still\n resolve rather than falling through to the catch-all redirect.\n */}\n <Route path=\"products/products-page\" element={<ProductsProductsPagePage />} />\n <Route path=\"products/create-product-page\" element={<ProductsCreateProductPagePage />} />\n <Route path=\"products/edit-product-page\" element={<ProductsEditProductPagePage />} />\n <Route path=\"products/edit-product-page/:id\" element={<ProductsEditProductPagePage />} />\n <Route path=\"products/product-detail-page\" element={<ProductsProductDetailPagePage />} />\n <Route\n path=\"products/product-detail-page/:id\"\n element={<ProductsProductDetailPagePage />}\n />\n <Route path=\"products/features-page\" element={<ProductsFeaturesPagePage />} />\n <Route path=\"products/new-feature-page\" element={<ProductsNewFeaturePagePage />} />\n <Route path=\"products/feature-detail-page\" element={<ProductsFeatureDetailPagePage />} />\n <Route\n path=\"products/feature-detail-page/:id\"\n element={<ProductsFeatureDetailPagePage />}\n />\n <Route\n path=\"products/feature-analytics-page\"\n element={<ProductsFeatureAnalyticsPagePage />}\n />\n <Route\n path=\"products/feature-analytics-page/:id\"\n element={<ProductsFeatureAnalyticsPagePage />}\n />\n <Route path=\"products/releases-page\" element={<ProductsReleasesPagePage />} />\n <Route path=\"products/release-detail-page\" element={<ProductsReleaseDetailPagePage />} />\n <Route\n path=\"products/release-detail-page/:id\"\n element={<ProductsReleaseDetailPagePage />}\n />\n <Route path=\"products/edit-release-page\" element={<ProductsEditReleasePagePage />} />\n <Route path=\"products/edit-release-page/:id\" element={<ProductsEditReleasePagePage />} />\n <Route path=\"products/roadmaps-page\" element={<ProductsRoadmapsPagePage />} />\n <Route path=\"products/roadmap-detail-page\" element={<ProductsRoadmapDetailPagePage />} />\n <Route\n path=\"products/roadmap-detail-page/:id\"\n element={<ProductsRoadmapDetailPagePage />}\n />\n <Route path=\"products/create-roadmap-page\" element={<ProductsCreateRoadmapPagePage />} />\n <Route\n path=\"products/roadmap-analytics-page\"\n element={<ProductsRoadmapAnalyticsPagePage />}\n />\n <Route\n path=\"products/roadmap-analytics-page/:id\"\n element={<ProductsRoadmapAnalyticsPagePage />}\n />\n {/* Portfolios (BOFF-8047) */}\n <Route path=\"products/portfolios-page\" element={<PortfoliosPortfoliosPagePage />} />\n <Route\n path=\"products/create-portfolio-page\"\n element={<PortfoliosCreatePortfolioPagePage />}\n />\n <Route\n path=\"products/portfolio-detail-page/:id\"\n element={<PortfoliosPortfolioDetailPagePage />}\n />\n <Route\n path=\"products/edit-portfolio-page/:id\"\n element={<PortfoliosEditPortfolioPagePage />}\n />\n {/* Programs (BOFF-8047) */}\n <Route path=\"products/programs-page\" element={<ProgramsProgramsPagePage />} />\n <Route path=\"products/create-program-page\" element={<ProgramsCreateProgramPagePage />} />\n <Route\n path=\"products/program-detail-page/:id\"\n element={<ProgramsProgramDetailPagePage />}\n />\n <Route path=\"products/edit-program-page/:id\" element={<ProgramsEditProgramPagePage />} />\n {/* Competitors (BOFF-8047) */}\n <Route path=\"products/competitors-page\" element={<CompetitorsCompetitorsPagePage />} />\n <Route\n path=\"products/create-competitor-page\"\n element={<CompetitorsCreateCompetitorPagePage />}\n />\n <Route\n path=\"products/competitor-detail-page/:id\"\n element={<CompetitorsCompetitorDetailPagePage />}\n />\n <Route\n path=\"products/edit-competitor-page/:id\"\n element={<CompetitorsEditCompetitorPagePage />}\n />\n {/* Projects */}\n <Route path=\"projects/projects-page\" element={<ProjectsProjectsPagePage />} />\n <Route path=\"projects/active-projects-page\" element={<ProjectsActiveProjectsPagePage />} />\n <Route path=\"projects/create-project-page\" element={<ProjectsCreateProjectPagePage />} />\n <Route path=\"projects/edit-project-page\" element={<ProjectsEditProjectPagePage />} />\n <Route path=\"projects/edit-project-page/:id\" element={<ProjectsEditProjectPagePage />} />\n <Route path=\"projects/project-detail-page\" element={<ProjectsProjectDetailPagePage />} />\n <Route\n path=\"projects/project-detail-page/:id\"\n element={<ProjectsProjectDetailPagePage />}\n />\n <Route path=\"projects/project-workflow-page/:id\" element={<ProjectsWorkflowPagePage />} />\n <Route\n path=\"projects/project-custom-fields-page/:id\"\n element={<ProjectsCustomFieldsPagePage />}\n />\n <Route path=\"projects/milestones-page\" element={<ProjectsMilestonesPagePage />} />\n <Route\n path=\"projects/milestone-detail-page\"\n element={<ProjectsMilestoneDetailPagePage />}\n />\n <Route\n path=\"projects/milestone-detail-page/:id\"\n element={<ProjectsMilestoneDetailPagePage />}\n />\n <Route path=\"projects/planning-page\" element={<ProjectsPlanningPagePage />} />\n <Route path=\"projects/planning-detail-page\" element={<ProjectsPlanningDetailPagePage />} />\n <Route\n path=\"projects/planning-detail-page/:id\"\n element={<ProjectsPlanningDetailPagePage />}\n />\n <Route path=\"projects/planning-edit-page\" element={<ProjectsPlanningEditPagePage />} />\n <Route path=\"projects/planning-edit-page/:id\" element={<ProjectsPlanningEditPagePage />} />\n <Route path=\"projects/budgets-page\" element={<ProjectsBudgetsPagePage />} />\n <Route path=\"projects/budget-detail-page\" element={<ProjectsBudgetDetailPagePage />} />\n <Route path=\"projects/budget-detail-page/:id\" element={<ProjectsBudgetDetailPagePage />} />\n {/* Critical path (BOFF-8047): CPM over WorkItemDependency, scoped to a project. */}\n <Route path=\"projects/critical-path-page\" element={<ProjectsCriticalPathPagePage />} />\n <Route path=\"projects/critical-path-page/:id\" element={<ProjectsCriticalPathPagePage />} />\n {/* Goals (OKRs, BOFF-4441) */}\n <Route path=\"goals/goals-page\" element={<GoalsGoalsPagePage />} />\n <Route path=\"goals/create-objective-page\" element={<GoalsCreateObjectivePagePage />} />\n <Route path=\"goals/objective-detail-page\" element={<GoalsObjectiveDetailPagePage />} />\n {/* Tasks */}\n {/* My Work (BOFF-8048): before tasks-page so its route target is easy to find here. */}\n <Route path=\"tasks/my-work-page\" element={<TasksMyWorkPagePage />} />\n <Route path=\"tasks/tasks-page\" element={<TasksTasksPagePage />} />\n <Route path=\"tasks/create-task-page\" element={<TasksCreateTaskPagePage />} />\n <Route path=\"tasks/edit-task-page\" element={<TasksEditTaskPagePage />} />\n <Route path=\"tasks/task-detail-page\" element={<TasksTaskDetailPagePage />} />\n <Route path=\"tasks/import-page\" element={<TasksImportPagePage />} />\n <Route path=\"tasks/time-entries-page\" element={<TasksTimeEntriesPagePage />} />\n <Route path=\"tasks/timesheets-page\" element={<TasksTimesheetsPagePage />} />\n <Route path=\"tasks/timesheet-detail-page\" element={<TasksTimesheetDetailPagePage />} />\n <Route path=\"tasks/timesheet-detail-page/:id\" element={<TasksTimesheetDetailPagePage />} />\n {/* Sprints */}\n <Route path=\"sprints/start-sprint-page\" element={<SprintsStartSprintPagePage />} />\n\n <Route path=\"docs/docs-page\" element={<DocsDocsPagePage />} />\n <Route path=\"docs/doc-detail-page\" element={<DocsDocDetailPagePage />} />\n {/* Reports */}\n <Route path=\"reports/reports-page\" element={<ReportsReportsPagePage />} />\n <Route path=\"reports/create-report-page\" element={<ReportsCreateReportPagePage />} />\n {/* Team */}\n <Route path=\"team/team-page\" element={<TeamTeamPagePage />} />\n <Route path=\"team/teams-page\" element={<TeamTeamsListPagePage />} />\n <Route path=\"team/team-detail-page\" element={<TeamTeamDetailPagePage />} />\n <Route path=\"team/team-detail-page/:id\" element={<TeamTeamDetailPagePage />} />\n <Route path=\"team/team-edit-page\" element={<TeamTeamEditPagePage />} />\n <Route path=\"team/team-edit-page/:id\" element={<TeamTeamEditPagePage />} />\n <Route path=\"team/create-team-page\" element={<TeamCreateTeamPagePage />} />\n <Route path=\"team/invite-member-page\" element={<TeamInviteMemberPagePage />} />\n {/* Workspace */}\n <Route\n path=\"workspace/create-workspace-page\"\n element={<WorkspaceCreateWorkspacePagePage />}\n />\n {/* Automation rules (BOFF-8047) */}\n <Route\n path=\"automation/automation-rules-page\"\n element={<AutomationAutomationRulesPagePage />}\n />\n <Route\n path=\"automation/create-automation-rule-page\"\n element={<AutomationCreateAutomationRulePagePage />}\n />\n <Route\n path=\"automation/automation-rule-detail-page\"\n element={<AutomationAutomationRuleDetailPagePage />}\n />\n <Route\n path=\"automation/automation-rule-detail-page/:id\"\n element={<AutomationAutomationRuleDetailPagePage />}\n />\n {/* Project templates (BOFF-8047) */}\n <Route path=\"templates/templates-page\" element={<TemplatesTemplatesPagePage />} />\n <Route path=\"templates/edit-template-page\" element={<TemplatesEditTemplatePagePage />} />\n <Route\n path=\"templates/edit-template-page/:id\"\n element={<TemplatesEditTemplatePagePage />}\n />\n {/* Risks (BOFF-8047) */}\n <Route path=\"risks/risk-register-page\" element={<RisksRiskRegisterPagePage />} />\n <Route path=\"risks/risk-detail-page\" element={<RisksRiskDetailPagePage />} />\n <Route path=\"risks/risk-detail-page/:id\" element={<RisksRiskDetailPagePage />} />\n {/* Analytics */}\n <Route path=\"analytics/analytics-page\" element={<AnalyticsAnalyticsPagePage />} />\n {/* 404 — a real page, not a redirect to the same URL (H5) */}\n <Route path=\"*\" element={<PlanMagnetNotFoundPage />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
export declare const WORK_ITEM_STATUSES: readonly ["BACKLOG", "TODO", "IN_PROGRESS", "IN_REVIEW", "TESTING", "DONE", "CANCELLED"];
|
|
11
11
|
export declare const WORK_ITEM_PRIORITIES: readonly ["NONE", "LOW", "MEDIUM", "HIGH", "CRITICAL"];
|
|
12
12
|
export declare function enumLabel(value: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Shared by every inline-edit control on this page and on My Work (BOFF-8048): saves through
|
|
15
|
+
* planmagnetUpdateWorkItem and surfaces a refusal (workflow, validation) as `error` rather than swallowing it —
|
|
16
|
+
* see utils/mutationResult.ts. Exported so a page composing several of these controls in one row (My Work) can also
|
|
17
|
+
* drive its own due-date input through the identical save path without re-deriving it.
|
|
18
|
+
*/
|
|
19
|
+
export declare function useWorkItemUpdate(workItemId: string): {
|
|
20
|
+
save: (input: Record<string, unknown>) => Promise<void>;
|
|
21
|
+
saving: boolean;
|
|
22
|
+
error: string | null;
|
|
23
|
+
};
|
|
13
24
|
/** A status or priority select that saves on change. */
|
|
14
25
|
export declare function WorkItemEnumSelect({ workItemId, field, value, options, label, }: {
|
|
15
26
|
workItemId: string;
|
|
@@ -57,6 +68,16 @@ export declare function WorkItemAssigneeSelect({ workItemId, assigneeId, }: {
|
|
|
57
68
|
workItemId: string;
|
|
58
69
|
assigneeId: string | null;
|
|
59
70
|
}): import("react/jsx-runtime").JSX.Element;
|
|
71
|
+
/**
|
|
72
|
+
* The due-date inline control (BOFF-8048): a plain date input saving straight through
|
|
73
|
+
* planmagnetUpdateWorkItem's `dueDate: DateTime` scalar — an already-implemented real scalar (see
|
|
74
|
+
* utils/datetime-scalar.ts), so the epoch-serialization trap that hits a GraphQL `String` date field does not
|
|
75
|
+
* apply here. Clearing the field saves `null` (no due date) rather than being unclearable once set.
|
|
76
|
+
*/
|
|
77
|
+
export declare function WorkItemDueDateInput({ workItemId, dueDate, }: {
|
|
78
|
+
workItemId: string;
|
|
79
|
+
dueDate: string | null;
|
|
80
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
60
81
|
/** Edit and Delete for the task detail header. */
|
|
61
82
|
export declare function WorkItemHeaderActions({ workItemId, title, }: {
|
|
62
83
|
workItemId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/WorkItemControls.tsx"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AAEH,eAAO,MAAM,kBAAkB,0FAQrB,CAAC;AACX,eAAO,MAAM,oBAAoB,wDAAyD,CAAC;AAE3F,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;
|
|
1
|
+
{"version":3,"file":"WorkItemControls.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/controls/WorkItemControls.tsx"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AAEH,eAAO,MAAM,kBAAkB,0FAQrB,CAAC;AACX,eAAO,MAAM,oBAAoB,wDAAyD,CAAC;AAE3F,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG/C;AAmCD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM;kBAMvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;EASnD;AAED,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,EACjC,UAAU,EACV,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,2CAyBA;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,SAAS,EACT,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf,2CA8BA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;;;;;;;;EAmBtE;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,EAC7B,EAAE,EACF,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,SAAwB,EACxB,SAAsB,GACvB,EAAE;IACD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qFAAqF;IACrF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,2CAkCA;AAED,2DAA2D;AAC3D,wBAAgB,sBAAsB,CAAC,EACrC,UAAU,EACV,UAAU,GACX,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B,2CAcA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,UAAU,EACV,OAAO,GACR,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,2CAsBA;AAED,kDAAkD;AAClD,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,KAAK,GACN,EAAE;IACD,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,2CA6CA"}
|
|
@@ -47,13 +47,14 @@ var S = p`
|
|
|
47
47
|
"GetWorkItems",
|
|
48
48
|
"GetWorkItemCounts",
|
|
49
49
|
"ProjectBoard",
|
|
50
|
-
"GetDashboardData"
|
|
50
|
+
"GetDashboardData",
|
|
51
|
+
"GetMyWorkItems"
|
|
51
52
|
], T = [
|
|
52
53
|
"GetWorkItemDetail",
|
|
53
54
|
"WorkItemActivity",
|
|
54
55
|
...w
|
|
55
|
-
], E = "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60 max-w-[12rem]";
|
|
56
|
-
function
|
|
56
|
+
], E = "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60 max-w-[12rem]", D = "rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60";
|
|
57
|
+
function O(e) {
|
|
57
58
|
let [t, n] = m(S, {
|
|
58
59
|
refetchQueries: T,
|
|
59
60
|
awaitRefetchQueries: !0
|
|
@@ -74,8 +75,8 @@ function D(e) {
|
|
|
74
75
|
error: r
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
|
-
function
|
|
78
|
-
let { save: a, saving: s, error: c } =
|
|
78
|
+
function k({ workItemId: e, field: t, value: n, options: r, label: i }) {
|
|
79
|
+
let { save: a, saving: s, error: c } = O(e), l = r.includes(n) ? r : [n, ...r];
|
|
79
80
|
return /* @__PURE__ */ g("div", {
|
|
80
81
|
className: "flex flex-col items-end gap-1",
|
|
81
82
|
children: [/* @__PURE__ */ h("select", {
|
|
@@ -94,8 +95,8 @@ function O({ workItemId: e, field: t, value: n, options: r, label: i }) {
|
|
|
94
95
|
}), c && /* @__PURE__ */ h(o, { message: c })]
|
|
95
96
|
});
|
|
96
97
|
}
|
|
97
|
-
function
|
|
98
|
-
let r = c(t), { save: i, saving: a, error: u } =
|
|
98
|
+
function A({ workItemId: e, projectId: t, value: n }) {
|
|
99
|
+
let r = c(t), { save: i, saving: a, error: u } = O(e);
|
|
99
100
|
return /* @__PURE__ */ g("div", {
|
|
100
101
|
className: "flex flex-col items-end gap-1",
|
|
101
102
|
children: [
|
|
@@ -121,7 +122,7 @@ function k({ workItemId: e, projectId: t, value: n }) {
|
|
|
121
122
|
]
|
|
122
123
|
});
|
|
123
124
|
}
|
|
124
|
-
function
|
|
125
|
+
function j(t) {
|
|
125
126
|
let { workspaceId: r, authToken: i, apiGatewayUrl: a } = e(), o = v({
|
|
126
127
|
workspaceId: r ?? "",
|
|
127
128
|
authToken: i ?? void 0,
|
|
@@ -140,8 +141,8 @@ function A(t) {
|
|
|
140
141
|
fetchMore: o.fetchMore
|
|
141
142
|
};
|
|
142
143
|
}
|
|
143
|
-
function
|
|
144
|
-
let { options: o, loading: s, hasMore: c, fetchMore: l } =
|
|
144
|
+
function M({ id: e, value: t, onChange: n, disabled: r = !1, noneLabel: i = "Unassigned", ariaLabel: a = "Assignee" }) {
|
|
145
|
+
let { options: o, loading: s, hasMore: c, fetchMore: l } = j(t || null);
|
|
145
146
|
return /* @__PURE__ */ g("div", {
|
|
146
147
|
className: "flex flex-col gap-1",
|
|
147
148
|
children: [
|
|
@@ -174,11 +175,11 @@ function j({ id: e, value: t, onChange: n, disabled: r = !1, noneLabel: i = "Una
|
|
|
174
175
|
]
|
|
175
176
|
});
|
|
176
177
|
}
|
|
177
|
-
function
|
|
178
|
-
let { save: n, saving: r, error: i } =
|
|
178
|
+
function N({ workItemId: e, assigneeId: t }) {
|
|
179
|
+
let { save: n, saving: r, error: i } = O(e);
|
|
179
180
|
return /* @__PURE__ */ g("div", {
|
|
180
181
|
className: "flex flex-col items-end gap-1",
|
|
181
|
-
children: [/* @__PURE__ */ h(
|
|
182
|
+
children: [/* @__PURE__ */ h(M, {
|
|
182
183
|
value: t ?? "",
|
|
183
184
|
disabled: r,
|
|
184
185
|
onChange: (e) => {
|
|
@@ -187,7 +188,25 @@ function M({ workItemId: e, assigneeId: t }) {
|
|
|
187
188
|
}), i && /* @__PURE__ */ h(o, { message: i })]
|
|
188
189
|
});
|
|
189
190
|
}
|
|
190
|
-
function
|
|
191
|
+
function P({ workItemId: e, dueDate: t }) {
|
|
192
|
+
let { save: n, saving: r, error: i } = O(e), a = t ? t.slice(0, 10) : "";
|
|
193
|
+
return /* @__PURE__ */ g("div", {
|
|
194
|
+
className: "flex flex-col items-end gap-1",
|
|
195
|
+
children: [/* @__PURE__ */ h("input", {
|
|
196
|
+
type: "date",
|
|
197
|
+
"aria-label": "Due date",
|
|
198
|
+
"data-testid": "task-due-date",
|
|
199
|
+
className: D,
|
|
200
|
+
value: a,
|
|
201
|
+
disabled: r,
|
|
202
|
+
onChange: (e) => {
|
|
203
|
+
let t = e.target.value;
|
|
204
|
+
t !== a && n({ dueDate: t ? (/* @__PURE__ */ new Date(`${t}T00:00:00.000Z`)).toISOString() : null });
|
|
205
|
+
}
|
|
206
|
+
}), i && /* @__PURE__ */ h(o, { message: i })]
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
function F({ workItemId: e, title: n }) {
|
|
191
210
|
let s = t(), [c, l] = m(C, {
|
|
192
211
|
refetchQueries: w,
|
|
193
212
|
context: r
|
|
@@ -224,6 +243,6 @@ function N({ workItemId: e, title: n }) {
|
|
|
224
243
|
});
|
|
225
244
|
}
|
|
226
245
|
//#endregion
|
|
227
|
-
export {
|
|
246
|
+
export { M as AssigneeSelect, b as WORK_ITEM_PRIORITIES, y as WORK_ITEM_STATUSES, N as WorkItemAssigneeSelect, P as WorkItemDueDateInput, k as WorkItemEnumSelect, F as WorkItemHeaderActions, A as WorkItemStatusSelect, x as enumLabel, j as useAssigneeOptions };
|
|
228
247
|
|
|
229
248
|
//# sourceMappingURL=WorkItemControls.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkItemControls.js","names":[],"sources":["../../../src/planmagnet/controls/WorkItemControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { useWorkspaceDirectory } from '@burdenoff/fe-libs/sharing';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { allowedTargets, useProjectWorkflow, workflowLabel } from '../hooks/useProjectWorkflow';\nimport { usePersonProfile } from '../people/People';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\n\n/**\n * Task controls (BOFF-7938, BOFF-7939). Until 2026-09-27 the task detail page was read-only: no status, priority or\n * assignee control, no Edit link (the Edit Task page existed but nothing led to it) and no Delete. A task's status\n * could only change by dragging its card on a project board, and nobody could be assigned at all — so every Team\n * page, sprint \"Team Members\" list and board card read \"Unassigned\".\n *\n * Every control saves through planmagnetUpdateWorkItem, the same path the board uses, so a status change records\n * its history (activity feed, cycle time) exactly like a drag. A refusal keeps the stored value and shows the reason.\n */\n\nexport const WORK_ITEM_STATUSES = [\n 'BACKLOG',\n 'TODO',\n 'IN_PROGRESS',\n 'IN_REVIEW',\n 'TESTING',\n 'DONE',\n 'CANCELLED',\n] as const;\nexport const WORK_ITEM_PRIORITIES = ['NONE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] as const;\n\nexport function enumLabel(value: string): string {\n const words = value.toLowerCase().replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nconst UPDATE_WORK_ITEM = gql`\n mutation WorkItemControlsUpdate($id: ID!, $input: PlanmagnetUpdateWorkItemInput!) {\n planmagnetUpdateWorkItem(id: $id, input: $input) {\n id\n status\n priority\n assigneeId\n }\n }\n`;\nconst DELETE_WORK_ITEM = gql`\n mutation WorkItemControlsDelete($id: ID!) {\n planmagnetDeleteWorkItem(id: $id)\n }\n`;\n\n/** Every query that shows a task's status, priority or assignee. */\nconst LIST_QUERIES = ['GetWorkItems', 'GetWorkItemCounts', 'ProjectBoard', 'GetDashboardData'];\nconst DETAIL_QUERIES = ['GetWorkItemDetail', 'WorkItemActivity', ...LIST_QUERIES];\n\nconst selectClass =\n 'rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60 max-w-[12rem]';\n\nfunction useWorkItemUpdate(workItemId: string) {\n const [update, state] = useMutation(UPDATE_WORK_ITEM, {\n refetchQueries: DETAIL_QUERIES,\n awaitRefetchQueries: true,\n });\n const [error, setError] = useState<string | null>(null);\n const save = async (input: Record<string, unknown>) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: workItemId, input } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The task could not be updated.');\n }\n };\n return { save, saving: state.loading, error };\n}\n\n/** A status or priority select that saves on change. */\nexport function WorkItemEnumSelect({\n workItemId,\n field,\n value,\n options,\n label,\n}: {\n workItemId: string;\n field: 'status' | 'priority';\n value: string;\n options: readonly string[];\n label: string;\n}) {\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n // A stored value the list does not know (older data) stays selectable rather than silently showing another one.\n const all = options.includes(value) ? options : [value, ...options];\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <select\n aria-label={label}\n data-testid={`task-${field}`}\n className={selectClass}\n value={value}\n disabled={saving}\n onChange={(e) => {\n if (e.target.value !== value) void save({ [field]: e.target.value });\n }}\n >\n {all.map((option) => (\n <option key={option} value={option}>\n {enumLabel(option)}\n </option>\n ))}\n </select>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * The status select (BOFF-8043): the project's names for its statuses, and only the moves its workflow allows — the\n * server refuses anything else anyway, with the reason shown below the select.\n */\nexport function WorkItemStatusSelect({\n workItemId,\n projectId,\n value,\n}: {\n workItemId: string;\n projectId: string;\n value: string;\n}) {\n const workflow = useProjectWorkflow(projectId);\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n const options = allowedTargets(workflow, value, WORK_ITEM_STATUSES);\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <select\n aria-label=\"Status\"\n data-testid=\"task-status\"\n className={selectClass}\n value={value}\n disabled={saving}\n onChange={(e) => {\n if (e.target.value !== value) void save({ status: e.target.value });\n }}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {workflowLabel(workflow, option)}\n </option>\n ))}\n </select>\n {workflow?.enforceTransitions && (\n <span className=\"text-[11px] text-muted-foreground\">\n Only the moves this project allows\n </span>\n )}\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * Workspace members for an assignee picker, from the fe-libs workspace directory (what the sharing picker uses; any\n * member can read it). Option values are USER ids. `planmagnetWorkspaceEditors` is not used: it needs PlanMagnet\n * admin rights, so an ordinary member would get an empty picker.\n */\nexport function useAssigneeOptions(currentId: string | null | undefined) {\n const { workspaceId, authToken, apiGatewayUrl } = usePlanMagnet();\n const directory = useWorkspaceDirectory({\n workspaceId: workspaceId ?? '',\n authToken: authToken ?? undefined,\n apiGatewayUrl: apiGatewayUrl ?? undefined,\n });\n const current = usePersonProfile(currentId);\n const options = directory.members.map((m) => ({ id: m.id, name: m.name }));\n // The current assignee may be outside the loaded page (or no longer a member): keep them selectable by name.\n if (currentId && current && !options.some((o) => o.id === currentId)) {\n options.unshift({ id: currentId, name: current.displayName });\n }\n return {\n options,\n loading: directory.loading,\n hasMore: directory.hasMore,\n fetchMore: directory.fetchMore,\n };\n}\n\n/** A plain workspace-member select (for forms). '' means `noneLabel` (\"Unassigned\" by default). */\nexport function AssigneeSelect({\n id,\n value,\n onChange,\n disabled = false,\n noneLabel = 'Unassigned',\n ariaLabel = 'Assignee',\n}: {\n id?: string;\n value: string;\n onChange: (userId: string) => void;\n disabled?: boolean;\n /** BOFF-8044: e.g. \"No lead\" when reused for a Team's leadId, which isn't an \"assignee\". */\n noneLabel?: string;\n /** The control's accessible name when it has no visible `<label>` (i.e. no `id`). */\n ariaLabel?: string;\n}) {\n const { options, loading, hasMore, fetchMore } = useAssigneeOptions(value || null);\n return (\n <div className=\"flex flex-col gap-1\">\n <select\n id={id}\n aria-label={id ? undefined : ariaLabel}\n data-testid=\"assignee-select\"\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">{noneLabel}</option>\n {options.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n {loading && options.length === 0 && (\n <span className=\"text-xs text-muted-foreground\">Loading members…</span>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-primary hover:underline\"\n onClick={fetchMore}\n >\n Show more members\n </button>\n )}\n </div>\n );\n}\n\n/** The task detail's assignee control: saves on change. */\nexport function WorkItemAssigneeSelect({\n workItemId,\n assigneeId,\n}: {\n workItemId: string;\n assigneeId: string | null;\n}) {\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <AssigneeSelect\n value={assigneeId ?? ''}\n disabled={saving}\n onChange={(next) => {\n if (next !== (assigneeId ?? '')) void save({ assigneeId: next || null });\n }}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/** Edit and Delete for the task detail header. */\nexport function WorkItemHeaderActions({\n workItemId,\n title,\n}: {\n workItemId: string;\n title: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [remove, removeState] = useMutation(DELETE_WORK_ITEM, {\n refetchQueries: LIST_QUERIES,\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: workItemId } }));\n navigate('/tasks/tasks-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The task could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"task-edit\"\n onClick={() => navigate(`/tasks/edit-task-page?taskId=${encodeURIComponent(workItemId)}`)}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${title}\"?`}\n description=\"The task is deleted and disappears from boards, sprints and releases. This cannot be undone here.\"\n confirmLabel=\"Delete task\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkItemControls.js","names":[],"sources":["../../../src/planmagnet/controls/WorkItemControls.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { useWorkspaceDirectory } from '@burdenoff/fe-libs/sharing';\nimport { Button } from '@burdenoff/fe-libs/ui';\nimport { Pencil, Trash2 } from 'lucide-react';\nimport { allowedTargets, useProjectWorkflow, workflowLabel } from '../hooks/useProjectWorkflow';\nimport { usePersonProfile } from '../people/People';\nimport { usePlanMagnet, usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\nimport { throwOnError, LEAVES_PAGE_CONTEXT } from '../utils/mutationResult';\nimport { ConfirmButton, ErrorLine } from './ConfirmButton';\n\n/**\n * Task controls (BOFF-7938, BOFF-7939). Until 2026-09-27 the task detail page was read-only: no status, priority or\n * assignee control, no Edit link (the Edit Task page existed but nothing led to it) and no Delete. A task's status\n * could only change by dragging its card on a project board, and nobody could be assigned at all — so every Team\n * page, sprint \"Team Members\" list and board card read \"Unassigned\".\n *\n * Every control saves through planmagnetUpdateWorkItem, the same path the board uses, so a status change records\n * its history (activity feed, cycle time) exactly like a drag. A refusal keeps the stored value and shows the reason.\n */\n\nexport const WORK_ITEM_STATUSES = [\n 'BACKLOG',\n 'TODO',\n 'IN_PROGRESS',\n 'IN_REVIEW',\n 'TESTING',\n 'DONE',\n 'CANCELLED',\n] as const;\nexport const WORK_ITEM_PRIORITIES = ['NONE', 'LOW', 'MEDIUM', 'HIGH', 'CRITICAL'] as const;\n\nexport function enumLabel(value: string): string {\n const words = value.toLowerCase().replace(/_/g, ' ');\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\nconst UPDATE_WORK_ITEM = gql`\n mutation WorkItemControlsUpdate($id: ID!, $input: PlanmagnetUpdateWorkItemInput!) {\n planmagnetUpdateWorkItem(id: $id, input: $input) {\n id\n status\n priority\n assigneeId\n }\n }\n`;\nconst DELETE_WORK_ITEM = gql`\n mutation WorkItemControlsDelete($id: ID!) {\n planmagnetDeleteWorkItem(id: $id)\n }\n`;\n\n/** Every query that shows a task's status, priority or assignee. */\nconst LIST_QUERIES = [\n 'GetWorkItems',\n 'GetWorkItemCounts',\n 'ProjectBoard',\n 'GetDashboardData',\n // BOFF-8048: My Work reads the same underlying rows by assigneeId — an inline edit made elsewhere (the board, the\n // detail page) must not leave a stale row sitting in a workspace member's My Work list.\n 'GetMyWorkItems',\n];\nconst DETAIL_QUERIES = ['GetWorkItemDetail', 'WorkItemActivity', ...LIST_QUERIES];\n\nconst selectClass =\n 'rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60 max-w-[12rem]';\nconst dateInputClass =\n 'rounded-md border border-input bg-background px-2 py-1 text-sm disabled:opacity-60';\n\n/**\n * Shared by every inline-edit control on this page and on My Work (BOFF-8048): saves through\n * planmagnetUpdateWorkItem and surfaces a refusal (workflow, validation) as `error` rather than swallowing it —\n * see utils/mutationResult.ts. Exported so a page composing several of these controls in one row (My Work) can also\n * drive its own due-date input through the identical save path without re-deriving it.\n */\nexport function useWorkItemUpdate(workItemId: string) {\n const [update, state] = useMutation(UPDATE_WORK_ITEM, {\n refetchQueries: DETAIL_QUERIES,\n awaitRefetchQueries: true,\n });\n const [error, setError] = useState<string | null>(null);\n const save = async (input: Record<string, unknown>) => {\n setError(null);\n try {\n await throwOnError(update({ variables: { id: workItemId, input } }));\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The task could not be updated.');\n }\n };\n return { save, saving: state.loading, error };\n}\n\n/** A status or priority select that saves on change. */\nexport function WorkItemEnumSelect({\n workItemId,\n field,\n value,\n options,\n label,\n}: {\n workItemId: string;\n field: 'status' | 'priority';\n value: string;\n options: readonly string[];\n label: string;\n}) {\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n // A stored value the list does not know (older data) stays selectable rather than silently showing another one.\n const all = options.includes(value) ? options : [value, ...options];\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <select\n aria-label={label}\n data-testid={`task-${field}`}\n className={selectClass}\n value={value}\n disabled={saving}\n onChange={(e) => {\n if (e.target.value !== value) void save({ [field]: e.target.value });\n }}\n >\n {all.map((option) => (\n <option key={option} value={option}>\n {enumLabel(option)}\n </option>\n ))}\n </select>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * The status select (BOFF-8043): the project's names for its statuses, and only the moves its workflow allows — the\n * server refuses anything else anyway, with the reason shown below the select.\n */\nexport function WorkItemStatusSelect({\n workItemId,\n projectId,\n value,\n}: {\n workItemId: string;\n projectId: string;\n value: string;\n}) {\n const workflow = useProjectWorkflow(projectId);\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n const options = allowedTargets(workflow, value, WORK_ITEM_STATUSES);\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <select\n aria-label=\"Status\"\n data-testid=\"task-status\"\n className={selectClass}\n value={value}\n disabled={saving}\n onChange={(e) => {\n if (e.target.value !== value) void save({ status: e.target.value });\n }}\n >\n {options.map((option) => (\n <option key={option} value={option}>\n {workflowLabel(workflow, option)}\n </option>\n ))}\n </select>\n {workflow?.enforceTransitions && (\n <span className=\"text-[11px] text-muted-foreground\">\n Only the moves this project allows\n </span>\n )}\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * Workspace members for an assignee picker, from the fe-libs workspace directory (what the sharing picker uses; any\n * member can read it). Option values are USER ids. `planmagnetWorkspaceEditors` is not used: it needs PlanMagnet\n * admin rights, so an ordinary member would get an empty picker.\n */\nexport function useAssigneeOptions(currentId: string | null | undefined) {\n const { workspaceId, authToken, apiGatewayUrl } = usePlanMagnet();\n const directory = useWorkspaceDirectory({\n workspaceId: workspaceId ?? '',\n authToken: authToken ?? undefined,\n apiGatewayUrl: apiGatewayUrl ?? undefined,\n });\n const current = usePersonProfile(currentId);\n const options = directory.members.map((m) => ({ id: m.id, name: m.name }));\n // The current assignee may be outside the loaded page (or no longer a member): keep them selectable by name.\n if (currentId && current && !options.some((o) => o.id === currentId)) {\n options.unshift({ id: currentId, name: current.displayName });\n }\n return {\n options,\n loading: directory.loading,\n hasMore: directory.hasMore,\n fetchMore: directory.fetchMore,\n };\n}\n\n/** A plain workspace-member select (for forms). '' means `noneLabel` (\"Unassigned\" by default). */\nexport function AssigneeSelect({\n id,\n value,\n onChange,\n disabled = false,\n noneLabel = 'Unassigned',\n ariaLabel = 'Assignee',\n}: {\n id?: string;\n value: string;\n onChange: (userId: string) => void;\n disabled?: boolean;\n /** BOFF-8044: e.g. \"No lead\" when reused for a Team's leadId, which isn't an \"assignee\". */\n noneLabel?: string;\n /** The control's accessible name when it has no visible `<label>` (i.e. no `id`). */\n ariaLabel?: string;\n}) {\n const { options, loading, hasMore, fetchMore } = useAssigneeOptions(value || null);\n return (\n <div className=\"flex flex-col gap-1\">\n <select\n id={id}\n aria-label={id ? undefined : ariaLabel}\n data-testid=\"assignee-select\"\n className={selectClass}\n value={value}\n disabled={disabled}\n onChange={(e) => onChange(e.target.value)}\n >\n <option value=\"\">{noneLabel}</option>\n {options.map((o) => (\n <option key={o.id} value={o.id}>\n {o.name}\n </option>\n ))}\n </select>\n {loading && options.length === 0 && (\n <span className=\"text-xs text-muted-foreground\">Loading members…</span>\n )}\n {hasMore && (\n <button\n type=\"button\"\n className=\"self-start text-xs text-primary hover:underline\"\n onClick={fetchMore}\n >\n Show more members\n </button>\n )}\n </div>\n );\n}\n\n/** The task detail's assignee control: saves on change. */\nexport function WorkItemAssigneeSelect({\n workItemId,\n assigneeId,\n}: {\n workItemId: string;\n assigneeId: string | null;\n}) {\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <AssigneeSelect\n value={assigneeId ?? ''}\n disabled={saving}\n onChange={(next) => {\n if (next !== (assigneeId ?? '')) void save({ assigneeId: next || null });\n }}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/**\n * The due-date inline control (BOFF-8048): a plain date input saving straight through\n * planmagnetUpdateWorkItem's `dueDate: DateTime` scalar — an already-implemented real scalar (see\n * utils/datetime-scalar.ts), so the epoch-serialization trap that hits a GraphQL `String` date field does not\n * apply here. Clearing the field saves `null` (no due date) rather than being unclearable once set.\n */\nexport function WorkItemDueDateInput({\n workItemId,\n dueDate,\n}: {\n workItemId: string;\n dueDate: string | null;\n}) {\n const { save, saving, error } = useWorkItemUpdate(workItemId);\n // <input type=\"date\"> works in yyyy-mm-dd; dueDate arrives as a full ISO DateTime.\n const value = dueDate ? dueDate.slice(0, 10) : '';\n return (\n <div className=\"flex flex-col items-end gap-1\">\n <input\n type=\"date\"\n aria-label=\"Due date\"\n data-testid=\"task-due-date\"\n className={dateInputClass}\n value={value}\n disabled={saving}\n onChange={(e) => {\n const next = e.target.value;\n if (next === value) return;\n void save({ dueDate: next ? new Date(`${next}T00:00:00.000Z`).toISOString() : null });\n }}\n />\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n\n/** Edit and Delete for the task detail header. */\nexport function WorkItemHeaderActions({\n workItemId,\n title,\n}: {\n workItemId: string;\n title: string;\n}) {\n const navigate = usePlanMagnetNavigate();\n const [remove, removeState] = useMutation(DELETE_WORK_ITEM, {\n refetchQueries: LIST_QUERIES,\n context: LEAVES_PAGE_CONTEXT,\n });\n const [error, setError] = useState<string | null>(null);\n\n const onDelete = async () => {\n setError(null);\n try {\n await throwOnError(remove({ variables: { id: workItemId } }));\n navigate('/tasks/tasks-page');\n } catch (e) {\n setError(e instanceof Error ? e.message : 'The task could not be deleted.');\n }\n };\n\n return (\n <div className=\"flex flex-col items-end gap-2\">\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n data-testid=\"task-edit\"\n onClick={() => navigate(`/tasks/edit-task-page?taskId=${encodeURIComponent(workItemId)}`)}\n >\n <Pencil className=\"mr-1 h-4 w-4\" />\n Edit\n </Button>\n <ConfirmButton\n label=\"Delete\"\n variant=\"outline\"\n icon={<Trash2 className=\"mr-1 h-4 w-4\" />}\n title={`Delete \"${title}\"?`}\n description=\"The task is deleted and disappears from boards, sprints and releases. This cannot be undone here.\"\n confirmLabel=\"Delete task\"\n destructive\n disabled={removeState.loading}\n onConfirm={() => void onDelete()}\n />\n </div>\n {error && <ErrorLine message={error} />}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reports (BOFF-7967). There is no saved-report model and no report runner yet, so there are no reports to list.
|
|
3
|
-
* This page used to invent them — one "Velocity Report" per completed sprint, one "Burndown" per active sprint, one
|
|
4
|
-
* "Status Report" per active project — with made-up schedules, "Run Today" counts for reports that never ran, and
|
|
5
|
-
* the viewer named as their creator. It now says so, and points to where the same analysis lives, computed on the
|
|
6
|
-
* server from real data.
|
|
7
|
-
*/
|
|
8
1
|
export declare function ReportsReportsPagePage(): import("react/jsx-runtime").JSX.Element;
|
|
9
2
|
//# sourceMappingURL=ReportsReportsPagePage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsReportsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ReportsReportsPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ReportsReportsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ReportsReportsPagePage.tsx"],"names":[],"mappings":"AAskBA,wBAAgB,sBAAsB,4CAkGrC"}
|