@burdenoff/microfe-planmagnet 2026.716.1 → 2026.719.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/planmagnet/PlanMagnetRoot.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoot.js +98 -173
- package/dist/planmagnet/PlanMagnetRoot.js.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.d.ts.map +1 -1
- package/dist/planmagnet/PlanMagnetRoutes.js +43 -67
- package/dist/planmagnet/PlanMagnetRoutes.js.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js +2 -2
- package/dist/planmagnet/pages/ProductsCreateProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js +2 -2
- package/dist/planmagnet/pages/ProductsCreateRoadmapPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js +2 -2
- package/dist/planmagnet/pages/ProductsEditProductPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js +2 -2
- package/dist/planmagnet/pages/ProductsEditReleasePagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsFeatureAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsFeaturesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js +2 -2
- package/dist/planmagnet/pages/ProductsNewFeaturePagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsProductDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsProductsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsReleasesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapAnalyticsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js +1 -1
- package/dist/planmagnet/pages/ProductsRoadmapsPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js +2 -2
- package/dist/planmagnet/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js +2 -2
- package/dist/planmagnet/pages/ProjectsEditProjectPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js +1 -1
- package/dist/planmagnet/pages/ProjectsMilestonesPagePage.js.map +1 -1
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js +2 -2
- package/dist/planmagnet/pages/ProjectsPlanningEditPagePage.js.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js +75 -86
- package/dist/planmagnet/pages/SprintsStartSprintPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js +1 -1
- package/dist/planmagnet/pages/TasksCreateTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js +6 -10
- package/dist/planmagnet/pages/TasksEditTaskPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js +4 -8
- package/dist/planmagnet/pages/TasksTaskDetailPagePage.js.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.d.ts.map +1 -1
- package/dist/planmagnet/pages/TasksTasksPagePage.js +8 -9
- package/dist/planmagnet/pages/TasksTasksPagePage.js.map +1 -1
- package/package.json +1 -1
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js +0 -110
- package/dist/planmagnet/pages/CollaborationCollaborationPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js +0 -96
- package/dist/planmagnet/pages/CollaborationCreateChannelPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/CollaborationFilesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js +0 -112
- package/dist/planmagnet/pages/CollaborationFilesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js +0 -141
- package/dist/planmagnet/pages/CollaborationMessagesPagePage.js.map +0 -1
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js +0 -124
- package/dist/planmagnet/pages/CollaborationNewDiscussionPagePage.js.map +0 -1
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts +0 -2
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.d.ts.map +0 -1
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js +0 -290
- package/dist/planmagnet/pages/MeetingsScheduleMeetingPagePage.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.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 { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workspaceId: ID!, $workItemId: ID!) {\n planmagnetWorkItem(workspaceId: $workspaceId, id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n boardColumnId\n storyPoints\n estimatedHours\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n boardColumnId: string | null;\n storyPoints: number | null;\n estimatedHours: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-800',\n MEDIUM: 'bg-blue-100 text-blue-800',\n HIGH: 'bg-orange-100 text-orange-800',\n CRITICAL: 'bg-red-100 text-red-800',\n};\n\nconst statusColor: Record<string, string> = {\n BACKLOG: 'bg-gray-100 text-gray-800',\n TODO: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-yellow-100 text-yellow-800',\n IN_REVIEW: 'bg-purple-100 text-purple-800',\n DONE: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n TESTING: 'bg-teal-100 text-teal-800',\n CANCELLED: 'bg-gray-100 text-gray-800',\n};\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n workItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workspaceId, workItemId },\n skip: !workspaceId || !workItemId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n const statusDisplay = task.status.toLowerCase().replace('_', ' ');\n\n const activityLog = [\n { action: 'Task created', by: task.reporterId ?? 'Unknown', at: task.createdAt },\n {\n action: `Assigned to ${task.assigneeId ?? 'Unassigned'}`,\n by: task.reporterId ?? 'Unknown',\n at: task.createdAt,\n },\n {\n action: `Status changed to ${statusDisplay}`,\n by: task.assigneeId ?? 'Unknown',\n at: task.updatedAt,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} · {task.type.toLowerCase()}\n </p>\n </div>\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>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {activityLog.map((a, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-primary mt-1.5\" />\n {i < activityLog.length - 1 && <div className=\"w-px flex-1 bg-border\" />}\n </div>\n <div className=\"pb-3\">\n <p className=\"text-sm\">{a.action}</p>\n <p className=\"text-xs text-muted-foreground\">\n {a.by} · {a.at}\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[task.status] ?? ''}`}\n >\n {statusDisplay}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Assignee</span>\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n <span>{task.reporterId ?? 'Unknown'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TasksTaskDetailPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTaskDetailPagePage.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 { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEM = gql`\n query GetWorkItemDetail($workItemId: ID!) {\n planmagnetWorkItem(id: $workItemId) {\n id\n title\n description\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n description: string | null;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-800',\n MEDIUM: 'bg-blue-100 text-blue-800',\n HIGH: 'bg-orange-100 text-orange-800',\n CRITICAL: 'bg-red-100 text-red-800',\n};\n\nconst statusColor: Record<string, string> = {\n BACKLOG: 'bg-gray-100 text-gray-800',\n TODO: 'bg-blue-100 text-blue-800',\n IN_PROGRESS: 'bg-yellow-100 text-yellow-800',\n IN_REVIEW: 'bg-purple-100 text-purple-800',\n DONE: 'bg-green-100 text-green-800',\n BLOCKED: 'bg-red-100 text-red-800',\n TESTING: 'bg-teal-100 text-teal-800',\n CANCELLED: 'bg-gray-100 text-gray-800',\n};\n\nexport function TasksTaskDetailPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n // In a real app, workItemId comes from route params.\n const workItemId = new URLSearchParams(window.location.search).get('taskId') ?? '';\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItem: WorkItemNode;\n }>(GET_WORK_ITEM, {\n variables: { workItemId },\n skip: !workspaceId || !workItemId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const task = data?.planmagnetWorkItem;\n if (!task) return <div className=\"p-6 text-muted-foreground\">Task not found.</div>;\n\n const statusDisplay = task.status.toLowerCase().replace('_', ' ');\n\n const activityLog = [\n { action: 'Task created', by: task.reporterId ?? 'Unknown', at: task.createdAt },\n {\n action: `Assigned to ${task.assigneeId ?? 'Unassigned'}`,\n by: task.reporterId ?? 'Unknown',\n at: task.createdAt,\n },\n {\n action: `Status changed to ${statusDisplay}`,\n by: task.assigneeId ?? 'Unknown',\n at: task.updatedAt,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">{task.title}</h1>\n <p className=\"text-sm text-muted-foreground\">\n {task.key} · {task.type.toLowerCase()}\n </p>\n </div>\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>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm\">{task.description ?? 'No description provided.'}</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n {activityLog.map((a, i) => (\n <div key={i} className=\"flex gap-3\">\n <div className=\"flex flex-col items-center\">\n <div className=\"h-2.5 w-2.5 rounded-full bg-primary mt-1.5\" />\n {i < activityLog.length - 1 && <div className=\"w-px flex-1 bg-border\" />}\n </div>\n <div className=\"pb-3\">\n <p className=\"text-sm\">{a.action}</p>\n <p className=\"text-xs text-muted-foreground\">\n {a.by} · {a.at}\n </p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n <div className=\"space-y-6\">\n <Card>\n <CardHeader>\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Status</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${statusColor[task.status] ?? ''}`}\n >\n {statusDisplay}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Priority</span>\n <span\n className={`text-xs px-2 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Type</span>\n <Badge variant=\"outline\" className=\"capitalize\">\n {task.type.toLowerCase()}\n </Badge>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Story Points</span>\n <span className=\"font-medium\">{task.storyPoints ?? 0}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Assignee</span>\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Reporter</span>\n <span>{task.reporterId ?? 'Unknown'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Key</span>\n <span>{task.key}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Due Date</span>\n <span>{task.dueDate ?? 'Not set'}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Created</span>\n <span>{task.createdAt}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-muted-foreground\">Updated</span>\n <span>{task.updatedAt}</span>\n </div>\n <div>\n <span className=\"text-muted-foreground text-xs\">Labels</span>\n <div className=\"flex gap-1 mt-1 flex-wrap\">\n {(task.labels ?? []).map((l) => (\n <span key={l} className=\"text-xs px-2 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TasksTasksPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"names":[],"mappings":"AA2FA,wBAAgB,kBAAkB,4CA6HjC"}
|
|
@@ -9,7 +9,7 @@ import { Card as s, CardContent as c } from "@burdenoff/fe-libs/ui";
|
|
|
9
9
|
var l = r`
|
|
10
10
|
query GetWorkItems(
|
|
11
11
|
$workspaceId: ID!
|
|
12
|
-
$filter:
|
|
12
|
+
$filter: PlanmagnetWorkItemFilter
|
|
13
13
|
$pagination: PlanmagnetPaginationInput
|
|
14
14
|
) {
|
|
15
15
|
planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {
|
|
@@ -23,9 +23,8 @@ var l = r`
|
|
|
23
23
|
assigneeId
|
|
24
24
|
reporterId
|
|
25
25
|
sprintId
|
|
26
|
-
boardColumnId
|
|
27
26
|
storyPoints
|
|
28
|
-
|
|
27
|
+
estimateMinutes
|
|
29
28
|
dueDate
|
|
30
29
|
labels
|
|
31
30
|
tags
|
|
@@ -39,22 +38,22 @@ var l = r`
|
|
|
39
38
|
"TODO",
|
|
40
39
|
"IN_PROGRESS",
|
|
41
40
|
"IN_REVIEW",
|
|
42
|
-
"
|
|
43
|
-
"
|
|
41
|
+
"TESTING",
|
|
42
|
+
"DONE"
|
|
44
43
|
], d = {
|
|
45
44
|
BACKLOG: "Backlog",
|
|
46
45
|
TODO: "To Do",
|
|
47
46
|
IN_PROGRESS: "In Progress",
|
|
48
47
|
IN_REVIEW: "In Review",
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
TESTING: "Testing",
|
|
49
|
+
DONE: "Done"
|
|
51
50
|
}, f = {
|
|
52
51
|
BACKLOG: "border-t-gray-400",
|
|
53
52
|
TODO: "border-t-blue-400",
|
|
54
53
|
IN_PROGRESS: "border-t-yellow-400",
|
|
55
54
|
IN_REVIEW: "border-t-purple-400",
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
TESTING: "border-t-teal-400",
|
|
56
|
+
DONE: "border-t-green-400"
|
|
58
57
|
}, p = {
|
|
59
58
|
LOW: "bg-gray-100 text-gray-700",
|
|
60
59
|
MEDIUM: "bg-blue-100 text-blue-700",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksTasksPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Filter } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEMS = gql`\n query GetWorkItems(\n $workspaceId: ID!\n $filter: WorkItemFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n title\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n boardColumnId\n storyPoints\n estimatedHours\n dueDate\n labels\n tags\n createdAt\n }\n totalCount\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n boardColumnId: string | null;\n storyPoints: number | null;\n estimatedHours: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n}\n\nconst columns = ['BACKLOG', 'TODO', 'IN_PROGRESS', 'IN_REVIEW', 'DONE', 'BLOCKED'] as const;\n\nconst colLabel: Record<string, string> = {\n BACKLOG: 'Backlog',\n TODO: 'To Do',\n IN_PROGRESS: 'In Progress',\n IN_REVIEW: 'In Review',\n DONE: 'Done',\n BLOCKED: 'Blocked',\n};\n\nconst colColor: Record<string, string> = {\n BACKLOG: 'border-t-gray-400',\n TODO: 'border-t-blue-400',\n IN_PROGRESS: 'border-t-yellow-400',\n IN_REVIEW: 'border-t-purple-400',\n DONE: 'border-t-green-400',\n BLOCKED: 'border-t-red-400',\n};\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-700',\n MEDIUM: 'bg-blue-100 text-blue-700',\n HIGH: 'bg-orange-100 text-orange-700',\n CRITICAL: 'bg-red-100 text-red-700',\n};\n\nconst typeColor: Record<string, string> = {\n STORY: 'bg-green-100 text-green-700',\n BUG: 'bg-red-100 text-red-700',\n TASK: 'bg-blue-100 text-blue-700',\n EPIC: 'bg-purple-100 text-purple-700',\n SUBTASK: 'bg-gray-100 text-gray-700',\n};\n\nexport function TasksTasksPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [priorityFilter, setPriorityFilter] = useState<string>('all');\n const [typeFilter, setTypeFilter] = useState<string>('all');\n\n const { data, loading, error } = useQuery<{\n workItems: { items: WorkItemNode[]; totalCount: number };\n }>(GET_WORK_ITEMS, {\n variables: {\n workspaceId,\n pagination: { first: 200 },\n },\n skip: !workspaceId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n\n const filtered = tasks.filter(\n (t) =>\n (priorityFilter === 'all' || t.priority === priorityFilter.toUpperCase()) &&\n (typeFilter === 'all' || t.type === typeFilter.toUpperCase())\n );\n\n return (\n <div className=\"space-y-4 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Task Board</h1>\n <p className=\"text-sm text-muted-foreground\">{tasks.length} tasks across all projects</p>\n </div>\n </div>\n <div className=\"flex gap-4 items-center flex-wrap\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n <div className=\"flex gap-1\">\n {['all', 'low', 'medium', 'high', 'critical'].map((p) => (\n <button\n key={p}\n onClick={() => setPriorityFilter(p)}\n className={`px-2 py-1 text-xs rounded capitalize ${priorityFilter === p ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {p}\n </button>\n ))}\n </div>\n <div className=\"flex gap-1\">\n {['all', 'story', 'bug', 'task', 'epic'].map((t) => (\n <button\n key={t}\n onClick={() => setTypeFilter(t)}\n className={`px-2 py-1 text-xs rounded capitalize ${typeFilter === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t}\n </button>\n ))}\n </div>\n </div>\n <div className=\"grid grid-cols-6 gap-3 overflow-x-auto\">\n {columns.map((col) => {\n const colTasks = filtered.filter((t) => t.status === col);\n return (\n <div key={col} className=\"min-w-[200px]\">\n <div className={`border-t-2 ${colColor[col]} rounded-t-md p-2 bg-muted/50`}>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm font-medium\">{colLabel[col]}</span>\n <span className=\"text-xs bg-muted rounded-full px-1.5\">{colTasks.length}</span>\n </div>\n </div>\n <div className=\"space-y-2 mt-2\">\n {colTasks.map((task) => (\n <Card key={task.id} className=\"shadow-sm\">\n <CardContent className=\"p-3 space-y-2\">\n <p className=\"text-sm font-medium leading-tight\">{task.title}</p>\n <p className=\"text-xs text-muted-foreground\">{task.key}</p>\n <div className=\"flex gap-1 flex-wrap\">\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded-full capitalize ${typeColor[task.type] ?? ''}`}\n >\n {task.type.toLowerCase()}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1\">\n {(task.labels ?? []).slice(0, 2).map((l) => (\n <span key={l} className=\"text-[9px] px-1 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-[10px] font-medium bg-primary/10 text-primary rounded-full h-5 w-5 flex items-center justify-center\">\n {task.storyPoints ?? 0}\n </span>\n </div>\n </div>\n <div className=\"flex justify-between text-[10px] text-muted-foreground\">\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n <span>{task.dueDate ?? ''}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TasksTasksPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/TasksTasksPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { Card, CardContent } from '@burdenoff/fe-libs/ui';\nimport { Filter } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_WORK_ITEMS = gql`\n query GetWorkItems(\n $workspaceId: ID!\n $filter: PlanmagnetWorkItemFilter\n $pagination: PlanmagnetPaginationInput\n ) {\n planmagnetWorkItems(workspaceId: $workspaceId, filter: $filter, pagination: $pagination) {\n items {\n id\n title\n type\n status\n priority\n key\n assigneeId\n reporterId\n sprintId\n storyPoints\n estimateMinutes\n dueDate\n labels\n tags\n createdAt\n }\n totalCount\n }\n }\n`;\n\ninterface WorkItemNode {\n id: string;\n title: string;\n type: string;\n status: string;\n priority: string;\n key: string;\n assigneeId: string | null;\n reporterId: string | null;\n sprintId: string | null;\n storyPoints: number | null;\n estimateMinutes: number | null;\n dueDate: string | null;\n labels: string[];\n tags: string[];\n createdAt: string;\n}\n\nconst columns = ['BACKLOG', 'TODO', 'IN_PROGRESS', 'IN_REVIEW', 'TESTING', 'DONE'] as const;\n\nconst colLabel: Record<string, string> = {\n BACKLOG: 'Backlog',\n TODO: 'To Do',\n IN_PROGRESS: 'In Progress',\n IN_REVIEW: 'In Review',\n TESTING: 'Testing',\n DONE: 'Done',\n};\n\nconst colColor: Record<string, string> = {\n BACKLOG: 'border-t-gray-400',\n TODO: 'border-t-blue-400',\n IN_PROGRESS: 'border-t-yellow-400',\n IN_REVIEW: 'border-t-purple-400',\n TESTING: 'border-t-teal-400',\n DONE: 'border-t-green-400',\n};\n\nconst priorityColor: Record<string, string> = {\n LOW: 'bg-gray-100 text-gray-700',\n MEDIUM: 'bg-blue-100 text-blue-700',\n HIGH: 'bg-orange-100 text-orange-700',\n CRITICAL: 'bg-red-100 text-red-700',\n};\n\nconst typeColor: Record<string, string> = {\n STORY: 'bg-green-100 text-green-700',\n BUG: 'bg-red-100 text-red-700',\n TASK: 'bg-blue-100 text-blue-700',\n EPIC: 'bg-purple-100 text-purple-700',\n SUBTASK: 'bg-gray-100 text-gray-700',\n};\n\nexport function TasksTasksPagePage() {\n const { workspaceId } = usePlanMagnet();\n const [priorityFilter, setPriorityFilter] = useState<string>('all');\n const [typeFilter, setTypeFilter] = useState<string>('all');\n\n const { data, loading, error } = useQuery<{\n planmagnetWorkItems: { items: WorkItemNode[]; totalCount: number };\n }>(GET_WORK_ITEMS, {\n variables: {\n workspaceId,\n pagination: { first: 200 },\n },\n skip: !workspaceId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const tasks = data?.planmagnetWorkItems?.items ?? [];\n\n const filtered = tasks.filter(\n (t) =>\n (priorityFilter === 'all' || t.priority === priorityFilter.toUpperCase()) &&\n (typeFilter === 'all' || t.type === typeFilter.toUpperCase())\n );\n\n return (\n <div className=\"space-y-4 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Task Board</h1>\n <p className=\"text-sm text-muted-foreground\">{tasks.length} tasks across all projects</p>\n </div>\n </div>\n <div className=\"flex gap-4 items-center flex-wrap\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n <div className=\"flex gap-1\">\n {['all', 'low', 'medium', 'high', 'critical'].map((p) => (\n <button\n key={p}\n onClick={() => setPriorityFilter(p)}\n className={`px-2 py-1 text-xs rounded capitalize ${priorityFilter === p ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {p}\n </button>\n ))}\n </div>\n <div className=\"flex gap-1\">\n {['all', 'story', 'bug', 'task', 'epic'].map((t) => (\n <button\n key={t}\n onClick={() => setTypeFilter(t)}\n className={`px-2 py-1 text-xs rounded capitalize ${typeFilter === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t}\n </button>\n ))}\n </div>\n </div>\n <div className=\"grid grid-cols-6 gap-3 overflow-x-auto\">\n {columns.map((col) => {\n const colTasks = filtered.filter((t) => t.status === col);\n return (\n <div key={col} className=\"min-w-[200px]\">\n <div className={`border-t-2 ${colColor[col]} rounded-t-md p-2 bg-muted/50`}>\n <div className=\"flex justify-between items-center\">\n <span className=\"text-sm font-medium\">{colLabel[col]}</span>\n <span className=\"text-xs bg-muted rounded-full px-1.5\">{colTasks.length}</span>\n </div>\n </div>\n <div className=\"space-y-2 mt-2\">\n {colTasks.map((task) => (\n <Card key={task.id} className=\"shadow-sm\">\n <CardContent className=\"p-3 space-y-2\">\n <p className=\"text-sm font-medium leading-tight\">{task.title}</p>\n <p className=\"text-xs text-muted-foreground\">{task.key}</p>\n <div className=\"flex gap-1 flex-wrap\">\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded-full capitalize ${priorityColor[task.priority] ?? ''}`}\n >\n {task.priority.toLowerCase()}\n </span>\n <span\n className={`text-[10px] px-1.5 py-0.5 rounded-full capitalize ${typeColor[task.type] ?? ''}`}\n >\n {task.type.toLowerCase()}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex gap-1\">\n {(task.labels ?? []).slice(0, 2).map((l) => (\n <span key={l} className=\"text-[9px] px-1 py-0.5 rounded bg-muted\">\n {l}\n </span>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n <span className=\"text-[10px] font-medium bg-primary/10 text-primary rounded-full h-5 w-5 flex items-center justify-center\">\n {task.storyPoints ?? 0}\n </span>\n </div>\n </div>\n <div className=\"flex justify-between text-[10px] text-muted-foreground\">\n <span>{task.assigneeId ?? 'Unassigned'}</span>\n <span>{task.dueDate ?? ''}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationCollaborationPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.tsx"],"names":[],"mappings":"AAsCA,wBAAgB,kCAAkC,4CAsFjD"}
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { usePlanMagnet as e, usePlanMagnetNavigate as t } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import { Hash as n, Plus as r } from "lucide-react";
|
|
3
|
-
import { gql as i } from "@apollo/client";
|
|
4
|
-
import { useQuery as a } from "@apollo/client/react";
|
|
5
|
-
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
-
import { Button as c, Card as l, CardContent as u } from "@burdenoff/fe-libs/ui";
|
|
7
|
-
//#region src/planmagnet/pages/CollaborationCollaborationPagePage.tsx
|
|
8
|
-
var d = i`
|
|
9
|
-
query GetProjectsForChannels($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
|
|
10
|
-
planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
|
|
11
|
-
items {
|
|
12
|
-
id
|
|
13
|
-
name
|
|
14
|
-
key
|
|
15
|
-
status
|
|
16
|
-
tags
|
|
17
|
-
startDate
|
|
18
|
-
}
|
|
19
|
-
totalCount
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
`;
|
|
23
|
-
function f() {
|
|
24
|
-
let { workspaceId: i } = e(), f = t(), { data: p, loading: m, error: h } = a(d, {
|
|
25
|
-
variables: {
|
|
26
|
-
workspaceId: i,
|
|
27
|
-
pagination: { first: 100 }
|
|
28
|
-
},
|
|
29
|
-
skip: !i
|
|
30
|
-
});
|
|
31
|
-
if (m) return /* @__PURE__ */ o("div", {
|
|
32
|
-
className: "flex items-center justify-center p-12",
|
|
33
|
-
children: /* @__PURE__ */ o("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
34
|
-
});
|
|
35
|
-
if (h) return /* @__PURE__ */ s("div", {
|
|
36
|
-
className: "p-6 text-red-500",
|
|
37
|
-
children: ["Error: ", h.message]
|
|
38
|
-
});
|
|
39
|
-
let g = p?.planmagnetProjects?.items ?? [], _ = g.filter((e) => e.status === "ACTIVE").map((e) => ({
|
|
40
|
-
id: e.id,
|
|
41
|
-
name: e.name,
|
|
42
|
-
description: `Discussion channel for ${e.key}`,
|
|
43
|
-
type: "public",
|
|
44
|
-
membersCount: 0,
|
|
45
|
-
key: e.key,
|
|
46
|
-
status: e.status
|
|
47
|
-
})), v = _.length;
|
|
48
|
-
return /* @__PURE__ */ s("div", {
|
|
49
|
-
className: "space-y-6 p-6",
|
|
50
|
-
children: [/* @__PURE__ */ s("div", {
|
|
51
|
-
className: "flex items-center justify-between",
|
|
52
|
-
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
|
|
53
|
-
className: "text-2xl font-semibold",
|
|
54
|
-
children: "Collaboration"
|
|
55
|
-
}), /* @__PURE__ */ s("p", {
|
|
56
|
-
className: "text-sm text-muted-foreground",
|
|
57
|
-
children: [
|
|
58
|
-
v,
|
|
59
|
-
" project channels · ",
|
|
60
|
-
g.length,
|
|
61
|
-
" total projects"
|
|
62
|
-
]
|
|
63
|
-
})] }), /* @__PURE__ */ s(c, {
|
|
64
|
-
size: "sm",
|
|
65
|
-
onClick: () => f("/collaboration/create-channel"),
|
|
66
|
-
children: [/* @__PURE__ */ o(r, { className: "mr-1 h-4 w-4" }), "New Channel"]
|
|
67
|
-
})]
|
|
68
|
-
}), /* @__PURE__ */ s("div", {
|
|
69
|
-
className: "space-y-3",
|
|
70
|
-
children: [_.map((e) => /* @__PURE__ */ o(l, {
|
|
71
|
-
className: "hover:bg-muted/30 cursor-pointer transition-colors",
|
|
72
|
-
children: /* @__PURE__ */ s(u, {
|
|
73
|
-
className: "py-3 flex items-center justify-between",
|
|
74
|
-
children: [/* @__PURE__ */ s("div", {
|
|
75
|
-
className: "flex items-center gap-3",
|
|
76
|
-
children: [/* @__PURE__ */ o(n, { className: "h-4 w-4 text-muted-foreground" }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("div", {
|
|
77
|
-
className: "flex items-center gap-2",
|
|
78
|
-
children: [/* @__PURE__ */ o("span", {
|
|
79
|
-
className: "text-sm font-medium",
|
|
80
|
-
children: e.name
|
|
81
|
-
}), /* @__PURE__ */ o("span", {
|
|
82
|
-
className: "text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700",
|
|
83
|
-
children: e.key
|
|
84
|
-
})]
|
|
85
|
-
}), /* @__PURE__ */ o("p", {
|
|
86
|
-
className: "text-xs text-muted-foreground",
|
|
87
|
-
children: e.description
|
|
88
|
-
})] })]
|
|
89
|
-
}), /* @__PURE__ */ o("div", {
|
|
90
|
-
className: "flex items-center gap-4 text-xs text-muted-foreground",
|
|
91
|
-
children: /* @__PURE__ */ o("span", {
|
|
92
|
-
className: "capitalize",
|
|
93
|
-
children: e.status.toLowerCase()
|
|
94
|
-
})
|
|
95
|
-
})]
|
|
96
|
-
})
|
|
97
|
-
}, e.id)), _.length === 0 && /* @__PURE__ */ s("div", {
|
|
98
|
-
className: "text-center py-12",
|
|
99
|
-
children: [/* @__PURE__ */ o(n, { className: "h-12 w-12 text-muted-foreground mx-auto mb-3" }), /* @__PURE__ */ o("p", {
|
|
100
|
-
className: "text-sm text-muted-foreground",
|
|
101
|
-
children: "No active projects found. Create a project to start collaborating."
|
|
102
|
-
})]
|
|
103
|
-
})]
|
|
104
|
-
})]
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
//#endregion
|
|
108
|
-
export { f as CollaborationCollaborationPagePage };
|
|
109
|
-
|
|
110
|
-
//# sourceMappingURL=CollaborationCollaborationPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationCollaborationPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCollaborationPagePage.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, Button } from '@burdenoff/fe-libs/ui';\nimport { Plus, Hash, Lock, Users } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_CHANNELS = gql`\n query GetProjectsForChannels($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n tags\n startDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n tags: string[];\n startDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationCollaborationPagePage() {\n const { workspaceId } = usePlanMagnet();\n const navigate = usePlanMagnetNavigate();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_CHANNELS, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n const activeProjects = projects.filter((p) => p.status === 'ACTIVE');\n\n const channels = activeProjects.map((project) => ({\n id: project.id,\n name: project.name,\n description: `Discussion channel for ${project.key}`,\n type: 'public' as const,\n membersCount: 0,\n key: project.key,\n status: project.status,\n }));\n\n const totalChannels = channels.length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Collaboration</h1>\n <p className=\"text-sm text-muted-foreground\">\n {totalChannels} project channels · {projects.length} total projects\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/collaboration/create-channel')}>\n <Plus className=\"mr-1 h-4 w-4\" />\n New Channel\n </Button>\n </div>\n <div className=\"space-y-3\">\n {channels.map((ch) => (\n <Card key={ch.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <Hash className=\"h-4 w-4 text-muted-foreground\" />\n <div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{ch.name}</span>\n <span className=\"text-[10px] px-1.5 py-0.5 rounded-full bg-green-100 text-green-700\">\n {ch.key}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">{ch.description}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-4 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{ch.status.toLowerCase()}</span>\n </div>\n </CardContent>\n </Card>\n ))}\n {channels.length === 0 && (\n <div className=\"text-center py-12\">\n <Hash className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No active projects found. Create a project to start collaborating.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AASA,IAAM,IAA4B,CAAG;;;;;;;;;;;;;;;AA6BrC,SAAgB,IAAqC;CACnD,IAAM,EAAE,mBAAgB,GAAe,EACjC,IAAW,GAAuB,EAElC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAA2B;EACjF,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAGhD,IAFiB,EAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,CAEpC,KAAK,OAAa;EAChD,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,aAAa,0BAA0B,EAAQ;EAC/C,MAAM;EACN,cAAc;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EACjB,EAAE,EAEG,IAAgB,EAAS;AAE/B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAkB,CAAA,EACzD,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG;KAAc;KAA4B,EAAS;KAAO;KACzD;MACA,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,eAAe,EAAS,gCAAgC;cAA1E,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,cAE1B;MACL;MACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAS,KAAK,MACb,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,iCAAkC,CAAA,EAClD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAG;QAAY,CAAA,EACtD,kBAAC,QAAD;QAAM,WAAU;kBACb,EAAG;QACC,CAAA,CACH;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAiC,EAAG;OAAgB,CAAA,CAC7D,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,QAAD;OAAM,WAAU;iBAAc,EAAG,OAAO,aAAa;OAAQ,CAAA;MACzD,CAAA,CACM;;IACT,EAlBI,EAAG,GAkBP,CACP,EACD,EAAS,WAAW,KACnB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationCreateChannelPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx"],"names":[],"mappings":"AAOA,wBAAgB,kCAAkC,4CA8EjD"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import { usePlanMagnetNavigate as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import { useState as t } from "react";
|
|
3
|
-
import { Hash as n, Save as r, X as i } from "lucide-react";
|
|
4
|
-
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
-
import { Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, Input as f } from "@burdenoff/fe-libs/ui";
|
|
6
|
-
//#region src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx
|
|
7
|
-
function p() {
|
|
8
|
-
let [p, m] = t({
|
|
9
|
-
name: "",
|
|
10
|
-
description: "",
|
|
11
|
-
type: "public"
|
|
12
|
-
}), h = e();
|
|
13
|
-
return /* @__PURE__ */ o("div", {
|
|
14
|
-
className: "space-y-6 p-6 max-w-4xl",
|
|
15
|
-
children: [/* @__PURE__ */ o("div", {
|
|
16
|
-
className: "flex items-center justify-between",
|
|
17
|
-
children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
|
|
18
|
-
className: "text-2xl font-semibold",
|
|
19
|
-
children: "Create Channel"
|
|
20
|
-
}), /* @__PURE__ */ a("p", {
|
|
21
|
-
className: "text-sm text-muted-foreground",
|
|
22
|
-
children: "Set up a new communication channel for your team."
|
|
23
|
-
})] }), /* @__PURE__ */ o("div", {
|
|
24
|
-
className: "flex gap-2",
|
|
25
|
-
children: [/* @__PURE__ */ o(s, {
|
|
26
|
-
variant: "outline",
|
|
27
|
-
size: "sm",
|
|
28
|
-
onClick: () => h("/collaboration"),
|
|
29
|
-
children: [/* @__PURE__ */ a(i, { className: "mr-1 h-4 w-4" }), "Cancel"]
|
|
30
|
-
}), /* @__PURE__ */ o(s, {
|
|
31
|
-
size: "sm",
|
|
32
|
-
onClick: () => {
|
|
33
|
-
p.name.trim() && h("/collaboration");
|
|
34
|
-
},
|
|
35
|
-
children: [/* @__PURE__ */ a(r, { className: "mr-1 h-4 w-4" }), "Create Channel"]
|
|
36
|
-
})]
|
|
37
|
-
})]
|
|
38
|
-
}), /* @__PURE__ */ o(c, { children: [/* @__PURE__ */ a(u, { children: /* @__PURE__ */ o(d, {
|
|
39
|
-
className: "flex items-center gap-2",
|
|
40
|
-
children: [/* @__PURE__ */ a(n, { className: "h-4 w-4" }), "Channel Details"]
|
|
41
|
-
}) }), /* @__PURE__ */ o(l, {
|
|
42
|
-
className: "space-y-4",
|
|
43
|
-
children: [
|
|
44
|
-
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
|
|
45
|
-
className: "text-sm font-medium",
|
|
46
|
-
children: "Channel Name"
|
|
47
|
-
}), /* @__PURE__ */ a(f, {
|
|
48
|
-
value: p.name,
|
|
49
|
-
onChange: (e) => m({
|
|
50
|
-
...p,
|
|
51
|
-
name: e.target.value
|
|
52
|
-
}),
|
|
53
|
-
className: "mt-1",
|
|
54
|
-
placeholder: "e.g. engineering-updates"
|
|
55
|
-
})] }),
|
|
56
|
-
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
|
|
57
|
-
className: "text-sm font-medium",
|
|
58
|
-
children: "Description"
|
|
59
|
-
}), /* @__PURE__ */ a("textarea", {
|
|
60
|
-
className: "mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]",
|
|
61
|
-
value: p.description,
|
|
62
|
-
onChange: (e) => m({
|
|
63
|
-
...p,
|
|
64
|
-
description: e.target.value
|
|
65
|
-
}),
|
|
66
|
-
placeholder: "What is this channel for?"
|
|
67
|
-
})] }),
|
|
68
|
-
/* @__PURE__ */ o("div", { children: [
|
|
69
|
-
/* @__PURE__ */ a("label", {
|
|
70
|
-
className: "text-sm font-medium",
|
|
71
|
-
children: "Type"
|
|
72
|
-
}),
|
|
73
|
-
/* @__PURE__ */ a("div", {
|
|
74
|
-
className: "mt-1 flex gap-2",
|
|
75
|
-
children: ["public", "private"].map((e) => /* @__PURE__ */ a("button", {
|
|
76
|
-
onClick: () => m({
|
|
77
|
-
...p,
|
|
78
|
-
type: e
|
|
79
|
-
}),
|
|
80
|
-
className: `px-4 py-2 rounded-md text-sm capitalize ${p.type === e ? "bg-primary text-primary-foreground" : "bg-muted text-muted-foreground"}`,
|
|
81
|
-
children: e
|
|
82
|
-
}, e))
|
|
83
|
-
}),
|
|
84
|
-
/* @__PURE__ */ a("p", {
|
|
85
|
-
className: "text-xs text-muted-foreground mt-1",
|
|
86
|
-
children: p.type === "public" ? "Anyone in the workspace can join" : "Only invited members can access"
|
|
87
|
-
})
|
|
88
|
-
] })
|
|
89
|
-
]
|
|
90
|
-
})] })]
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
//#endregion
|
|
94
|
-
export { p as CollaborationCreateChannelPagePage };
|
|
95
|
-
|
|
96
|
-
//# sourceMappingURL=CollaborationCreateChannelPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationCreateChannelPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationCreateChannelPagePage.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck\nimport { useState } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { Save, X, Hash } from 'lucide-react';\nimport { usePlanMagnetNavigate } from '../providers/PlanMagnetProvider';\n\nexport function CollaborationCreateChannelPagePage() {\n const [form, setForm] = useState({ name: '', description: '', type: 'public' });\n const navigate = usePlanMagnetNavigate();\n\n const handleCreate = () => {\n if (!form.name.trim()) return;\n navigate('/collaboration');\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Create Channel</h1>\n <p className=\"text-sm text-muted-foreground\">\n Set up a new communication channel for your team.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/collaboration')}>\n <X className=\"mr-1 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleCreate}>\n <Save className=\"mr-1 h-4 w-4\" />\n Create Channel\n </Button>\n </div>\n </div>\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Hash className=\"h-4 w-4\" />\n Channel Details\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <label className=\"text-sm font-medium\">Channel Name</label>\n <Input\n value={form.name}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n className=\"mt-1\"\n placeholder=\"e.g. engineering-updates\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Description</label>\n <textarea\n className=\"mt-1 w-full rounded-md border border-input bg-background px-3 py-2 text-sm min-h-[80px]\"\n value={form.description}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n placeholder=\"What is this channel for?\"\n />\n </div>\n <div>\n <label className=\"text-sm font-medium\">Type</label>\n <div className=\"mt-1 flex gap-2\">\n {['public', 'private'].map((t) => (\n <button\n key={t}\n onClick={() => setForm({ ...form, type: t })}\n className={`px-4 py-2 rounded-md text-sm capitalize ${form.type === t ? 'bg-primary text-primary-foreground' : 'bg-muted text-muted-foreground'}`}\n >\n {t}\n </button>\n ))}\n </div>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {form.type === 'public'\n ? 'Anyone in the workspace can join'\n : 'Only invited members can access'}\n </p>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AAOA,SAAgB,IAAqC;CACnD,IAAM,CAAC,GAAM,KAAW,EAAS;EAAE,MAAM;EAAI,aAAa;EAAI,MAAM;EAAU,CAAC,EACzE,IAAW,GAAuB;AAOxC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAyB;IAAmB,CAAA,EAC1D,kBAAC,KAAD;IAAG,WAAU;cAAgC;IAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAU,MAAK;KAAK,eAAe,EAAS,iBAAiB;eAA7E,CACE,kBAAC,GAAD,EAAG,WAAU,gBAAiB,CAAA,EAAA,SAEvB;QACT,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAnBC;AACpB,QAAK,KAAK,MAAM,IACrB,EAAS,iBAAiB;;eAiBpB,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;OACL;MACF;MACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;GAAW,WAAU;aAArB,CACE,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA,EAAA,kBAElB;MACD,CAAA,EACb,kBAAC,GAAD;GAAa,WAAU;aAAvB;IACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAoB,CAAA,EAC3D,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,MAAM,EAAE,OAAO;MAAO,CAAC;KAC3D,WAAU;KACV,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,SAAD;KAAO,WAAU;eAAsB;KAAmB,CAAA,EAC1D,kBAAC,YAAD;KACE,WAAU;KACV,OAAO,EAAK;KACZ,WAAW,MAAM,EAAQ;MAAE,GAAG;MAAM,aAAa,EAAE,OAAO;MAAO,CAAC;KAClE,aAAY;KACZ,CAAA,CACE,EAAA,CAAA;IACN,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,SAAD;MAAO,WAAU;gBAAsB;MAAY,CAAA;KACnD,kBAAC,OAAD;MAAK,WAAU;gBACZ,CAAC,UAAU,UAAU,CAAC,KAAK,MAC1B,kBAAC,UAAD;OAEE,eAAe,EAAQ;QAAE,GAAG;QAAM,MAAM;QAAG,CAAC;OAC5C,WAAW,2CAA2C,EAAK,SAAS,IAAI,uCAAuC;iBAE9G;OACM,EALF,EAKE,CACT;MACE,CAAA;KACN,kBAAC,KAAD;MAAG,WAAU;gBACV,EAAK,SAAS,WACX,qCACA;MACF,CAAA;KACA,EAAA,CAAA;IACM;KACT,EAAA,CAAA,CACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationFilesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.tsx"],"names":[],"mappings":"AAyCA,wBAAgB,0BAA0B,4CAyFzC"}
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { usePlanMagnet as e } from "../providers/PlanMagnetProvider.js";
|
|
2
|
-
import { Calendar as t, File as n, FolderKanban as r } from "lucide-react";
|
|
3
|
-
import { gql as i } from "@apollo/client";
|
|
4
|
-
import { useQuery as a } from "@apollo/client/react";
|
|
5
|
-
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
-
import { Card as c, CardContent as l } from "@burdenoff/fe-libs/ui";
|
|
7
|
-
//#region src/planmagnet/pages/CollaborationFilesPagePage.tsx
|
|
8
|
-
var u = i`
|
|
9
|
-
query GetProjectsForFiles($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {
|
|
10
|
-
planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {
|
|
11
|
-
items {
|
|
12
|
-
id
|
|
13
|
-
name
|
|
14
|
-
key
|
|
15
|
-
status
|
|
16
|
-
methodology
|
|
17
|
-
tags
|
|
18
|
-
startDate
|
|
19
|
-
endDate
|
|
20
|
-
}
|
|
21
|
-
totalCount
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
`;
|
|
25
|
-
function d() {
|
|
26
|
-
let { workspaceId: i } = e(), { data: d, loading: f, error: p } = a(u, {
|
|
27
|
-
variables: {
|
|
28
|
-
workspaceId: i,
|
|
29
|
-
pagination: { first: 100 }
|
|
30
|
-
},
|
|
31
|
-
skip: !i
|
|
32
|
-
});
|
|
33
|
-
if (f) return /* @__PURE__ */ o("div", {
|
|
34
|
-
className: "flex items-center justify-center p-12",
|
|
35
|
-
children: /* @__PURE__ */ o("div", { className: "animate-spin h-8 w-8 border-2 border-primary border-t-transparent rounded-full" })
|
|
36
|
-
});
|
|
37
|
-
if (p) return /* @__PURE__ */ s("div", {
|
|
38
|
-
className: "p-6 text-red-500",
|
|
39
|
-
children: ["Error: ", p.message]
|
|
40
|
-
});
|
|
41
|
-
let m = d?.planmagnetProjects?.items ?? [], h = m.map((e) => ({
|
|
42
|
-
id: e.id,
|
|
43
|
-
name: e.name,
|
|
44
|
-
key: e.key,
|
|
45
|
-
status: e.status,
|
|
46
|
-
methodology: e.methodology,
|
|
47
|
-
tags: e.tags,
|
|
48
|
-
startDate: e.startDate,
|
|
49
|
-
endDate: e.endDate
|
|
50
|
-
}));
|
|
51
|
-
return /* @__PURE__ */ s("div", {
|
|
52
|
-
className: "space-y-6 p-6",
|
|
53
|
-
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
|
|
54
|
-
className: "text-2xl font-semibold",
|
|
55
|
-
children: "Shared Files"
|
|
56
|
-
}), /* @__PURE__ */ s("p", {
|
|
57
|
-
className: "text-sm text-muted-foreground",
|
|
58
|
-
children: [m.length, " projects with associated resources"]
|
|
59
|
-
})] }), /* @__PURE__ */ s("div", {
|
|
60
|
-
className: "space-y-2",
|
|
61
|
-
children: [h.map((e) => /* @__PURE__ */ o(c, {
|
|
62
|
-
className: "hover:bg-muted/30 cursor-pointer transition-colors",
|
|
63
|
-
children: /* @__PURE__ */ s(l, {
|
|
64
|
-
className: "py-3 flex items-center justify-between",
|
|
65
|
-
children: [/* @__PURE__ */ s("div", {
|
|
66
|
-
className: "flex items-center gap-3",
|
|
67
|
-
children: [/* @__PURE__ */ o(r, { className: "h-5 w-5 text-muted-foreground" }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
68
|
-
className: "text-sm font-medium",
|
|
69
|
-
children: e.name
|
|
70
|
-
}), /* @__PURE__ */ s("p", {
|
|
71
|
-
className: "text-xs text-muted-foreground",
|
|
72
|
-
children: [
|
|
73
|
-
e.key,
|
|
74
|
-
" · ",
|
|
75
|
-
e.methodology ?? "No methodology"
|
|
76
|
-
]
|
|
77
|
-
})] })]
|
|
78
|
-
}), /* @__PURE__ */ s("div", {
|
|
79
|
-
className: "flex items-center gap-6 text-xs text-muted-foreground",
|
|
80
|
-
children: [
|
|
81
|
-
/* @__PURE__ */ o("span", {
|
|
82
|
-
className: "capitalize",
|
|
83
|
-
children: e.status.toLowerCase()
|
|
84
|
-
}),
|
|
85
|
-
e.tags.length > 0 && /* @__PURE__ */ o("div", {
|
|
86
|
-
className: "flex gap-1",
|
|
87
|
-
children: e.tags.slice(0, 3).map((e) => /* @__PURE__ */ o("span", {
|
|
88
|
-
className: "px-1.5 py-0.5 bg-muted rounded text-[10px]",
|
|
89
|
-
children: e
|
|
90
|
-
}, e))
|
|
91
|
-
}),
|
|
92
|
-
e.startDate && /* @__PURE__ */ s("span", {
|
|
93
|
-
className: "flex items-center gap-1",
|
|
94
|
-
children: [/* @__PURE__ */ o(t, { className: "h-3 w-3" }), e.startDate]
|
|
95
|
-
})
|
|
96
|
-
]
|
|
97
|
-
})]
|
|
98
|
-
})
|
|
99
|
-
}, e.id)), h.length === 0 && /* @__PURE__ */ s("div", {
|
|
100
|
-
className: "text-center py-12",
|
|
101
|
-
children: [/* @__PURE__ */ o(n, { className: "h-12 w-12 text-muted-foreground mx-auto mb-3" }), /* @__PURE__ */ o("p", {
|
|
102
|
-
className: "text-sm text-muted-foreground",
|
|
103
|
-
children: "No projects found. Files will appear once projects are created."
|
|
104
|
-
})]
|
|
105
|
-
})]
|
|
106
|
-
})]
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
//#endregion
|
|
110
|
-
export { d as CollaborationFilesPagePage };
|
|
111
|
-
|
|
112
|
-
//# sourceMappingURL=CollaborationFilesPagePage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationFilesPagePage.js","names":[],"sources":["../../../src/planmagnet/pages/CollaborationFilesPagePage.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 } from '@burdenoff/fe-libs/ui';\nimport { FileText, File, FolderKanban, Calendar } from 'lucide-react';\nimport { usePlanMagnet } from '../providers/PlanMagnetProvider';\n\nconst GET_PROJECTS_FOR_FILES = gql`\n query GetProjectsForFiles($workspaceId: ID!, $pagination: PlanmagnetPaginationInput) {\n planmagnetProjects(workspaceId: $workspaceId, pagination: $pagination) {\n items {\n id\n name\n key\n status\n methodology\n tags\n startDate\n endDate\n }\n totalCount\n }\n }\n`;\n\ninterface ProjectNode {\n id: string;\n name: string;\n key: string;\n status: string;\n methodology: string | null;\n tags: string[];\n startDate: string | null;\n endDate: string | null;\n}\n\ninterface ProjectsData {\n projects: { items: ProjectNode[]; totalCount: number };\n}\n\nexport function CollaborationFilesPagePage() {\n const { workspaceId } = usePlanMagnet();\n\n const { data, loading, error } = useQuery<ProjectsData>(GET_PROJECTS_FOR_FILES, {\n variables: {\n workspaceId,\n pagination: { first: 100 },\n },\n skip: !workspaceId,\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 }\n\n if (error) {\n return <div className=\"p-6 text-red-500\">Error: {error.message}</div>;\n }\n\n const projects = data?.planmagnetProjects?.items ?? [];\n\n const projectFiles = projects.map((project) => ({\n id: project.id,\n name: project.name,\n key: project.key,\n status: project.status,\n methodology: project.methodology,\n tags: project.tags,\n startDate: project.startDate,\n endDate: project.endDate,\n }));\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Shared Files</h1>\n <p className=\"text-sm text-muted-foreground\">\n {projects.length} projects with associated resources\n </p>\n </div>\n <div className=\"space-y-2\">\n {projectFiles.map((pf) => (\n <Card key={pf.id} className=\"hover:bg-muted/30 cursor-pointer transition-colors\">\n <CardContent className=\"py-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-3\">\n <FolderKanban className=\"h-5 w-5 text-muted-foreground\" />\n <div>\n <p className=\"text-sm font-medium\">{pf.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {pf.key} · {pf.methodology ?? 'No methodology'}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-6 text-xs text-muted-foreground\">\n <span className=\"capitalize\">{pf.status.toLowerCase()}</span>\n {pf.tags.length > 0 && (\n <div className=\"flex gap-1\">\n {pf.tags.slice(0, 3).map((tag) => (\n <span key={tag} className=\"px-1.5 py-0.5 bg-muted rounded text-[10px]\">\n {tag}\n </span>\n ))}\n </div>\n )}\n {pf.startDate && (\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n {pf.startDate}\n </span>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n {projectFiles.length === 0 && (\n <div className=\"text-center py-12\">\n <File className=\"h-12 w-12 text-muted-foreground mx-auto mb-3\" />\n <p className=\"text-sm text-muted-foreground\">\n No projects found. Files will appear once projects are created.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAQA,IAAM,IAAyB,CAAG;;;;;;;;;;;;;;;;;AAiClC,SAAgB,IAA6B;CAC3C,IAAM,EAAE,mBAAgB,GAAe,EAEjC,EAAE,SAAM,YAAS,aAAU,EAAuB,GAAwB;EAC9E,WAAW;GACT;GACA,YAAY,EAAE,OAAO,KAAK;GAC3B;EACD,MAAM,CAAC;EACR,CAAC;AAEF,KAAI,EACF,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,OAAD,EAAK,WAAU,kFAAmF,CAAA;EAC9F,CAAA;AAIV,KAAI,EACF,QAAO,kBAAC,OAAD;EAAK,WAAU;YAAf,CAAkC,WAAQ,EAAM,QAAc;;CAGvE,IAAM,IAAW,GAAM,oBAAoB,SAAS,EAAE,EAEhD,IAAe,EAAS,KAAK,OAAa;EAC9C,IAAI,EAAQ;EACZ,MAAM,EAAQ;EACd,KAAK,EAAQ;EACb,QAAQ,EAAQ;EAChB,aAAa,EAAQ;EACrB,MAAM,EAAQ;EACd,WAAW,EAAQ;EACnB,SAAS,EAAQ;EAClB,EAAE;AAEH,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAiB,CAAA,EACxD,kBAAC,KAAD;GAAG,WAAU;aAAb,CACG,EAAS,QAAO,sCACf;KACA,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,EAAa,KAAK,MACjB,kBAAC,GAAD;IAAkB,WAAU;cAC1B,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAuB,EAAG;OAAS,CAAA,EAChD,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAG;QAAI;QAAW,EAAG,eAAe;QACnC;SACA,EAAA,CAAA,CACF;SACN,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD;QAAM,WAAU;kBAAc,EAAG,OAAO,aAAa;QAAQ,CAAA;OAC5D,EAAG,KAAK,SAAS,KAChB,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAG,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,MACxB,kBAAC,QAAD;SAAgB,WAAU;mBACvB;SACI,EAFI,EAEJ,CACP;QACE,CAAA;OAEP,EAAG,aACF,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAC/B,EAAG,UACC;;OAEL;QACM;;IACT,EA9BI,EAAG,GA8BP,CACP,EACD,EAAa,WAAW,KACvB,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAM,WAAU,gDAAiD,CAAA,EACjE,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA;MAEJ;KACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CollaborationMessagesPagePage.d.ts","sourceRoot":"","sources":["../../../src/planmagnet/pages/CollaborationMessagesPagePage.tsx"],"names":[],"mappings":"AA0DA,wBAAgB,6BAA6B,4CAqG5C"}
|