@burdenoff/microfe-planmagnet 2026.509.103
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/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +21253 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +8370 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +4182 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js +24 -0
- package/dist/node_modules/@apollo/client/errors/CombinedGraphQLErrors.js.map +1 -0
- package/dist/node_modules/@apollo/client/errors/utils.js +16 -0
- package/dist/node_modules/@apollo/client/errors/utils.js.map +1 -0
- package/dist/planmagnet/PlanMagnetRoot.d.ts +5 -0
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -0
- package/dist/planmagnet/PlanMagnetRoot.js +292 -0
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -0
- package/dist/planmagnet/PlanMagnetRoutes.d.ts +2 -0
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -0
- package/dist/planmagnet/PlanMagnetRoutes.js +211 -0
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -0
- package/dist/planmagnet/index.d.ts +5 -0
- package/dist/planmagnet/index.d.ts.map +1 -0
- package/dist/planmagnet/index.js +3 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js +312 -0
- package/dist/planmagnet/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +110 -0
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +96 -0
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js +112 -0
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +141 -0
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +124 -0
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +1 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js +350 -0
- package/dist/planmagnet/pages/DashboardDashboardPagePage.js.map +1 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +290 -0
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +189 -0
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +151 -0
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +257 -0
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +221 -0
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +284 -0
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js +291 -0
- package/dist/planmagnet/pages/ProductsFeatureDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +257 -0
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +222 -0
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +288 -0
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +225 -0
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js +262 -0
- package/dist/planmagnet/pages/ProductsReleaseDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +162 -0
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +342 -0
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js +233 -0
- package/dist/planmagnet/pages/ProductsRoadmapDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +193 -0
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js +116 -0
- package/dist/planmagnet/pages/ProjectsActiveProjectsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +199 -0
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +197 -0
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js +173 -0
- package/dist/planmagnet/pages/ProjectsMilestoneDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +119 -0
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js +257 -0
- package/dist/planmagnet/pages/ProjectsPlanningDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +222 -0
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js +142 -0
- package/dist/planmagnet/pages/ProjectsPlanningPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js +363 -0
- package/dist/planmagnet/pages/ProjectsProjectDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js +176 -0
- package/dist/planmagnet/pages/ProjectsProjectsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js +173 -0
- package/dist/planmagnet/pages/ReportsCreateReportPagePage.js.map +1 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.js +221 -0
- package/dist/planmagnet/pages/ReportsReportsPagePage.js.map +1 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +282 -0
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +227 -0
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +234 -0
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +232 -0
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.js +206 -0
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js +138 -0
- package/dist/planmagnet/pages/TeamCreateTeamPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js +161 -0
- package/dist/planmagnet/pages/TeamInviteMemberPagePage.js.map +1 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts +2 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.js +203 -0
- package/dist/planmagnet/pages/TeamTeamPagePage.js.map +1 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts +2 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.d.ts.map +1 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js +97 -0
- package/dist/planmagnet/pages/WorkspaceCreateWorkspacePagePage.js.map +1 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.d.ts +31 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.d.ts.map +1 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.js +119 -0
- package/dist/planmagnet/providers/PlanMagnetProvider.js.map +1 -0
- package/dist/planmagnet/store/planmagnetStore.d.ts +30 -0
- package/dist/planmagnet/store/planmagnetStore.d.ts.map +1 -0
- package/dist/planmagnet/store/planmagnetStore.js +42 -0
- package/dist/planmagnet/store/planmagnetStore.js.map +1 -0
- package/dist/planmagnet/types/index.d.ts +317 -0
- package/dist/planmagnet/types/index.d.ts.map +1 -0
- package/dist/planmagnet/utils/cn.d.ts +4 -0
- package/dist/planmagnet/utils/cn.d.ts.map +1 -0
- package/dist/planmagnet/utils/navigation.d.ts +2 -0
- package/dist/planmagnet/utils/navigation.d.ts.map +1 -0
- package/dist/planmagnet/utils/navigation.js +8 -0
- package/dist/planmagnet/utils/navigation.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPlanningEditPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningEditPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState, useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery, useMutation } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, ArrowLeft } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_SPRINT_FOR_EDIT = gql`\n query GetSprintForEdit($workspaceId: ID!) {\n planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 1 }) {\n items {\n id\n name\n projectId\n status\n startDate\n endDate\n goal\n capacity\n }\n }\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n }\n }\n }\n`;\n\nconst UPDATE_SPRINT = gql`\n mutation UpdateSprint($id: ID!, $input: UpdateSprintInput!) {\n planmagnetUpdateSprint(id: $id, input: $input) {\n id\n name\n status\n startDate\n endDate\n goal\n capacity\n }\n }\n`;\n\nexport function ProjectsPlanningEditPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_SPRINT_FOR_EDIT, {\n variables: { workspaceId: workspaceId ?? 'default' },\n });\n\n const [successMessage, setSuccessMessage] = useState<string | null>(null);\n\n const sprint = data?.planmagnetSprints?.items?.[0];\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const defaultForm = useMemo(\n () => ({\n name: sprint?.name ?? '',\n status: sprint?.status ?? 'PLANNING',\n startDate: sprint?.startDate ? sprint.startDate.split('T')[0] : '',\n endDate: sprint?.endDate ? sprint.endDate.split('T')[0] : '',\n goal: sprint?.goal ?? '',\n capacity: sprint?.capacity?.toString() ?? '',\n }),\n [sprint]\n );\n\n const [formOverrides, setFormOverrides] = useState<Record<string, string>>({});\n const form = { ...defaultForm, ...formOverrides };\n const setForm = (updates: Record<string, string>) => setFormOverrides(updates);\n\n const [updateSprint, { loading: saving, error: saveError }] = useMutation(UPDATE_SPRINT, {\n refetchQueries: ['GetSprints', 'GetSprintDetail', 'GetSprintForEdit', 'GetDashboardData'],\n onCompleted: () => {\n setSuccessMessage('Sprint updated successfully.');\n },\n });\n\n const statuses = ['PLANNING', 'ACTIVE', 'REVIEW', 'COMPLETED', 'CANCELLED'] as const;\n\n const handleSave = () => {\n if (!sprint) return;\n planmagnetUpdateSprint({\n variables: {\n id: sprint.id,\n input: {\n name: form.name || undefined,\n status: form.status || undefined,\n startDate: form.startDate || undefined,\n endDate: form.endDate || undefined,\n goal: form.goal || undefined,\n capacity: form.capacity ? parseInt(form.capacity, 10) : undefined,\n },\n },\n });\n };\n\n if (loading)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error) return <div className=\"p-6 text-red-500\">Error loading sprint: {error.message}</div>;\n if (!sprint) return <div className=\"p-6 text-muted-foreground\">Planning session not found.</div>;\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Button variant=\"ghost\" size=\"sm\">\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-semibold\">Edit Planning Session</h1>\n <p className=\"text-sm text-muted-foreground\">{sprint.name}</p>\n </div>\n </div>\n <Button size=\"sm\" onClick={handleSave} disabled={saving}>\n <Save className=\"mr-1 h-4 w-4\" />\n {saving ? 'Saving...' : 'Save Changes'}\n </Button>\n </div>\n\n {successMessage && (\n <div className=\"p-3 bg-green-50 text-green-800 rounded-md text-sm\">{successMessage}</div>\n )}\n {saveError && (\n <div className=\"p-3 bg-red-50 text-red-800 rounded-md text-sm\">\n Error: {saveError.message}\n </div>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Session Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Project</label>\n <div className=\"mt-1 w-full rounded-md border border-input bg-muted px-3 py-2 text-sm text-muted-foreground\">\n {projects.find((p: { id: string; name: string }) => p.id === sprint.projectId)\n ?.name ?? sprint.projectId}\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Status</label>\n <select\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm\"\n value={form.status}\n onChange={(e) => setForm({ ...form, status: e.target.value })}\n >\n {statuses.map((s) => (\n <option key={s} value={s}>\n {s.toLowerCase().replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-sm font-medium\">Start Date</label>\n <Input\n type=\"date\"\n value={form.startDate}\n onChange={(e) => setForm({ ...form, startDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">End Date</label>\n <Input\n type=\"date\"\n value={form.endDate}\n onChange={(e) => setForm({ ...form, endDate: e.target.value })}\n className=\"mt-1\"\n />\n </div>\n </div>\n <div>\n <label className=\"text-sm font-medium\">Goal</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[60px]\"\n value={form.goal}\n onChange={(e) => setForm({ ...form, goal: e.target.value })}\n placeholder=\"Sprint goal...\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Capacity (story points)</label>\n <Input\n type=\"number\"\n value={form.capacity}\n onChange={(e) => setForm({ ...form, capacity: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. 40\"\n />\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPlanningPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsPlanningPagePage.tsx"],"names":[],"mappings":"AAwCA,wBAAgB,wBAAwB,4CAuHvC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { CalendarClock as t, FolderKanban as n } from "lucide-react";
|
|
3
|
+
import { gql as r } from "@apollo/client";
|
|
4
|
+
import { useQuery as i } from "@apollo/client/react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/planmagnet/pages/ProjectsPlanningPagePage.tsx
|
|
8
|
+
var f = r`
|
|
9
|
+
query GetSprints($workspaceId: ID!) {
|
|
10
|
+
planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 100 }) {
|
|
11
|
+
items {
|
|
12
|
+
id
|
|
13
|
+
name
|
|
14
|
+
projectId
|
|
15
|
+
status
|
|
16
|
+
startDate
|
|
17
|
+
endDate
|
|
18
|
+
goal
|
|
19
|
+
capacity
|
|
20
|
+
velocity
|
|
21
|
+
workItems {
|
|
22
|
+
id
|
|
23
|
+
status
|
|
24
|
+
storyPoints
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
totalCount
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
`, p = {
|
|
31
|
+
PLANNING: "bg-blue-100 text-blue-800",
|
|
32
|
+
ACTIVE: "bg-green-100 text-green-800",
|
|
33
|
+
REVIEW: "bg-purple-100 text-purple-800",
|
|
34
|
+
COMPLETED: "bg-gray-100 text-gray-800",
|
|
35
|
+
CANCELLED: "bg-red-100 text-red-800"
|
|
36
|
+
};
|
|
37
|
+
function m() {
|
|
38
|
+
let { workspaceId: r } = e(), { data: m, loading: h, error: g } = i(f, { variables: { workspaceId: r ?? "default" } });
|
|
39
|
+
if (h) return /* @__PURE__ */ a("div", {
|
|
40
|
+
className: "flex items-center justify-center p-12",
|
|
41
|
+
children: /* @__PURE__ */ a("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
42
|
+
});
|
|
43
|
+
if (g) return /* @__PURE__ */ o("div", {
|
|
44
|
+
className: "p-6 text-red-500",
|
|
45
|
+
children: ["Error loading planning sessions: ", g.message]
|
|
46
|
+
});
|
|
47
|
+
let _ = m?.planmagnetSprints?.items ?? [];
|
|
48
|
+
return /* @__PURE__ */ o("div", {
|
|
49
|
+
className: "space-y-6 p-6",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
|
|
52
|
+
className: "text-2xl font-semibold",
|
|
53
|
+
children: "Planning Sessions"
|
|
54
|
+
}), /* @__PURE__ */ o("p", {
|
|
55
|
+
className: "text-sm text-muted-foreground",
|
|
56
|
+
children: [_.length, " sprints across all projects"]
|
|
57
|
+
})] }),
|
|
58
|
+
/* @__PURE__ */ a("div", {
|
|
59
|
+
className: "grid grid-cols-1 md:grid-cols-2 gap-4",
|
|
60
|
+
children: _.map((e) => {
|
|
61
|
+
let r = e.workItems.reduce((e, t) => e + (t.storyPoints ?? 0), 0), i = e.capacity ?? 0, f = i > 0 ? Math.round(r / i * 100) : 0;
|
|
62
|
+
return /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, {
|
|
63
|
+
className: "pb-2",
|
|
64
|
+
children: /* @__PURE__ */ o("div", {
|
|
65
|
+
className: "flex items-center justify-between",
|
|
66
|
+
children: [/* @__PURE__ */ o(d, {
|
|
67
|
+
className: "text-base flex items-center gap-2",
|
|
68
|
+
children: [/* @__PURE__ */ a(t, { className: "h-4 w-4 text-primary" }), e.name]
|
|
69
|
+
}), /* @__PURE__ */ a(s, {
|
|
70
|
+
variant: e.status === "COMPLETED" ? "default" : "secondary",
|
|
71
|
+
className: "capitalize",
|
|
72
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
73
|
+
})]
|
|
74
|
+
})
|
|
75
|
+
}), /* @__PURE__ */ o(l, {
|
|
76
|
+
className: "space-y-3",
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ o("div", {
|
|
79
|
+
className: "flex gap-2",
|
|
80
|
+
children: [/* @__PURE__ */ a("span", {
|
|
81
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${p[e.status] ?? "bg-gray-100"}`,
|
|
82
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
83
|
+
}), /* @__PURE__ */ o("span", {
|
|
84
|
+
className: "text-xs text-muted-foreground flex items-center gap-1",
|
|
85
|
+
children: [/* @__PURE__ */ a(n, { className: "h-3 w-3" }), e.projectId]
|
|
86
|
+
})]
|
|
87
|
+
}),
|
|
88
|
+
e.goal && /* @__PURE__ */ a("p", {
|
|
89
|
+
className: "text-sm text-muted-foreground",
|
|
90
|
+
children: e.goal
|
|
91
|
+
}),
|
|
92
|
+
/* @__PURE__ */ o("div", {
|
|
93
|
+
className: "flex gap-3 text-xs text-muted-foreground",
|
|
94
|
+
children: [/* @__PURE__ */ o("span", {
|
|
95
|
+
className: "flex items-center gap-1",
|
|
96
|
+
children: [
|
|
97
|
+
/* @__PURE__ */ a(t, { className: "h-3 w-3" }),
|
|
98
|
+
e.startDate ? new Date(e.startDate).toLocaleDateString() : "—",
|
|
99
|
+
" -",
|
|
100
|
+
" ",
|
|
101
|
+
e.endDate ? new Date(e.endDate).toLocaleDateString() : "—"
|
|
102
|
+
]
|
|
103
|
+
}), /* @__PURE__ */ o("span", { children: [e.workItems.length, " work items"] })]
|
|
104
|
+
}),
|
|
105
|
+
i > 0 && /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("div", {
|
|
106
|
+
className: "flex justify-between text-xs mb-1",
|
|
107
|
+
children: [/* @__PURE__ */ a("span", {
|
|
108
|
+
className: "text-muted-foreground",
|
|
109
|
+
children: "Capacity"
|
|
110
|
+
}), /* @__PURE__ */ o("span", {
|
|
111
|
+
className: "font-medium",
|
|
112
|
+
children: [
|
|
113
|
+
r,
|
|
114
|
+
"/",
|
|
115
|
+
i,
|
|
116
|
+
" pts (",
|
|
117
|
+
f,
|
|
118
|
+
"%)"
|
|
119
|
+
]
|
|
120
|
+
})]
|
|
121
|
+
}), /* @__PURE__ */ a("div", {
|
|
122
|
+
className: "w-full h-2 rounded-full bg-muted overflow-hidden",
|
|
123
|
+
children: /* @__PURE__ */ a("div", {
|
|
124
|
+
className: `h-full rounded-full ${f > 90 ? "bg-red-400" : "bg-primary"}`,
|
|
125
|
+
style: { width: `${Math.min(f, 100)}%` }
|
|
126
|
+
})
|
|
127
|
+
})] })
|
|
128
|
+
]
|
|
129
|
+
})] }, e.id);
|
|
130
|
+
})
|
|
131
|
+
}),
|
|
132
|
+
_.length === 0 && /* @__PURE__ */ a("p", {
|
|
133
|
+
className: "text-center text-muted-foreground py-8",
|
|
134
|
+
children: "No planning sessions found."
|
|
135
|
+
})
|
|
136
|
+
]
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
//#endregion
|
|
140
|
+
export { m as ProjectsPlanningPagePage };
|
|
141
|
+
|
|
142
|
+
//# sourceMappingURL=ProjectsPlanningPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsPlanningPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsPlanningPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { CalendarClock, FolderKanban } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_SPRINTS = gql`\n query GetSprints($workspaceId: ID!) {\n planmagnetSprints(workspaceId: $workspaceId, pagination: { first: 100 }) {\n items {\n id\n name\n projectId\n status\n startDate\n endDate\n goal\n capacity\n velocity\n workItems {\n id\n status\n storyPoints\n }\n }\n totalCount\n }\n }\n`;\n\nconst statusColor: Record<string, string> = {\n PLANNING: 'bg-blue-100 text-blue-800',\n ACTIVE: 'bg-green-100 text-green-800',\n REVIEW: 'bg-purple-100 text-purple-800',\n COMPLETED: 'bg-gray-100 text-gray-800',\n CANCELLED: 'bg-red-100 text-red-800',\n};\n\nexport function ProjectsPlanningPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_SPRINTS, {\n variables: { workspaceId: workspaceId ?? 'default' },\n });\n\n if (loading)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error)\n return <div className=\"p-6 text-red-500\">Error loading planning sessions: {error.message}</div>;\n\n const sprints = data?.planmagnetSprints?.items ?? [];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Planning Sessions</h1>\n <p className=\"text-sm text-muted-foreground\">\n {sprints.length} sprints across all projects\n </p>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n {sprints.map(\n (sprint: {\n id: string;\n name: string;\n projectId: string;\n status: string;\n startDate: string | null;\n endDate: string | null;\n goal: string | null;\n capacity: number | null;\n velocity: number | null;\n workItems: { id: string; status: string; storyPoints: number | null }[];\n }) => {\n const totalPoints = sprint.workItems.reduce(\n (sum: number, wi: { storyPoints: number | null }) => sum + (wi.storyPoints ?? 0),\n 0\n );\n const allocatedCapacity = sprint.capacity ?? 0;\n const capPct =\n allocatedCapacity > 0 ? Math.round((totalPoints / allocatedCapacity) * 100) : 0;\n return (\n <Card key={sprint.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base flex items-center gap-2\">\n <CalendarClock className=\"h-4 w-4 text-primary\" />\n {sprint.name}\n </CardTitle>\n <Badge\n variant={sprint.status === 'COMPLETED' ? 'default' : 'secondary'}\n className=\"capitalize\"\n >\n {sprint.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex gap-2\">\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[sprint.status] ?? 'bg-gray-100'}`}\n >\n {sprint.status.toLowerCase().replace('_', ' ')}\n </span>\n <span className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <FolderKanban className=\"h-3 w-3\" />\n {sprint.projectId}\n </span>\n </div>\n {sprint.goal && <p className=\"text-sm text-muted-foreground\">{sprint.goal}</p>}\n <div className=\"flex gap-3 text-xs text-muted-foreground\">\n <span className=\"flex items-center gap-1\">\n <CalendarClock className=\"h-3 w-3\" />\n {sprint.startDate\n ? new Date(sprint.startDate).toLocaleDateString()\n : '—'} -{' '}\n {sprint.endDate ? new Date(sprint.endDate).toLocaleDateString() : '—'}\n </span>\n <span>{sprint.workItems.length} work items</span>\n </div>\n {allocatedCapacity > 0 && (\n <div>\n <div className=\"flex justify-between text-xs mb-1\">\n <span className=\"text-muted-foreground\">Capacity</span>\n <span className=\"font-medium\">\n {totalPoints}/{allocatedCapacity} pts ({capPct}%)\n </span>\n </div>\n <div className=\"w-full h-2 rounded-full bg-muted overflow-hidden\">\n <div\n className={`h-full rounded-full ${capPct > 90 ? 'bg-red-400' : 'bg-primary'}`}\n style={{ width: `${Math.min(capPct, 100)}%` }}\n />\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n );\n }\n )}\n </div>\n {sprints.length === 0 && (\n <p className=\"text-center text-muted-foreground py-8\">No planning sessions found.</p>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsProjectDetailPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"names":[],"mappings":"AAuEA,wBAAgB,6BAA6B,4CAyS5C"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
+
import { Calendar as t, CheckSquare as n, FolderKanban as r, Users as i, Zap as a } from "lucide-react";
|
|
3
|
+
import { gql as o } from "@apollo/client";
|
|
4
|
+
import { useQuery as s } from "@apollo/client/react";
|
|
5
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as u, Card as d, CardContent as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx
|
|
8
|
+
var h = o`
|
|
9
|
+
query GetProjectDetail($workspaceId: ID!) {
|
|
10
|
+
planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 1 }) {
|
|
11
|
+
items {
|
|
12
|
+
id
|
|
13
|
+
name
|
|
14
|
+
key
|
|
15
|
+
description
|
|
16
|
+
status
|
|
17
|
+
methodology
|
|
18
|
+
ownerId
|
|
19
|
+
startDate
|
|
20
|
+
endDate
|
|
21
|
+
tags
|
|
22
|
+
createdAt
|
|
23
|
+
sprints {
|
|
24
|
+
id
|
|
25
|
+
name
|
|
26
|
+
status
|
|
27
|
+
goal
|
|
28
|
+
capacity
|
|
29
|
+
velocity
|
|
30
|
+
startDate
|
|
31
|
+
endDate
|
|
32
|
+
workItems {
|
|
33
|
+
id
|
|
34
|
+
status
|
|
35
|
+
storyPoints
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
milestones {
|
|
39
|
+
id
|
|
40
|
+
name
|
|
41
|
+
description
|
|
42
|
+
status
|
|
43
|
+
dueDate
|
|
44
|
+
ownerId
|
|
45
|
+
}
|
|
46
|
+
workItems {
|
|
47
|
+
id
|
|
48
|
+
key
|
|
49
|
+
description
|
|
50
|
+
status
|
|
51
|
+
priority
|
|
52
|
+
storyPoints
|
|
53
|
+
assigneeId
|
|
54
|
+
labels
|
|
55
|
+
createdAt
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`, g = {
|
|
61
|
+
ACTIVE: "bg-green-100 text-green-800",
|
|
62
|
+
ON_HOLD: "bg-orange-100 text-orange-800",
|
|
63
|
+
CANCELLED: "bg-red-100 text-red-800",
|
|
64
|
+
COMPLETED: "bg-blue-100 text-blue-800",
|
|
65
|
+
PLANNING: "bg-gray-100 text-gray-800",
|
|
66
|
+
ARCHIVED: "bg-gray-100 text-gray-800"
|
|
67
|
+
};
|
|
68
|
+
function _() {
|
|
69
|
+
let { workspaceId: o } = e(), { data: _, loading: v, error: y } = s(h, { variables: { workspaceId: o ?? "default" } });
|
|
70
|
+
if (v) return /* @__PURE__ */ c("div", {
|
|
71
|
+
className: "flex items-center justify-center p-12",
|
|
72
|
+
children: /* @__PURE__ */ c("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
73
|
+
});
|
|
74
|
+
if (y) return /* @__PURE__ */ l("div", {
|
|
75
|
+
className: "p-6 text-red-500",
|
|
76
|
+
children: ["Error loading project: ", y.message]
|
|
77
|
+
});
|
|
78
|
+
let b = _?.planmagnetProjects?.items?.[0];
|
|
79
|
+
if (!b) return /* @__PURE__ */ c("div", {
|
|
80
|
+
className: "p-6 text-muted-foreground",
|
|
81
|
+
children: "Project not found."
|
|
82
|
+
});
|
|
83
|
+
let x = b.workItems ?? [], S = b.sprints ?? [], C = b.milestones ?? [], w = S.find((e) => e.status === "ACTIVE"), T = x.length, E = x.filter((e) => e.status === "DONE").length;
|
|
84
|
+
return /* @__PURE__ */ l("div", {
|
|
85
|
+
className: "space-y-6 p-6",
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ l("div", {
|
|
88
|
+
className: "flex items-center justify-between",
|
|
89
|
+
children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("div", {
|
|
90
|
+
className: "flex items-center gap-2",
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ c(r, { className: "h-5 w-5 text-primary" }),
|
|
93
|
+
/* @__PURE__ */ c("h1", {
|
|
94
|
+
className: "text-2xl font-semibold",
|
|
95
|
+
children: b.name
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ c("span", {
|
|
98
|
+
className: `text-xs px-2 py-0.5 rounded-full capitalize ${g[b.status] ?? "bg-gray-100"}`,
|
|
99
|
+
children: b.status.toLowerCase().replace("_", " ")
|
|
100
|
+
})
|
|
101
|
+
]
|
|
102
|
+
}), /* @__PURE__ */ c("p", {
|
|
103
|
+
className: "text-sm text-muted-foreground mt-1",
|
|
104
|
+
children: b.description ?? "No description"
|
|
105
|
+
})] }), /* @__PURE__ */ l("div", {
|
|
106
|
+
className: "flex gap-2",
|
|
107
|
+
children: [/* @__PURE__ */ c(u, {
|
|
108
|
+
className: "capitalize",
|
|
109
|
+
children: b.status.toLowerCase().replace("_", " ")
|
|
110
|
+
}), /* @__PURE__ */ c(u, {
|
|
111
|
+
variant: "outline",
|
|
112
|
+
className: "capitalize",
|
|
113
|
+
children: b.methodology.toLowerCase()
|
|
114
|
+
})]
|
|
115
|
+
})]
|
|
116
|
+
}),
|
|
117
|
+
/* @__PURE__ */ l("div", {
|
|
118
|
+
className: "grid grid-cols-2 md:grid-cols-4 gap-4",
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
121
|
+
className: "pt-4",
|
|
122
|
+
children: [/* @__PURE__ */ l("div", {
|
|
123
|
+
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
124
|
+
children: [/* @__PURE__ */ c(n, { className: "h-4 w-4" }), "Work Items"]
|
|
125
|
+
}), /* @__PURE__ */ l("p", {
|
|
126
|
+
className: "text-xl font-bold mt-1",
|
|
127
|
+
children: [
|
|
128
|
+
E,
|
|
129
|
+
"/",
|
|
130
|
+
T
|
|
131
|
+
]
|
|
132
|
+
})]
|
|
133
|
+
}) }),
|
|
134
|
+
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
135
|
+
className: "pt-4",
|
|
136
|
+
children: [/* @__PURE__ */ l("div", {
|
|
137
|
+
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
138
|
+
children: [/* @__PURE__ */ c(a, { className: "h-4 w-4" }), "Sprints"]
|
|
139
|
+
}), /* @__PURE__ */ c("p", {
|
|
140
|
+
className: "text-xl font-bold mt-1",
|
|
141
|
+
children: S.length
|
|
142
|
+
})]
|
|
143
|
+
}) }),
|
|
144
|
+
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
145
|
+
className: "pt-4",
|
|
146
|
+
children: [/* @__PURE__ */ l("div", {
|
|
147
|
+
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
148
|
+
children: [/* @__PURE__ */ c(t, { className: "h-4 w-4" }), "Milestones"]
|
|
149
|
+
}), /* @__PURE__ */ c("p", {
|
|
150
|
+
className: "text-xl font-bold mt-1",
|
|
151
|
+
children: C.length
|
|
152
|
+
})]
|
|
153
|
+
}) }),
|
|
154
|
+
/* @__PURE__ */ c(d, { children: /* @__PURE__ */ l(f, {
|
|
155
|
+
className: "pt-4",
|
|
156
|
+
children: [/* @__PURE__ */ l("div", {
|
|
157
|
+
className: "flex items-center gap-2 text-muted-foreground text-xs",
|
|
158
|
+
children: [/* @__PURE__ */ c(i, { className: "h-4 w-4" }), "Owner"]
|
|
159
|
+
}), /* @__PURE__ */ c("p", {
|
|
160
|
+
className: "text-sm font-bold mt-1 truncate",
|
|
161
|
+
children: b.ownerId
|
|
162
|
+
})]
|
|
163
|
+
}) })
|
|
164
|
+
]
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ l("div", {
|
|
167
|
+
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
168
|
+
children: [/* @__PURE__ */ l("div", {
|
|
169
|
+
className: "lg:col-span-2 space-y-6",
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ c(m, { children: "Timeline" }) }), /* @__PURE__ */ l(f, { children: [
|
|
172
|
+
/* @__PURE__ */ l("div", {
|
|
173
|
+
className: "flex justify-between text-sm mb-2",
|
|
174
|
+
children: [/* @__PURE__ */ c("span", {
|
|
175
|
+
className: "text-muted-foreground",
|
|
176
|
+
children: "Duration"
|
|
177
|
+
}), /* @__PURE__ */ c("span", {
|
|
178
|
+
className: "font-medium",
|
|
179
|
+
children: T > 0 ? `${Math.round(E / T * 100)}% tasks done` : "No tasks yet"
|
|
180
|
+
})]
|
|
181
|
+
}),
|
|
182
|
+
/* @__PURE__ */ c("div", {
|
|
183
|
+
className: "w-full h-4 rounded-full bg-muted overflow-hidden",
|
|
184
|
+
children: /* @__PURE__ */ c("div", {
|
|
185
|
+
className: "h-full bg-primary rounded-full",
|
|
186
|
+
style: { width: `${T > 0 ? Math.round(E / T * 100) : 0}%` }
|
|
187
|
+
})
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ l("div", {
|
|
190
|
+
className: "flex justify-between text-xs text-muted-foreground mt-2",
|
|
191
|
+
children: [/* @__PURE__ */ c("span", { children: b.startDate ? new Date(b.startDate).toLocaleDateString() : "Not set" }), /* @__PURE__ */ c("span", { children: b.endDate ? new Date(b.endDate).toLocaleDateString() : "Not set" })]
|
|
192
|
+
})
|
|
193
|
+
] })] }),
|
|
194
|
+
w && /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ l(m, {
|
|
195
|
+
className: "flex items-center gap-2",
|
|
196
|
+
children: [/* @__PURE__ */ c(a, { className: "h-4 w-4 text-primary" }), "Active Sprint"]
|
|
197
|
+
}) }), /* @__PURE__ */ l(f, {
|
|
198
|
+
className: "space-y-3",
|
|
199
|
+
children: [
|
|
200
|
+
/* @__PURE__ */ l("div", {
|
|
201
|
+
className: "flex justify-between",
|
|
202
|
+
children: [/* @__PURE__ */ c("span", {
|
|
203
|
+
className: "font-medium",
|
|
204
|
+
children: w.name
|
|
205
|
+
}), /* @__PURE__ */ c(u, { children: "Active" })]
|
|
206
|
+
}),
|
|
207
|
+
w.goal && /* @__PURE__ */ c("p", {
|
|
208
|
+
className: "text-sm text-muted-foreground",
|
|
209
|
+
children: w.goal
|
|
210
|
+
}),
|
|
211
|
+
/* @__PURE__ */ l("div", {
|
|
212
|
+
className: "grid grid-cols-3 gap-4 text-center",
|
|
213
|
+
children: [
|
|
214
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("p", {
|
|
215
|
+
className: "text-lg font-semibold",
|
|
216
|
+
children: [
|
|
217
|
+
w.workItems?.filter((e) => e.status === "DONE").reduce((e, t) => e + (t.storyPoints ?? 0), 0),
|
|
218
|
+
"/",
|
|
219
|
+
w.workItems?.reduce((e, t) => e + (t.storyPoints ?? 0), 0) ?? 0
|
|
220
|
+
]
|
|
221
|
+
}), /* @__PURE__ */ c("p", {
|
|
222
|
+
className: "text-xs text-muted-foreground",
|
|
223
|
+
children: "Points"
|
|
224
|
+
})] }),
|
|
225
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("p", {
|
|
226
|
+
className: "text-lg font-semibold",
|
|
227
|
+
children: [
|
|
228
|
+
w.workItems?.filter((e) => e.status === "DONE").length ?? 0,
|
|
229
|
+
"/",
|
|
230
|
+
w.workItems?.length ?? 0
|
|
231
|
+
]
|
|
232
|
+
}), /* @__PURE__ */ c("p", {
|
|
233
|
+
className: "text-xs text-muted-foreground",
|
|
234
|
+
children: "Tasks"
|
|
235
|
+
})] }),
|
|
236
|
+
/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
237
|
+
className: "text-lg font-semibold",
|
|
238
|
+
children: w.velocity ?? 0
|
|
239
|
+
}), /* @__PURE__ */ c("p", {
|
|
240
|
+
className: "text-xs text-muted-foreground",
|
|
241
|
+
children: "Velocity"
|
|
242
|
+
})] })
|
|
243
|
+
]
|
|
244
|
+
})
|
|
245
|
+
]
|
|
246
|
+
})] }),
|
|
247
|
+
/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ l(m, { children: [
|
|
248
|
+
"Recent Work Items (",
|
|
249
|
+
x.length,
|
|
250
|
+
")"
|
|
251
|
+
] }) }), /* @__PURE__ */ l(f, {
|
|
252
|
+
className: "space-y-2",
|
|
253
|
+
children: [x.slice(0, 5).map((e) => /* @__PURE__ */ l("div", {
|
|
254
|
+
className: "flex items-center justify-between border rounded-md p-2.5",
|
|
255
|
+
children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("p", {
|
|
256
|
+
className: "text-sm font-medium",
|
|
257
|
+
children: e.key
|
|
258
|
+
}), /* @__PURE__ */ c("div", {
|
|
259
|
+
className: "flex gap-1 mt-1",
|
|
260
|
+
children: e.labels.map((e) => /* @__PURE__ */ c("span", {
|
|
261
|
+
className: "text-[10px] px-1.5 py-0.5 rounded bg-muted",
|
|
262
|
+
children: e
|
|
263
|
+
}, e))
|
|
264
|
+
})] }), /* @__PURE__ */ l("div", {
|
|
265
|
+
className: "flex items-center gap-2",
|
|
266
|
+
children: [/* @__PURE__ */ l("span", {
|
|
267
|
+
className: "text-xs text-muted-foreground",
|
|
268
|
+
children: [e.storyPoints ?? 0, " pts"]
|
|
269
|
+
}), /* @__PURE__ */ c(u, {
|
|
270
|
+
variant: "secondary",
|
|
271
|
+
className: "capitalize text-xs",
|
|
272
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
273
|
+
})]
|
|
274
|
+
})]
|
|
275
|
+
}, e.id)), x.length === 0 && /* @__PURE__ */ c("p", {
|
|
276
|
+
className: "text-sm text-muted-foreground text-center py-4",
|
|
277
|
+
children: "No work items yet."
|
|
278
|
+
})]
|
|
279
|
+
})] })
|
|
280
|
+
]
|
|
281
|
+
}), /* @__PURE__ */ l("div", {
|
|
282
|
+
className: "space-y-6",
|
|
283
|
+
children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ l(m, { children: [
|
|
284
|
+
"Milestones (",
|
|
285
|
+
C.length,
|
|
286
|
+
")"
|
|
287
|
+
] }) }), /* @__PURE__ */ l(f, {
|
|
288
|
+
className: "space-y-3",
|
|
289
|
+
children: [C.map((e) => /* @__PURE__ */ l("div", {
|
|
290
|
+
className: "border-b pb-2 last:border-0",
|
|
291
|
+
children: [/* @__PURE__ */ l("div", {
|
|
292
|
+
className: "flex justify-between",
|
|
293
|
+
children: [/* @__PURE__ */ c("span", {
|
|
294
|
+
className: "text-sm font-medium",
|
|
295
|
+
children: e.name
|
|
296
|
+
}), /* @__PURE__ */ c(u, {
|
|
297
|
+
variant: "outline",
|
|
298
|
+
className: "text-xs capitalize",
|
|
299
|
+
children: e.status.toLowerCase().replace("_", " ")
|
|
300
|
+
})]
|
|
301
|
+
}), /* @__PURE__ */ l("div", {
|
|
302
|
+
className: "flex items-center gap-1 text-xs text-muted-foreground mt-1",
|
|
303
|
+
children: [/* @__PURE__ */ c(t, { className: "h-3 w-3" }), e.dueDate ? new Date(e.dueDate).toLocaleDateString() : "No due date"]
|
|
304
|
+
})]
|
|
305
|
+
}, e.id)), C.length === 0 && /* @__PURE__ */ c("p", {
|
|
306
|
+
className: "text-sm text-muted-foreground text-center py-2",
|
|
307
|
+
children: "No milestones."
|
|
308
|
+
})]
|
|
309
|
+
})] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(p, { children: /* @__PURE__ */ c(m, { children: "Details" }) }), /* @__PURE__ */ l(f, {
|
|
310
|
+
className: "space-y-2 text-sm",
|
|
311
|
+
children: [
|
|
312
|
+
/* @__PURE__ */ l("div", {
|
|
313
|
+
className: "flex justify-between",
|
|
314
|
+
children: [/* @__PURE__ */ c("span", {
|
|
315
|
+
className: "text-muted-foreground",
|
|
316
|
+
children: "Owner"
|
|
317
|
+
}), /* @__PURE__ */ c("span", { children: b.ownerId })]
|
|
318
|
+
}),
|
|
319
|
+
/* @__PURE__ */ l("div", {
|
|
320
|
+
className: "flex justify-between",
|
|
321
|
+
children: [/* @__PURE__ */ c("span", {
|
|
322
|
+
className: "text-muted-foreground",
|
|
323
|
+
children: "Key"
|
|
324
|
+
}), /* @__PURE__ */ c("span", {
|
|
325
|
+
className: "font-mono",
|
|
326
|
+
children: b.key
|
|
327
|
+
})]
|
|
328
|
+
}),
|
|
329
|
+
/* @__PURE__ */ l("div", {
|
|
330
|
+
className: "flex justify-between",
|
|
331
|
+
children: [/* @__PURE__ */ c("span", {
|
|
332
|
+
className: "text-muted-foreground",
|
|
333
|
+
children: "Methodology"
|
|
334
|
+
}), /* @__PURE__ */ c("span", {
|
|
335
|
+
className: "capitalize",
|
|
336
|
+
children: b.methodology.toLowerCase()
|
|
337
|
+
})]
|
|
338
|
+
}),
|
|
339
|
+
b.tags.length > 0 && /* @__PURE__ */ l("div", {
|
|
340
|
+
className: "flex justify-between items-start",
|
|
341
|
+
children: [/* @__PURE__ */ c("span", {
|
|
342
|
+
className: "text-muted-foreground",
|
|
343
|
+
children: "Tags"
|
|
344
|
+
}), /* @__PURE__ */ c("div", {
|
|
345
|
+
className: "flex gap-1 flex-wrap justify-end",
|
|
346
|
+
children: b.tags.map((e) => /* @__PURE__ */ c(u, {
|
|
347
|
+
variant: "outline",
|
|
348
|
+
className: "text-xs",
|
|
349
|
+
children: e
|
|
350
|
+
}, e))
|
|
351
|
+
})]
|
|
352
|
+
})
|
|
353
|
+
]
|
|
354
|
+
})] })]
|
|
355
|
+
})]
|
|
356
|
+
})
|
|
357
|
+
]
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
//#endregion
|
|
361
|
+
export { _ as ProjectsProjectDetailPagePage };
|
|
362
|
+
|
|
363
|
+
//# sourceMappingURL=ProjectsProjectDetailPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsProjectDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/ProjectsProjectDetailPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { FolderKanban, CheckSquare, Users, Zap, Calendar } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECT_DETAIL = gql`\n query GetProjectDetail($workspaceId: ID!) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: { first: 1 }) {\n items {\n id\n name\n key\n description\n status\n methodology\n ownerId\n startDate\n endDate\n tags\n createdAt\n sprints {\n id\n name\n status\n goal\n capacity\n velocity\n startDate\n endDate\n workItems {\n id\n status\n storyPoints\n }\n }\n milestones {\n id\n name\n description\n status\n dueDate\n ownerId\n }\n workItems {\n id\n key\n description\n status\n priority\n storyPoints\n assigneeId\n labels\n createdAt\n }\n }\n }\n }\n`;\n\nconst statusColor: Record<string, string> = {\n ACTIVE: 'bg-green-100 text-green-800',\n ON_HOLD: 'bg-orange-100 text-orange-800',\n CANCELLED: 'bg-red-100 text-red-800',\n COMPLETED: 'bg-blue-100 text-blue-800',\n PLANNING: 'bg-gray-100 text-gray-800',\n ARCHIVED: 'bg-gray-100 text-gray-800',\n};\n\nexport function ProjectsProjectDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const {\n data,\n loading,\n error,\n } = // eslint-disable-next-line @typescript-eslint/no-explicit-any\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n useQuery<Record<string, any>>(GET_PROJECT_DETAIL, {\n variables: { workspaceId: workspaceId ?? 'default' },\n });\n\n if (loading)\n return (\n <div className=\"flex items-center justify-center p-12\">\n <div className=\"animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full\" />\n </div>\n );\n if (error) return <div className=\"p-6 text-red-500\">Error loading project: {error.message}</div>;\n\n const project = data?.planmagnetProjects?.items?.[0];\n if (!project) return <div className=\"p-6 text-muted-foreground\">Project not found.</div>;\n\n const projectWorkItems = project.workItems ?? [];\n const projectSprints = project.sprints ?? [];\n const projectMilestones = project.milestones ?? [];\n const activeSprint = projectSprints.find((s: { status: string }) => s.status === 'ACTIVE');\n const totalTasks = projectWorkItems.length;\n const completedTasks = projectWorkItems.filter(\n (wi: { status: string }) => wi.status === 'DONE'\n ).length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2\">\n <FolderKanban className=\"h-5 w-5 text-primary\" />\n <h1 className=\"text-2xl font-semibold\">{project.name}</h1>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[project.status] ?? 'bg-gray-100'}`}\n >\n {project.status.toLowerCase().replace('_', ' ')}\n </span>\n </div>\n <p className=\"text-sm text-muted-foreground mt-1\">\n {project.description ?? 'No description'}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge className=\"capitalize\">{project.status.toLowerCase().replace('_', ' ')}</Badge>\n <Badge variant=\"outline\" className=\"capitalize\">\n {project.methodology.toLowerCase()}\n </Badge>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <CheckSquare className=\"h-4 w-4\" />\n Work Items\n </div>\n <p className=\"text-xl font-bold mt-1\">\n {completedTasks}/{totalTasks}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Zap className=\"h-4 w-4\" />\n Sprints\n </div>\n <p className=\"text-xl font-bold mt-1\">{projectSprints.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Calendar className=\"h-4 w-4\" />\n Milestones\n </div>\n <p className=\"text-xl font-bold mt-1\">{projectMilestones.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-muted-foreground text-xs\">\n <Users className=\"h-4 w-4\" />\n Owner\n </div>\n <p className=\"text-sm font-bold mt-1 truncate\">{project.ownerId}</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid grid-cols-1 lg:grid-cols-3 gap-6\">\n <div className=\"lg:col-span-2 space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Timeline</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex justify-between text-sm mb-2\">\n <span className=\"text-muted-foreground\">Duration</span>\n <span className=\"font-medium\">\n {totalTasks > 0\n ? `${Math.round((completedTasks / totalTasks) * 100)}% tasks done`\n : 'No tasks yet'}\n </span>\n </div>\n <div className=\"w-full h-4 rounded-full bg-muted overflow-hidden\">\n <div\n className=\"h-full bg-primary rounded-full\"\n style={{\n width: `${totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0}%`,\n }}\n />\n </div>\n <div className=\"flex justify-between text-xs text-muted-foreground mt-2\">\n <span>\n {project.startDate ? new Date(project.startDate).toLocaleDateString() : 'Not set'}\n </span>\n <span>\n {project.endDate ? new Date(project.endDate).toLocaleDateString() : 'Not set'}\n </span>\n </div>\n </CardContent>\n </Card>\n\n {activeSprint && (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Zap className=\"h-4 w-4 text-primary\" />\n Active Sprint\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex justify-between\">\n <span className=\"font-medium\">{activeSprint.name}</span>\n <Badge>Active</Badge>\n </div>\n {activeSprint.goal && (\n <p className=\"text-sm text-muted-foreground\">{activeSprint.goal}</p>\n )}\n <div className=\"grid grid-cols-3 gap-4 text-center\">\n <div>\n <p className=\"text-lg font-semibold\">\n {activeSprint.workItems\n ?.filter((wi: { status: string }) => wi.status === 'DONE')\n .reduce(\n (s: number, wi: { storyPoints: number | null }) =>\n s + (wi.storyPoints ?? 0),\n 0\n )}\n /\n {activeSprint.workItems?.reduce(\n (s: number, wi: { storyPoints: number | null }) =>\n s + (wi.storyPoints ?? 0),\n 0\n ) ?? 0}\n </p>\n <p className=\"text-xs text-muted-foreground\">Points</p>\n </div>\n <div>\n <p className=\"text-lg font-semibold\">\n {activeSprint.workItems?.filter(\n (wi: { status: string }) => wi.status === 'DONE'\n ).length ?? 0}\n /{activeSprint.workItems?.length ?? 0}\n </p>\n <p className=\"text-xs text-muted-foreground\">Tasks</p>\n </div>\n <div>\n <p className=\"text-lg font-semibold\">{activeSprint.velocity ?? 0}</p>\n <p className=\"text-xs text-muted-foreground\">Velocity</p>\n </div>\n </div>\n </CardContent>\n </Card>\n )}\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Work Items ({projectWorkItems.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {projectWorkItems\n .slice(0, 5)\n .map(\n (task: {\n id: string;\n key: string;\n description: string | null;\n status: string;\n storyPoints: number | null;\n labels: string[];\n }) => (\n <div\n key={task.id}\n className=\"flex items-center justify-between border rounded-md p-2.5\"\n >\n <div>\n <p className=\"text-sm font-medium\">{task.key}</p>\n <div className=\"flex gap-1 mt-1\">\n {task.labels.map((l: string) => (\n <span key={l} className=\"text-[10px] px-1.5 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-muted-foreground\">\n {task.storyPoints ?? 0} pts\n </span>\n <Badge variant=\"secondary\" className=\"capitalize text-xs\">\n {task.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n </div>\n )\n )}\n {projectWorkItems.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-4\">No work items yet.</p>\n )}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Milestones ({projectMilestones.length})</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {projectMilestones.map(\n (ms: { id: string; name: string; status: string; dueDate: string | null }) => (\n <div key={ms.id} className=\"border-b pb-2 last:border-0\">\n <div className=\"flex justify-between\">\n <span className=\"text-sm font-medium\">{ms.name}</span>\n <Badge variant=\"outline\" className=\"text-xs capitalize\">\n {ms.status.toLowerCase().replace('_', ' ')}\n </Badge>\n </div>\n <div className=\"flex items-center gap-1 text-xs text-muted-foreground mt-1\">\n <Calendar className=\"h-3 w-3\" />\n {ms.dueDate ? new Date(ms.dueDate).toLocaleDateString() : 'No due date'}\n </div>\n </div>\n )\n )}\n {projectMilestones.length === 0 && (\n <p className=\"text-sm text-muted-foreground text-center py-2\">No milestones.</p>\n )}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Owner</span>\n <span>{project.ownerId}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span className=\"font-mono\">{project.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Methodology</span>\n <span className=\"capitalize\">{project.methodology.toLowerCase()}</span>\n </div>\n {project.tags.length > 0 && (\n <div className=\"flex justify-between items-start\">\n <span className=\"text-muted-foreground\">Tags</span>\n <div className=\"flex gap-1 flex-wrap justify-end\">\n {project.tags.map((tag: string) => (\n <Badge key={tag} variant=\"outline\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProjectsProjectsPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/ProjectsProjectsPagePage.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,wBAAwB,4CA6JvC"}
|