cortex-react-components 3.3.0 → 4.0.3
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/{chunk-Z54HOXSV.mjs → chunk-2254O4YT.mjs} +2 -2
- package/dist/{chunk-V6YEUAIH.mjs → chunk-3BYBIUZN.mjs} +3 -3
- package/dist/{chunk-XFJPL6FS.mjs → chunk-3IXZB3VP.mjs} +1 -1
- package/dist/{chunk-WJTVZ6CB.mjs → chunk-3NXXPFU2.mjs} +1 -1
- package/dist/{chunk-CONYNX7Y.mjs → chunk-4HKHDXKK.mjs} +3 -3
- package/dist/{chunk-DSVXGGGV.mjs → chunk-54AIO5ED.mjs} +2 -2
- package/dist/{chunk-7ZCW4XMR.mjs → chunk-64IBDKCH.mjs} +1 -1
- package/dist/{chunk-EJJITIA3.mjs → chunk-65ZDGR46.mjs} +5 -5
- package/dist/{chunk-I4MTJN23.mjs → chunk-6A7T3O6T.mjs} +6 -5
- package/dist/{chunk-HUZCVQP7.mjs → chunk-7IMTNL53.mjs} +1 -1
- package/dist/{chunk-IJ3E6ZXF.mjs → chunk-B2LFNC3C.mjs} +1 -1
- package/dist/{chunk-IDMTHUC4.mjs → chunk-B36NGEMF.mjs} +3 -3
- package/dist/{chunk-FABRRO2B.mjs → chunk-BAJ7NCAT.mjs} +1 -1
- package/dist/{chunk-4JHX6BW6.mjs → chunk-BEGQGEDH.mjs} +1 -1
- package/dist/{chunk-36W3BORX.mjs → chunk-BWS5MUG7.mjs} +1 -1
- package/dist/{chunk-5NGZXIP7.mjs → chunk-CI625DSA.mjs} +1 -1
- package/dist/{chunk-WX5QYPGU.mjs → chunk-CUUAA2TB.mjs} +1 -1
- package/dist/{chunk-ETG5N2OG.mjs → chunk-DOIUUDF6.mjs} +1 -1
- package/dist/{chunk-SSE3MQDP.mjs → chunk-DST7L2PX.mjs} +3 -3
- package/dist/{chunk-UETTBM3J.mjs → chunk-F6NJD6IG.mjs} +1 -1
- package/dist/{chunk-L4SNPNYU.mjs → chunk-FBCL4K4A.mjs} +1 -1
- package/dist/{chunk-IVOPNDSN.mjs → chunk-G5N5MCLS.mjs} +5 -5
- package/dist/{chunk-NQMJXY3N.mjs → chunk-GC7DB2Y5.mjs} +1 -1
- package/dist/{chunk-5CQITTLV.mjs → chunk-GMHZ7GGN.mjs} +1 -1
- package/dist/{chunk-C3CKYJ2F.mjs → chunk-GZRODHXY.mjs} +1 -1
- package/dist/{chunk-SM57JU3T.mjs → chunk-HCVN3YVW.mjs} +5 -5
- package/dist/{chunk-SSDRUPMS.mjs → chunk-HWSDSULO.mjs} +183 -36
- package/dist/{chunk-QPO45D6F.mjs → chunk-I2MVZVXE.mjs} +1 -1
- package/dist/chunk-IC4N2KYF.mjs +401 -0
- package/dist/{chunk-GGOGMLBY.mjs → chunk-JKVS2VFG.mjs} +4 -4
- package/dist/{chunk-OPJMXB4K.mjs → chunk-K4ZS4W4S.mjs} +2 -2
- package/dist/{chunk-Q6CUUDUR.mjs → chunk-LVLYUHSA.mjs} +1 -1
- package/dist/{chunk-UDCOG2XL.mjs → chunk-LY4RR7AL.mjs} +1 -1
- package/dist/{chunk-QMFGV3M5.mjs → chunk-LZUYY2G6.mjs} +2 -2
- package/dist/{chunk-XGHUG2WQ.mjs → chunk-MDG2I4PB.mjs} +1 -1
- package/dist/{chunk-YD7Q7IZX.mjs → chunk-MNJ5CMJM.mjs} +1 -1
- package/dist/{chunk-YY4VLYYH.mjs → chunk-MOMYX6OH.mjs} +26 -11
- package/dist/{chunk-EDYFH3EJ.mjs → chunk-NM7RODDO.mjs} +3 -3
- package/dist/{chunk-KOK3VCJZ.mjs → chunk-O5RKEF5N.mjs} +2 -2
- package/dist/chunk-PBIUFMQ7.mjs +595 -0
- package/dist/{chunk-GTHNG3Q7.mjs → chunk-PPESICX2.mjs} +1 -1
- package/dist/{chunk-F7JPOQIC.mjs → chunk-Q54XDKD6.mjs} +1 -1
- package/dist/{chunk-LTDXFLCW.mjs → chunk-QM3XSGNV.mjs} +13 -5
- package/dist/{chunk-LGGOEYDB.mjs → chunk-QU3TSSIT.mjs} +9 -9
- package/dist/{chunk-OCVHSV6Z.mjs → chunk-R4WRE5VN.mjs} +2 -2
- package/dist/{chunk-HMVIQFLN.mjs → chunk-S2JSIAMP.mjs} +1 -1
- package/dist/{chunk-4JSM5VYZ.mjs → chunk-SAVDOTMQ.mjs} +1 -1
- package/dist/{chunk-PE44IHZN.mjs → chunk-SBD4TWK2.mjs} +1 -1
- package/dist/{chunk-B7WVGDB6.mjs → chunk-SZJ6XME5.mjs} +1 -1
- package/dist/{chunk-URC56DLC.mjs → chunk-T2VDQBFT.mjs} +1 -1
- package/dist/{chunk-2D3EN2AX.mjs → chunk-T36HNGWV.mjs} +2 -2
- package/dist/{chunk-3BYULUMU.mjs → chunk-T62Q55Y5.mjs} +1 -1
- package/dist/{chunk-IBQBZNEA.mjs → chunk-T756T7P5.mjs} +1 -1
- package/dist/{chunk-HNBHBFLY.mjs → chunk-TZBPEFJY.mjs} +1 -1
- package/dist/{chunk-HQW5M4ND.mjs → chunk-U5XRK325.mjs} +1 -1
- package/dist/{chunk-4P5Q6UXF.mjs → chunk-UBFOKMYD.mjs} +5 -5
- package/dist/{chunk-6NRBLKM4.mjs → chunk-UM7KTWAX.mjs} +2 -2
- package/dist/{chunk-E5LGE3IW.mjs → chunk-W73LGNTH.mjs} +1 -1
- package/dist/{chunk-QETXXFRW.mjs → chunk-WNGLLRYA.mjs} +1 -1
- package/dist/{chunk-NVSA5BFC.mjs → chunk-XP74JZNW.mjs} +3 -3
- package/dist/{chunk-OXP3LJ53.mjs → chunk-XT7I7SJB.mjs} +4 -4
- package/dist/{chunk-JFXWP3RQ.mjs → chunk-Y7B7YO6Q.mjs} +1 -1
- package/dist/{chunk-XZFMQXYJ.mjs → chunk-ZD5DKC5T.mjs} +1 -1
- package/dist/{chunk-EC5I4CIO.mjs → chunk-ZJ5SRNYD.mjs} +1 -1
- package/dist/{chunk-LM4J7254.mjs → chunk-ZSGXRIK7.mjs} +7 -7
- package/dist/{chunk-MZVEK6A5.mjs → chunk-ZZQWZWMG.mjs} +19 -19
- package/dist/components/AdvancedComponents/AppSidebar.d.ts +1 -1
- package/dist/components/AdvancedComponents/AppSidebar.js +481 -302
- package/dist/components/AdvancedComponents/AppSidebar.mjs +4 -4
- package/dist/components/AdvancedComponents/index.js +481 -302
- package/dist/components/AdvancedComponents/index.mjs +4 -4
- package/dist/components/Blocks/Banner.mjs +6 -6
- package/dist/components/Blocks/CallToAction.mjs +6 -6
- package/dist/components/Blocks/CollapsibleArea.mjs +7 -7
- package/dist/components/Blocks/Content.mjs +7 -7
- package/dist/components/Blocks/FeaturesBlock.mjs +6 -6
- package/dist/components/Blocks/RelatedPosts.mjs +7 -7
- package/dist/components/Blocks/RenderBlocks.mjs +9 -9
- package/dist/components/Blocks/ReusableContentBlock.mjs +9 -9
- package/dist/components/Blocks/index.mjs +15 -15
- package/dist/components/CRM/CogeBoard.js +1 -1
- package/dist/components/CRM/CogeBoard.mjs +3 -3
- package/dist/components/CRM/DealDetails.js +1 -1
- package/dist/components/CRM/DealDetails.mjs +2 -2
- package/dist/components/CRM/KanbanBoard.js +1 -1
- package/dist/components/CRM/KanbanBoard.mjs +3 -3
- package/dist/components/CRM/NewDealForm.js +1 -1
- package/dist/components/CRM/NewDealForm.mjs +2 -2
- package/dist/components/CRM/index.js +1 -1
- package/dist/components/CRM/index.mjs +8 -8
- package/dist/components/Cards/ContentCard.mjs +6 -6
- package/dist/components/Cards/FeatureCard.mjs +6 -6
- package/dist/components/Cards/Image.js +1 -1
- package/dist/components/Cards/Image.mjs +2 -2
- package/dist/components/Cards/ImageProxy.js +1 -1
- package/dist/components/Cards/ImageProxy.mjs +2 -2
- package/dist/components/Cards/index.js +1 -1
- package/dist/components/Cards/index.mjs +12 -12
- package/dist/components/Chat/ChatInterface.mjs +11 -11
- package/dist/components/Chat/CopilotInterface.d.ts +1 -1
- package/dist/components/Chat/CopilotInterface.js +528 -331
- package/dist/components/Chat/CopilotInterface.mjs +17 -17
- package/dist/components/Chat/PartTypes/MessageHandler.mjs +9 -9
- package/dist/components/Chat/PartTypes/index.mjs +11 -11
- package/dist/components/Chat/chat-session-sidebar.d.ts +1 -1
- package/dist/components/Chat/demo-long-messages.js +528 -331
- package/dist/components/Chat/demo-long-messages.mjs +17 -17
- package/dist/components/Chat/demo-tests.js +528 -331
- package/dist/components/Chat/demo-tests.mjs +17 -17
- package/dist/components/Chat/demo.js +528 -331
- package/dist/components/Chat/demo.mjs +17 -17
- package/dist/components/Chat/example-usage.js +528 -331
- package/dist/components/Chat/example-usage.mjs +18 -18
- package/dist/components/Chat/example-with-vercel-ai.js +528 -331
- package/dist/components/Chat/example-with-vercel-ai.mjs +17 -17
- package/dist/components/Chat/index.js +528 -331
- package/dist/components/Chat/index.mjs +25 -25
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.d.ts +1 -9
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.js +23 -28
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.mjs +5 -7
- package/dist/components/DigitalColleagues/index.d.ts +0 -18
- package/dist/components/DigitalColleagues/index.js +0 -16754
- package/dist/components/DigitalColleagues/test-data.d.ts +1 -112
- package/dist/components/DigitalColleagues/test-data.js +482 -308
- package/dist/components/DigitalColleagues/test-data.mjs +1 -5
- package/dist/components/Foundry/Knowledge/add-knowledge-modal.js +1 -1
- package/dist/components/Foundry/Knowledge/add-knowledge-modal.mjs +3 -3
- package/dist/components/Foundry/Knowledge/add-team-context.js +1 -1
- package/dist/components/Foundry/Knowledge/add-team-context.mjs +2 -2
- package/dist/components/Foundry/Knowledge/manage-team-context.js +1 -1
- package/dist/components/Foundry/Knowledge/manage-team-context.mjs +2 -2
- package/dist/components/Foundry/MainPage.mjs +3 -3
- package/dist/components/Foundry/ManagementSidebar.d.ts +2 -2
- package/dist/components/Foundry/ManagementSidebar.js +12 -4
- package/dist/components/Foundry/ManagementSidebar.mjs +1 -1
- package/dist/components/Foundry/Pages/dashboardpage.js +1424 -2040
- package/dist/components/Foundry/Pages/dashboardpage.mjs +25 -26
- package/dist/components/Foundry/RichText/index.js +1 -1
- package/dist/components/Foundry/RichText/index.mjs +5 -5
- package/dist/components/Foundry/RichText/plugins/image-plugin.js +1 -1
- package/dist/components/Foundry/RichText/plugins/image-plugin.mjs +2 -2
- package/dist/components/Foundry/RichText/plugins/toolbar-plugin.js +1 -1
- package/dist/components/Foundry/RichText/plugins/toolbar-plugin.mjs +4 -4
- package/dist/components/Foundry/Views/ColleaguesView.js +5 -4
- package/dist/components/Foundry/Views/ColleaguesView.mjs +3 -3
- package/dist/components/Foundry/Views/KnowledgeView.js +1 -1
- package/dist/components/Foundry/Views/KnowledgeView.mjs +12 -12
- package/dist/components/Foundry/Views/TeamsIndexView.js +6 -5
- package/dist/components/Foundry/Views/TeamsIndexView.mjs +5 -5
- package/dist/components/Foundry/Views/index.js +1352 -787
- package/dist/components/Foundry/Views/index.mjs +50 -49
- package/dist/components/{.archive → Foundry}/app-card.d.ts +1 -1
- package/dist/components/{DigitalColleagues/colleague-type-selection.js → Foundry/app-card.js} +89 -117
- package/dist/components/{DigitalColleagues/colleague-card.mjs → Foundry/app-card.mjs} +4 -5
- package/dist/components/Foundry/document-edit.js +1 -1
- package/dist/components/Foundry/document-edit.mjs +6 -6
- package/dist/components/Foundry/document-preview-examples.js +1 -1
- package/dist/components/Foundry/document-preview-examples.mjs +7 -7
- package/dist/components/Foundry/document-preview.js +1 -1
- package/dist/components/Foundry/document-preview.mjs +7 -7
- package/dist/components/Foundry/file-edit.js +1 -1
- package/dist/components/Foundry/file-edit.mjs +7 -7
- package/dist/components/Foundry/foundary-layout.js +481 -302
- package/dist/components/Foundry/foundary-layout.mjs +5 -5
- package/dist/components/Foundry/index.js +2748 -2868
- package/dist/components/Foundry/index.mjs +78 -79
- package/dist/components/Foundry/knowledge-browser.js +1 -1
- package/dist/components/Foundry/knowledge-browser.mjs +8 -8
- package/dist/components/Foundry/types.d.ts +26 -0
- package/dist/components/HeaderFooter/SectionHeading.mjs +7 -7
- package/dist/components/HeaderFooter/index.mjs +5 -5
- package/dist/components/Heros/DashboardHero/DashboardHero.js +5 -4
- package/dist/components/Heros/DashboardHero/DashboardHero.mjs +2 -2
- package/dist/components/Heros/DashboardHero/index.js +5 -4
- package/dist/components/Heros/DashboardHero/index.mjs +2 -2
- package/dist/components/Heros/HighImpact/index.mjs +7 -7
- package/dist/components/Heros/LowImpact/index.mjs +7 -7
- package/dist/components/Heros/MediumImpact/index.mjs +7 -7
- package/dist/components/Heros/PostHero/index.mjs +2 -2
- package/dist/components/Heros/RenderHero.mjs +10 -10
- package/dist/components/Heros/index.js +5 -4
- package/dist/components/Heros/index.mjs +15 -15
- package/dist/components/Layouts/OutputHeaderFooter.mjs +7 -7
- package/dist/components/Layouts/Print.mjs +11 -11
- package/dist/components/Layouts/SlideShow.mjs +13 -13
- package/dist/components/Layouts/index.mjs +17 -17
- package/dist/components/Payload/RichText/index.mjs +6 -6
- package/dist/components/Payload/RichText/serialize.mjs +6 -6
- package/dist/components/Payload/index.mjs +6 -6
- package/dist/components/Projects/AddEpicModal.js +1 -1
- package/dist/components/Projects/AddEpicModal.mjs +2 -2
- package/dist/components/Projects/AddFileModal.js +1 -1
- package/dist/components/Projects/AddFileModal.mjs +2 -2
- package/dist/components/Projects/AddSprintModal.js +1 -1
- package/dist/components/Projects/AddSprintModal.mjs +2 -2
- package/dist/components/Projects/AddTaskModal.js +1 -1
- package/dist/components/Projects/AddTaskModal.mjs +2 -2
- package/dist/components/Projects/EpicFilter.d.ts +6 -2
- package/dist/components/Projects/EpicFilter.js +6 -6
- package/dist/components/Projects/EpicFilter.mjs +6 -6
- package/dist/components/Projects/EpicsView.d.ts +12 -2
- package/dist/components/Projects/EpicsView.js +3980 -736
- package/dist/components/Projects/EpicsView.mjs +48 -6
- package/dist/components/Projects/FileView.js +6 -5
- package/dist/components/Projects/FileView.mjs +12 -12
- package/dist/components/Projects/GanttView.d.ts +13 -0
- package/dist/components/{DigitalColleagues/colleague-card.js → Projects/GanttView.js} +559 -260
- package/dist/components/{DigitalColleagues/digital-colleague-clone.mjs → Projects/GanttView.mjs} +7 -6
- package/dist/components/Projects/KanbanBoardView.js +6 -5
- package/dist/components/Projects/KanbanBoardView.mjs +17 -17
- package/dist/components/Projects/KanbanColumn.d.ts +1 -1
- package/dist/components/Projects/PlanningView.js +6 -5
- package/dist/components/Projects/PlanningView.mjs +5 -5
- package/dist/components/Projects/ProjectPage.d.ts +2 -2
- package/dist/components/Projects/ProjectPage.js +1727 -966
- package/dist/components/Projects/ProjectPage.mjs +30 -29
- package/dist/components/Projects/ProjectView.d.ts +1 -1
- package/dist/components/Projects/ProjectView.js +1209 -644
- package/dist/components/Projects/ProjectView.mjs +25 -24
- package/dist/components/Projects/ProjectsIndexView.js +6 -5
- package/dist/components/Projects/ProjectsIndexView.mjs +4 -4
- package/dist/components/Projects/SprintBoardView.d.ts +3 -0
- package/dist/components/Projects/SprintBoardView.js +252 -110
- package/dist/components/Projects/SprintBoardView.mjs +18 -18
- package/dist/components/Projects/TaskDetailsModal.js +1 -1
- package/dist/components/Projects/TaskDetailsModal.mjs +11 -11
- package/dist/components/Projects/TasksView.js +6 -5
- package/dist/components/Projects/TasksView.mjs +4 -4
- package/dist/components/Projects/business-unit-switcher.d.ts +1 -1
- package/dist/components/Projects/business-units.d.ts +1 -1
- package/dist/components/Projects/file-list.js +1 -1
- package/dist/components/Projects/file-list.mjs +8 -8
- package/dist/components/Projects/index.js +538 -231
- package/dist/components/Projects/index.mjs +23 -23
- package/dist/components/Projects/project-card.d.ts +1 -1
- package/dist/components/Projects/project-form.d.ts +1 -1
- package/dist/components/Projects/team-card.d.ts +1 -1
- package/dist/components/Projects/team-switcher-bar.d.ts +1 -1
- package/dist/components/Projects/test-data.d.ts +448 -29
- package/dist/components/dc-temp/dashboard-integration-example.js +498 -326
- package/dist/components/dc-temp/dashboard-integration-example.mjs +7 -7
- package/dist/components/dc-temp/index.d.ts +3 -3
- package/dist/components/dc-temp/index.js +3746 -2980
- package/dist/components/dc-temp/index.mjs +24 -22
- package/dist/components/dc-temp/mock-data.d.ts +1 -1
- package/dist/components/index.js +4129 -4210
- package/dist/components/index.mjs +174 -176
- package/dist/components/ui/command.js +1 -1
- package/dist/components/ui/command.mjs +2 -2
- package/dist/components/ui/dialog.js +1 -1
- package/dist/components/ui/dialog.mjs +1 -1
- package/dist/components/ui/index.js +1 -1
- package/dist/components/ui/index.mjs +2 -2
- package/dist/decorators/Intranet.css +54 -14
- package/dist/decorators/Intranet.mjs +103 -105
- package/dist/globals.css +54 -14
- package/dist/hooks/use-local-storage.d.ts +2 -1
- package/dist/hooks/use-local-storage.js +5 -4
- package/dist/hooks/use-local-storage.mjs +1 -1
- package/dist/index.js +4125 -4206
- package/dist/index.mjs +185 -187
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/pages/Blog.mjs +11 -11
- package/dist/pages/Documentation.mjs +3 -3
- package/dist/pages/IndexPage.mjs +14 -14
- package/dist/pages/Intranet.mjs +1 -1
- package/dist/pages/LandingPage.mjs +113 -115
- package/dist/pages/Page.mjs +15 -15
- package/dist/pages/Publish.mjs +104 -106
- package/dist/pages/Website.mjs +18 -18
- package/dist/sections/AboutSection.mjs +8 -8
- package/dist/sections/BlogDetail.mjs +7 -7
- package/dist/sections/BlogList.mjs +8 -8
- package/dist/sections/ContactSection.mjs +8 -8
- package/dist/sections/PageSections.mjs +113 -115
- package/dist/sections/PricingSection.mjs +8 -8
- package/dist/sections/ServiceDetail.mjs +7 -7
- package/dist/sections/ServiceDetailSection.mjs +7 -7
- package/dist/sections/ServiceSection.mjs +104 -106
- package/dist/sections/index.mjs +113 -115
- package/package.json +5 -2
- package/dist/chunk-5MMSWFVA.mjs +0 -364
- package/dist/chunk-7TDXZ32Q.mjs +0 -197
- package/dist/chunk-APXXTGT4.mjs +0 -424
- package/dist/chunk-BZENEU5C.mjs +0 -160
- package/dist/chunk-C444TUVA.mjs +0 -306
- package/dist/chunk-CNQTT5P3.mjs +0 -276
- package/dist/chunk-CQKCEXF2.mjs +0 -82
- package/dist/chunk-EKQB7NJA.mjs +0 -194
- package/dist/chunk-G4WW3ZTX.mjs +0 -1063
- package/dist/chunk-IWG2URAU.mjs +0 -74
- package/dist/chunk-IWSATDRG.mjs +0 -118
- package/dist/chunk-JRNDRMIC.mjs +0 -73
- package/dist/chunk-K2C4VMGF.mjs +0 -121
- package/dist/chunk-LQQ6C7FN.mjs +0 -365
- package/dist/chunk-M6ELOAGS.mjs +0 -136
- package/dist/chunk-NAUBZM7P.mjs +0 -183
- package/dist/chunk-NHDPHK6D.mjs +0 -72
- package/dist/chunk-R5MJWISX.mjs +0 -194
- package/dist/chunk-RKYMAFRJ.mjs +0 -92
- package/dist/chunk-SZBUXY6L.mjs +0 -121
- package/dist/chunk-VY6L37RQ.mjs +0 -103
- package/dist/chunk-X6UI73UN.mjs +0 -262
- package/dist/components/DigitalColleagues/AppSidebarLeft.d.ts +0 -47
- package/dist/components/DigitalColleagues/AppSidebarLeft.js +0 -3407
- package/dist/components/DigitalColleagues/AppSidebarLeft.mjs +0 -23
- package/dist/components/DigitalColleagues/DashboardHeader.d.ts +0 -8
- package/dist/components/DigitalColleagues/DashboardHeader.js +0 -2756
- package/dist/components/DigitalColleagues/DashboardHeader.mjs +0 -15
- package/dist/components/DigitalColleagues/DigitalColleageusLayout.css +0 -917
- package/dist/components/DigitalColleagues/DigitalColleageusLayout.d.ts +0 -28
- package/dist/components/DigitalColleagues/DigitalColleageusLayout.js +0 -4417
- package/dist/components/DigitalColleagues/DigitalColleageusLayout.mjs +0 -31
- package/dist/components/DigitalColleagues/MainPage.css +0 -917
- package/dist/components/DigitalColleagues/MainPage.d.ts +0 -3
- package/dist/components/DigitalColleagues/MainPage.js +0 -4080
- package/dist/components/DigitalColleagues/MainPage.mjs +0 -46
- package/dist/components/DigitalColleagues/ManagementSidebar.d.ts +0 -8
- package/dist/components/DigitalColleagues/ManagementSidebar.js +0 -99
- package/dist/components/DigitalColleagues/ManagementSidebar.mjs +0 -9
- package/dist/components/DigitalColleagues/Pages/dashboardpage.css +0 -917
- package/dist/components/DigitalColleagues/Pages/dashboardpage.d.ts +0 -18
- package/dist/components/DigitalColleagues/Pages/dashboardpage.js +0 -8514
- package/dist/components/DigitalColleagues/Pages/dashboardpage.mjs +0 -78
- package/dist/components/DigitalColleagues/README-document-edit.js +0 -2
- package/dist/components/DigitalColleagues/README-document-edit.mjs +0 -7
- package/dist/components/DigitalColleagues/README-document-preview.js +0 -2
- package/dist/components/DigitalColleagues/README-document-preview.mjs +0 -7
- package/dist/components/DigitalColleagues/SearchableSelect.css +0 -917
- package/dist/components/DigitalColleagues/SearchableSelect.d.ts +0 -16
- package/dist/components/DigitalColleagues/SearchableSelect.js +0 -2745
- package/dist/components/DigitalColleagues/SearchableSelect.mjs +0 -16
- package/dist/components/DigitalColleagues/Views/ColleaguesView.css +0 -917
- package/dist/components/DigitalColleagues/Views/ColleaguesView.d.ts +0 -14
- package/dist/components/DigitalColleagues/Views/ColleaguesView.js +0 -3795
- package/dist/components/DigitalColleagues/Views/ColleaguesView.mjs +0 -28
- package/dist/components/DigitalColleagues/Views/KnowledgeView.css +0 -917
- package/dist/components/DigitalColleagues/Views/KnowledgeView.d.ts +0 -11
- package/dist/components/DigitalColleagues/Views/KnowledgeView.docs.js +0 -2
- package/dist/components/DigitalColleagues/Views/KnowledgeView.docs.mjs +0 -7
- package/dist/components/DigitalColleagues/Views/KnowledgeView.js +0 -3935
- package/dist/components/DigitalColleagues/Views/KnowledgeView.mjs +0 -26
- package/dist/components/DigitalColleagues/Views/index.css +0 -917
- package/dist/components/DigitalColleagues/Views/index.d.ts +0 -7
- package/dist/components/DigitalColleagues/Views/index.js +0 -12284
- package/dist/components/DigitalColleagues/Views/index.mjs +0 -114
- package/dist/components/DigitalColleagues/colleague-card.css +0 -917
- package/dist/components/DigitalColleagues/colleague-card.d.ts +0 -12
- package/dist/components/DigitalColleagues/colleague-form.css +0 -917
- package/dist/components/DigitalColleagues/colleague-form.d.ts +0 -14
- package/dist/components/DigitalColleagues/colleague-form.js +0 -3086
- package/dist/components/DigitalColleagues/colleague-form.mjs +0 -22
- package/dist/components/DigitalColleagues/colleague-type-selection.css +0 -917
- package/dist/components/DigitalColleagues/colleague-type-selection.d.ts +0 -7
- package/dist/components/DigitalColleagues/colleague-type-selection.mjs +0 -16
- package/dist/components/DigitalColleagues/digital-colleague-clone.css +0 -917
- package/dist/components/DigitalColleagues/digital-colleague-clone.d.ts +0 -9
- package/dist/components/DigitalColleagues/digital-colleague-clone.js +0 -2828
- package/dist/components/DigitalColleagues/digital-colleague-options.css +0 -917
- package/dist/components/DigitalColleagues/digital-colleague-options.d.ts +0 -7
- package/dist/components/DigitalColleagues/digital-colleague-options.js +0 -2697
- package/dist/components/DigitalColleagues/digital-colleague-options.mjs +0 -16
- package/dist/components/DigitalColleagues/document-edit.css +0 -917
- package/dist/components/DigitalColleagues/document-edit.d.ts +0 -10
- package/dist/components/DigitalColleagues/document-edit.js +0 -3112
- package/dist/components/DigitalColleagues/document-edit.mjs +0 -20
- package/dist/components/DigitalColleagues/document-preview-examples.css +0 -917
- package/dist/components/DigitalColleagues/document-preview-examples.d.ts +0 -12
- package/dist/components/DigitalColleagues/document-preview-examples.js +0 -3433
- package/dist/components/DigitalColleagues/document-preview-examples.mjs +0 -151
- package/dist/components/DigitalColleagues/document-preview.css +0 -917
- package/dist/components/DigitalColleagues/document-preview.d.ts +0 -18
- package/dist/components/DigitalColleagues/document-preview.js +0 -3296
- package/dist/components/DigitalColleagues/document-preview.mjs +0 -21
- package/dist/components/DigitalColleagues/index.css +0 -917
- package/dist/components/DigitalColleagues/index.mjs +0 -200
- package/dist/components/DigitalColleagues/knowledge-browser.css +0 -917
- package/dist/components/DigitalColleagues/knowledge-browser.d.ts +0 -13
- package/dist/components/DigitalColleagues/knowledge-browser.js +0 -3581
- package/dist/components/DigitalColleagues/knowledge-browser.mjs +0 -23
- package/dist/components/DigitalColleagues/knowledge-search.css +0 -917
- package/dist/components/DigitalColleagues/knowledge-search.d.ts +0 -12
- package/dist/components/DigitalColleagues/knowledge-search.js +0 -2819
- package/dist/components/DigitalColleagues/knowledge-search.mjs +0 -20
- package/dist/components/DigitalColleagues/team-form.css +0 -917
- package/dist/components/DigitalColleagues/team-form.d.ts +0 -24
- package/dist/components/DigitalColleagues/team-form.js +0 -2836
- package/dist/components/DigitalColleagues/team-form.mjs +0 -20
- package/dist/components/DigitalColleagues/types.d.ts +0 -289
- package/dist/components/DigitalColleagues/types.js +0 -18
- package/dist/{chunk-RFQKQLNT.mjs → chunk-JJDC25TG.mjs} +3 -3
- package/dist/{chunk-GZGWWPCP.mjs → chunk-L666B5DN.mjs} +12 -12
- /package/dist/components/{DigitalColleagues/AppSidebarLeft.css → Foundry/app-card.css} +0 -0
- /package/dist/components/{DigitalColleagues/DashboardHeader.css → Projects/GanttView.css} +0 -0
|
@@ -4497,15 +4497,16 @@ function useLocalStorage(key, initialValue) {
|
|
|
4497
4497
|
return initialValue;
|
|
4498
4498
|
}
|
|
4499
4499
|
});
|
|
4500
|
-
const setValue = (value) => {
|
|
4500
|
+
const setValue = (0, import_react14.useCallback)((value) => {
|
|
4501
4501
|
try {
|
|
4502
|
-
|
|
4502
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
4503
|
+
setStoredValue(valueToStore);
|
|
4503
4504
|
if (typeof window !== "undefined") {
|
|
4504
|
-
window.localStorage.setItem(key, JSON.stringify(
|
|
4505
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
4505
4506
|
}
|
|
4506
4507
|
} catch (error) {
|
|
4507
4508
|
}
|
|
4508
|
-
};
|
|
4509
|
+
}, [key, storedValue]);
|
|
4509
4510
|
(0, import_react14.useEffect)(() => {
|
|
4510
4511
|
setValue(storedValue);
|
|
4511
4512
|
}, []);
|
|
@@ -5094,7 +5095,7 @@ var DialogContent = React10.forwardRef(({ className, children, ...props }, ref)
|
|
|
5094
5095
|
{
|
|
5095
5096
|
ref,
|
|
5096
5097
|
className: cn(
|
|
5097
|
-
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
5098
|
+
"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg max-h-[90vh] overflow-y-auto translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
|
|
5098
5099
|
className
|
|
5099
5100
|
),
|
|
5100
5101
|
...props,
|
|
@@ -5984,8 +5985,8 @@ function ToolbarPlugin() {
|
|
|
5984
5985
|
blockNode = curr;
|
|
5985
5986
|
}
|
|
5986
5987
|
if (blockNode) {
|
|
5987
|
-
const
|
|
5988
|
-
setAlignment(
|
|
5988
|
+
const format3 = blockNode.getFormatType();
|
|
5989
|
+
setAlignment(format3 || "left");
|
|
5989
5990
|
}
|
|
5990
5991
|
const tag = anchorNode.getTopLevelElement()?.__tag;
|
|
5991
5992
|
setBlockType(tag || "p");
|
|
@@ -7077,7 +7078,7 @@ var markdownToLexical = (markdown) => {
|
|
|
7077
7078
|
var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
7078
7079
|
let content = "";
|
|
7079
7080
|
let richTextContent = void 0;
|
|
7080
|
-
let
|
|
7081
|
+
let format3 = "text";
|
|
7081
7082
|
if (file.url) {
|
|
7082
7083
|
try {
|
|
7083
7084
|
let url = file.url;
|
|
@@ -7098,18 +7099,18 @@ var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
|
7098
7099
|
console.warn("No URL provided for file:", file.name);
|
|
7099
7100
|
}
|
|
7100
7101
|
if (file.mimeType === "text/markdown") {
|
|
7101
|
-
|
|
7102
|
+
format3 = "richText";
|
|
7102
7103
|
richTextContent = markdownToLexical(content);
|
|
7103
7104
|
} else if (file.mimeType?.startsWith("text/")) {
|
|
7104
|
-
|
|
7105
|
+
format3 = "text";
|
|
7105
7106
|
}
|
|
7106
7107
|
return {
|
|
7107
7108
|
id: file.id.toString(),
|
|
7108
7109
|
title: file.name,
|
|
7109
7110
|
description: void 0,
|
|
7110
|
-
content:
|
|
7111
|
-
richTextContent:
|
|
7112
|
-
format:
|
|
7111
|
+
content: format3 === "richText" ? void 0 : content,
|
|
7112
|
+
richTextContent: format3 === "richText" ? richTextContent : void 0,
|
|
7113
|
+
format: format3,
|
|
7113
7114
|
metadata: {},
|
|
7114
7115
|
createdAt: typeof file.createdAt === "string" ? new Date(file.createdAt) : file.createdAt,
|
|
7115
7116
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -7159,8 +7160,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
7159
7160
|
setRichTextContent(document2.richTextContent);
|
|
7160
7161
|
}
|
|
7161
7162
|
}, [document2]);
|
|
7162
|
-
const formatIcon = (
|
|
7163
|
-
switch (
|
|
7163
|
+
const formatIcon = (format3) => {
|
|
7164
|
+
switch (format3) {
|
|
7164
7165
|
case "markdown":
|
|
7165
7166
|
case "mdx":
|
|
7166
7167
|
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react19.FileText, { className: "h-6 w-6 text-primary" });
|
|
@@ -7172,8 +7173,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
7172
7173
|
return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react19.File, { className: "h-6 w-6 text-muted-foreground" });
|
|
7173
7174
|
}
|
|
7174
7175
|
};
|
|
7175
|
-
const formatBadgeColor = (
|
|
7176
|
-
switch (
|
|
7176
|
+
const formatBadgeColor = (format3) => {
|
|
7177
|
+
switch (format3) {
|
|
7177
7178
|
case "markdown":
|
|
7178
7179
|
return "bg-primary/10 text-primary border-primary/20";
|
|
7179
7180
|
case "mdx":
|
|
@@ -7901,8 +7902,8 @@ function DocumentEdit({
|
|
|
7901
7902
|
(0, import_react32.useEffect)(() => {
|
|
7902
7903
|
setEditedDocument(document2);
|
|
7903
7904
|
}, [document2]);
|
|
7904
|
-
const formatIcon = (
|
|
7905
|
-
switch (
|
|
7905
|
+
const formatIcon = (format3) => {
|
|
7906
|
+
switch (format3) {
|
|
7906
7907
|
case "markdown":
|
|
7907
7908
|
case "mdx":
|
|
7908
7909
|
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react23.FileText, { className: "h-6 w-6 text-primary" });
|
|
@@ -7914,8 +7915,8 @@ function DocumentEdit({
|
|
|
7914
7915
|
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react23.File, { className: "h-6 w-6 text-muted-foreground" });
|
|
7915
7916
|
}
|
|
7916
7917
|
};
|
|
7917
|
-
const formatBadgeColor = (
|
|
7918
|
-
switch (
|
|
7918
|
+
const formatBadgeColor = (format3) => {
|
|
7919
|
+
switch (format3) {
|
|
7919
7920
|
case "markdown":
|
|
7920
7921
|
return "bg-primary/10 text-primary border-primary/20";
|
|
7921
7922
|
case "mdx":
|
|
@@ -8239,8 +8240,8 @@ function DocumentPreview({
|
|
|
8239
8240
|
(0, import_react34.useEffect)(() => {
|
|
8240
8241
|
setDocument(initialDocument);
|
|
8241
8242
|
}, [initialDocument]);
|
|
8242
|
-
const formatIcon = (
|
|
8243
|
-
switch (
|
|
8243
|
+
const formatIcon = (format3) => {
|
|
8244
|
+
switch (format3) {
|
|
8244
8245
|
case "markdown":
|
|
8245
8246
|
case "mdx":
|
|
8246
8247
|
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react24.FileText, { className: "h-6 w-6 text-primary" });
|
|
@@ -8252,8 +8253,8 @@ function DocumentPreview({
|
|
|
8252
8253
|
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react24.File, { className: "h-6 w-6 text-muted-foreground" });
|
|
8253
8254
|
}
|
|
8254
8255
|
};
|
|
8255
|
-
const formatBadgeColor = (
|
|
8256
|
-
switch (
|
|
8256
|
+
const formatBadgeColor = (format3) => {
|
|
8257
|
+
switch (format3) {
|
|
8257
8258
|
case "markdown":
|
|
8258
8259
|
return "bg-primary/10 text-primary border-primary/20";
|
|
8259
8260
|
case "mdx":
|
|
@@ -8266,15 +8267,15 @@ function DocumentPreview({
|
|
|
8266
8267
|
return "bg-muted text-muted-foreground border-border";
|
|
8267
8268
|
}
|
|
8268
8269
|
};
|
|
8269
|
-
const renderContent = (content,
|
|
8270
|
+
const renderContent = (content, format3) => {
|
|
8270
8271
|
const defaultRenderers = {
|
|
8271
8272
|
markdown: defaultMarkdownRenderer,
|
|
8272
8273
|
mdx: defaultMDXRenderer,
|
|
8273
8274
|
// richText: defaultRichTextRenderer,
|
|
8274
8275
|
text: defaultTextRenderer
|
|
8275
8276
|
};
|
|
8276
|
-
const renderer = renderers?.[
|
|
8277
|
-
if (
|
|
8277
|
+
const renderer = renderers?.[format3] || defaultRenderers[format3];
|
|
8278
|
+
if (format3 === "richText" && typeof content === "object") {
|
|
8278
8279
|
return defaultRichTextRenderer(content);
|
|
8279
8280
|
}
|
|
8280
8281
|
if (renderer) {
|
|
@@ -8441,8 +8442,8 @@ function MenuItem({
|
|
|
8441
8442
|
const [isExpanded, setIsExpanded] = (0, import_react36.useState)(level === 0);
|
|
8442
8443
|
const hasChildren = children && Object.keys(children).length > 0;
|
|
8443
8444
|
const totalDocuments = documents.length + (children ? Object.values(children).reduce((acc, child) => acc + child.documents.length, 0) : 0);
|
|
8444
|
-
const formatDocumentIcon = (
|
|
8445
|
-
switch (
|
|
8445
|
+
const formatDocumentIcon = (format3) => {
|
|
8446
|
+
switch (format3) {
|
|
8446
8447
|
case "markdown":
|
|
8447
8448
|
case "mdx":
|
|
8448
8449
|
return /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react25.FileText, { className: "h-3.5 w-3.5 text-muted-foreground" });
|
|
@@ -9335,9 +9336,9 @@ function KnowledgeView({
|
|
|
9335
9336
|
}
|
|
9336
9337
|
|
|
9337
9338
|
// src/components/Projects/ProjectView.tsx
|
|
9338
|
-
var
|
|
9339
|
+
var import_react53 = require("react");
|
|
9339
9340
|
|
|
9340
|
-
// src/components/
|
|
9341
|
+
// src/components/Foundry/ManagementSidebar.tsx
|
|
9341
9342
|
var import_lucide_react29 = require("lucide-react");
|
|
9342
9343
|
var import_jsx_runtime54 = require("react/jsx-runtime");
|
|
9343
9344
|
var viewConfig = [
|
|
@@ -9376,6 +9377,14 @@ var viewConfig = [
|
|
|
9376
9377
|
label: "Tasks",
|
|
9377
9378
|
color: "bg-brand-cyan",
|
|
9378
9379
|
title: "Tasks"
|
|
9380
|
+
},
|
|
9381
|
+
{
|
|
9382
|
+
key: "gantt",
|
|
9383
|
+
icon: import_lucide_react29.BarChart2,
|
|
9384
|
+
label: "Gantt",
|
|
9385
|
+
color: "bg-brand-blue",
|
|
9386
|
+
title: "Gantt Chart",
|
|
9387
|
+
hiddenOnMobile: true
|
|
9379
9388
|
}
|
|
9380
9389
|
];
|
|
9381
9390
|
var ManagementSidebar = ({
|
|
@@ -9383,15 +9392,15 @@ var ManagementSidebar = ({
|
|
|
9383
9392
|
onViewChange,
|
|
9384
9393
|
children
|
|
9385
9394
|
}) => {
|
|
9386
|
-
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex w-full h-
|
|
9387
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "w-12 h-full bg-sidebar-background flex flex-col flex-shrink-0", children: viewConfig.map((view) => {
|
|
9395
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex w-full h-full", children: [
|
|
9396
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "w-12 h-full bg-sidebar-background flex flex-col flex-shrink-0 z-50 relative overflow-visible", children: viewConfig.map((view) => {
|
|
9388
9397
|
const Icon2 = view.icon;
|
|
9389
9398
|
const isActive = currentView === view.key;
|
|
9390
9399
|
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9391
9400
|
"button",
|
|
9392
9401
|
{
|
|
9393
9402
|
onClick: () => onViewChange(view.key),
|
|
9394
|
-
className: `flex-1 w-12 flex items-center justify-center text-sidebar-foreground transition-all duration-200 relative
|
|
9403
|
+
className: `flex-1 w-12 flex items-center justify-center text-sidebar-foreground transition-all duration-200 relative group/btn z-50 hover:w-28 hover:justify-start hover:pl-3 ${isActive ? view.color : `${view.color} brightness-75 hover:brightness-100`} ${view.hiddenOnMobile ? "hidden md:flex" : ""}`,
|
|
9395
9404
|
title: view.title,
|
|
9396
9405
|
children: [
|
|
9397
9406
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Icon2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
@@ -9401,7 +9410,7 @@ var ManagementSidebar = ({
|
|
|
9401
9410
|
view.key
|
|
9402
9411
|
);
|
|
9403
9412
|
}) }),
|
|
9404
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex-1 min-w-0 px-4 md:px-6 h-full overflow-auto", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "w-full h-full", children }) })
|
|
9413
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex-1 min-w-0 px-4 md:px-6 h-full overflow-auto z-0 relative", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "w-full h-full", children }) })
|
|
9405
9414
|
] });
|
|
9406
9415
|
};
|
|
9407
9416
|
|
|
@@ -11121,17 +11130,25 @@ var import_react48 = require("react");
|
|
|
11121
11130
|
var import_lucide_react35 = require("lucide-react");
|
|
11122
11131
|
var import_jsx_runtime65 = require("react/jsx-runtime");
|
|
11123
11132
|
var EpicsView = ({
|
|
11133
|
+
projectId,
|
|
11124
11134
|
tasks,
|
|
11125
11135
|
epics,
|
|
11126
11136
|
sprints,
|
|
11137
|
+
colleagues = [],
|
|
11127
11138
|
onUpdateTask,
|
|
11128
11139
|
onTaskClick,
|
|
11129
11140
|
onAddTaskToEpic,
|
|
11130
11141
|
onAddEpic,
|
|
11131
11142
|
onUpdateEpic,
|
|
11132
|
-
onDeleteEpic
|
|
11143
|
+
onDeleteEpic,
|
|
11144
|
+
onDeleteTask,
|
|
11145
|
+
onAddComment,
|
|
11146
|
+
onUploadFile,
|
|
11147
|
+
onDeleteFile,
|
|
11148
|
+
onFileUpdate
|
|
11133
11149
|
}) => {
|
|
11134
11150
|
const [availableEpics, setAvailableEpics] = (0, import_react48.useState)(epics);
|
|
11151
|
+
const [availableTasks, setAvailableTasks] = (0, import_react48.useState)(tasks);
|
|
11135
11152
|
const [draggedTask, setDraggedTask] = (0, import_react48.useState)(null);
|
|
11136
11153
|
const [editingEpic, setEditingEpic] = (0, import_react48.useState)(null);
|
|
11137
11154
|
const [editForm, setEditForm] = (0, import_react48.useState)({});
|
|
@@ -11139,16 +11156,29 @@ var EpicsView = ({
|
|
|
11139
11156
|
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react48.useState)(false);
|
|
11140
11157
|
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react48.useState)(false);
|
|
11141
11158
|
const [addTaskEpic, setAddTaskEpic] = (0, import_react48.useState)(null);
|
|
11159
|
+
const [selectedTask, setSelectedTask] = (0, import_react48.useState)(null);
|
|
11160
|
+
const [selectedEpicIds, setSelectedEpicIds] = useLocalStorage(
|
|
11161
|
+
`epicsView_selectedEpics${projectId ? `_${projectId}` : ""}`,
|
|
11162
|
+
[]
|
|
11163
|
+
);
|
|
11164
|
+
const [isEpicSelectorOpen, setIsEpicSelectorOpen] = (0, import_react48.useState)(false);
|
|
11142
11165
|
const heroRef = (0, import_react48.useRef)(null);
|
|
11143
11166
|
const containerRef = (0, import_react48.useRef)(null);
|
|
11144
11167
|
(0, import_react48.useEffect)(() => {
|
|
11145
11168
|
setAvailableEpics(epics);
|
|
11169
|
+
const validIds = new Set(epics.map((e) => e.id.toString()));
|
|
11170
|
+
setSelectedEpicIds((prev) => prev.filter((id) => validIds.has(id)));
|
|
11146
11171
|
}, [epics]);
|
|
11172
|
+
(0, import_react48.useEffect)(() => {
|
|
11173
|
+
setAvailableTasks(tasks);
|
|
11174
|
+
if (selectedTask) {
|
|
11175
|
+
setSelectedTask(tasks.find((t) => t.id === selectedTask.id) || null);
|
|
11176
|
+
}
|
|
11177
|
+
}, [tasks]);
|
|
11147
11178
|
(0, import_react48.useEffect)(() => {
|
|
11148
11179
|
const measureHeroHeight = () => {
|
|
11149
11180
|
if (heroRef.current) {
|
|
11150
|
-
|
|
11151
|
-
setHeroHeight(height);
|
|
11181
|
+
setHeroHeight(heroRef.current.offsetHeight);
|
|
11152
11182
|
}
|
|
11153
11183
|
};
|
|
11154
11184
|
measureHeroHeight();
|
|
@@ -11173,6 +11203,12 @@ var EpicsView = ({
|
|
|
11173
11203
|
}, 300);
|
|
11174
11204
|
return () => clearTimeout(timer);
|
|
11175
11205
|
}, [editingEpic]);
|
|
11206
|
+
const visibleEpics = selectedEpicIds.length === 0 ? availableEpics : availableEpics.filter((e) => selectedEpicIds.includes(e.id.toString()));
|
|
11207
|
+
const toggleEpicView = (epicId) => {
|
|
11208
|
+
setSelectedEpicIds(
|
|
11209
|
+
(prev) => prev.includes(epicId) ? prev.filter((id) => id !== epicId) : [...prev, epicId]
|
|
11210
|
+
);
|
|
11211
|
+
};
|
|
11176
11212
|
const handleDragStart = (task) => {
|
|
11177
11213
|
setDraggedTask(task);
|
|
11178
11214
|
};
|
|
@@ -11182,14 +11218,41 @@ var EpicsView = ({
|
|
|
11182
11218
|
const handleDrop = (e, epicId) => {
|
|
11183
11219
|
e.preventDefault();
|
|
11184
11220
|
if (draggedTask && extractId(draggedTask.epic).toString() !== epicId) {
|
|
11185
|
-
onUpdateTask(draggedTask.id.toString(), {
|
|
11186
|
-
|
|
11187
|
-
|
|
11221
|
+
onUpdateTask(draggedTask.id.toString(), { epic: Number(epicId) });
|
|
11222
|
+
setAvailableTasks(
|
|
11223
|
+
(prev) => prev.map((t) => t.id === draggedTask.id ? { ...t, epic: Number(epicId) } : t)
|
|
11224
|
+
);
|
|
11188
11225
|
setDraggedTask(null);
|
|
11189
11226
|
}
|
|
11190
11227
|
};
|
|
11191
11228
|
const getTasksByEpic = (epicId) => {
|
|
11192
|
-
return
|
|
11229
|
+
return availableTasks.filter((task) => extractId(task.epic).toString() === epicId);
|
|
11230
|
+
};
|
|
11231
|
+
const handleTaskClick = (task) => {
|
|
11232
|
+
setSelectedTask(task);
|
|
11233
|
+
onTaskClick?.(task);
|
|
11234
|
+
};
|
|
11235
|
+
const handleUpdateTask = async (taskId, updates) => {
|
|
11236
|
+
setAvailableTasks(
|
|
11237
|
+
(prev) => prev.map((t) => t.id === Number(taskId) ? { ...t, ...updates } : t)
|
|
11238
|
+
);
|
|
11239
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
11240
|
+
setSelectedTask((prev) => prev ? { ...prev, ...updates } : null);
|
|
11241
|
+
}
|
|
11242
|
+
await onUpdateTask(taskId, updates);
|
|
11243
|
+
};
|
|
11244
|
+
const handleDeleteTask = async (taskId) => {
|
|
11245
|
+
setAvailableTasks((prev) => prev.filter((t) => t.id !== Number(taskId)));
|
|
11246
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
11247
|
+
setSelectedTask(null);
|
|
11248
|
+
}
|
|
11249
|
+
await onDeleteTask?.(taskId);
|
|
11250
|
+
};
|
|
11251
|
+
const handleRemoveFromEpic = (task) => {
|
|
11252
|
+
onUpdateTask(task.id.toString(), { epic: null });
|
|
11253
|
+
setAvailableTasks(
|
|
11254
|
+
(prev) => prev.map((t) => t.id === task.id ? { ...t, epic: null } : t)
|
|
11255
|
+
);
|
|
11193
11256
|
};
|
|
11194
11257
|
const handleEditEpic = (epic) => {
|
|
11195
11258
|
setEditingEpic(epic.id.toString());
|
|
@@ -11198,19 +11261,15 @@ var EpicsView = ({
|
|
|
11198
11261
|
description: epic.description,
|
|
11199
11262
|
confidence: epic.confidence,
|
|
11200
11263
|
phase: epic.phase
|
|
11201
|
-
// progress: epic.progress || 0, // This is a number, not a string
|
|
11202
11264
|
});
|
|
11203
11265
|
};
|
|
11204
11266
|
const handleSaveEdit = async () => {
|
|
11205
11267
|
if (editingEpic && editForm.name) {
|
|
11206
11268
|
await onUpdateEpic(editingEpic.toString(), editForm);
|
|
11207
11269
|
setAvailableEpics(
|
|
11208
|
-
(prev) => prev.map(
|
|
11209
|
-
|
|
11210
|
-
|
|
11211
|
-
}
|
|
11212
|
-
return epic;
|
|
11213
|
-
})
|
|
11270
|
+
(prev) => prev.map(
|
|
11271
|
+
(epic) => epic.id.toString() === editingEpic ? { ...epic, ...editForm } : epic
|
|
11272
|
+
)
|
|
11214
11273
|
);
|
|
11215
11274
|
setEditingEpic(null);
|
|
11216
11275
|
setEditForm({});
|
|
@@ -11226,6 +11285,7 @@ var EpicsView = ({
|
|
|
11226
11285
|
)) {
|
|
11227
11286
|
await onDeleteEpic(epicId);
|
|
11228
11287
|
setAvailableEpics((prev) => prev.filter((epic) => epic.id.toString() !== epicId));
|
|
11288
|
+
setSelectedEpicIds((prev) => prev.filter((id) => id !== epicId));
|
|
11229
11289
|
}
|
|
11230
11290
|
};
|
|
11231
11291
|
const getPhaseLabel = (phase) => {
|
|
@@ -11268,218 +11328,315 @@ var EpicsView = ({
|
|
|
11268
11328
|
}
|
|
11269
11329
|
}
|
|
11270
11330
|
) }),
|
|
11271
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime65.
|
|
11331
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11272
11332
|
"div",
|
|
11273
11333
|
{
|
|
11274
|
-
className: "h-full overflow-y-auto",
|
|
11334
|
+
className: "h-full overflow-y-auto no-scrollbar",
|
|
11275
11335
|
style: {
|
|
11276
11336
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
11277
11337
|
},
|
|
11278
|
-
children:
|
|
11279
|
-
|
|
11280
|
-
|
|
11281
|
-
|
|
11282
|
-
|
|
11283
|
-
|
|
11284
|
-
|
|
11285
|
-
|
|
11286
|
-
|
|
11287
|
-
|
|
11288
|
-
|
|
11289
|
-
|
|
11290
|
-
|
|
11291
|
-
|
|
11292
|
-
|
|
11293
|
-
|
|
11294
|
-
|
|
11295
|
-
children: [
|
|
11296
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "p-4 border-b border-border", children: editingEpic === epic.id.toString() ? (
|
|
11297
|
-
/* Edit Mode */
|
|
11298
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "space-y-4", children: [
|
|
11299
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
11300
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11301
|
-
Input,
|
|
11302
|
-
{
|
|
11303
|
-
value: editForm.name || "",
|
|
11304
|
-
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
11305
|
-
placeholder: "Epic name",
|
|
11306
|
-
className: "font-semibold"
|
|
11307
|
-
}
|
|
11308
|
-
),
|
|
11309
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex gap-2 ml-2", children: [
|
|
11310
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11311
|
-
Button,
|
|
11312
|
-
{
|
|
11313
|
-
size: "sm",
|
|
11314
|
-
variant: "ghost",
|
|
11315
|
-
onClick: handleSaveEdit,
|
|
11316
|
-
className: "p-1 h-8 w-8",
|
|
11317
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Check, { className: "h-4 w-4" })
|
|
11318
|
-
}
|
|
11319
|
-
),
|
|
11338
|
+
children: [
|
|
11339
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "mb-4", children: [
|
|
11340
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
11341
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
11342
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { children: [
|
|
11343
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Epics" }),
|
|
11344
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "text-xs text-muted-foreground", children: selectedEpicIds.length === 0 ? "All showing" : `${selectedEpicIds.length}/${availableEpics.length} selected` })
|
|
11345
|
+
] }),
|
|
11346
|
+
selectedEpicIds.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
11347
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
11348
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleEpics.map((epic) => /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11349
|
+
"div",
|
|
11350
|
+
{
|
|
11351
|
+
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
11352
|
+
children: [
|
|
11353
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
11354
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("span", { className: "max-w-[80px] truncate", children: epic.name }),
|
|
11320
11355
|
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11321
|
-
|
|
11356
|
+
"button",
|
|
11322
11357
|
{
|
|
11323
|
-
|
|
11324
|
-
|
|
11325
|
-
onClick: handleCancelEdit,
|
|
11326
|
-
className: "p-1 h-8 w-8",
|
|
11358
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
11359
|
+
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
11327
11360
|
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.X, { className: "h-4 w-4" })
|
|
11328
11361
|
}
|
|
11329
11362
|
)
|
|
11330
|
-
]
|
|
11363
|
+
]
|
|
11364
|
+
},
|
|
11365
|
+
epic.id
|
|
11366
|
+
)) })
|
|
11367
|
+
] })
|
|
11368
|
+
] }),
|
|
11369
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11370
|
+
Button,
|
|
11371
|
+
{
|
|
11372
|
+
onClick: () => setIsEpicSelectorOpen(!isEpicSelectorOpen),
|
|
11373
|
+
variant: "outline",
|
|
11374
|
+
size: "sm",
|
|
11375
|
+
className: "gap-1",
|
|
11376
|
+
children: [
|
|
11377
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Layers, { className: "h-3 w-3" }),
|
|
11378
|
+
isEpicSelectorOpen ? "Close" : "Select"
|
|
11379
|
+
]
|
|
11380
|
+
}
|
|
11381
|
+
)
|
|
11382
|
+
] }) }),
|
|
11383
|
+
isEpicSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11384
|
+
"div",
|
|
11385
|
+
{
|
|
11386
|
+
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
11387
|
+
onClick: () => setIsEpicSelectorOpen(false)
|
|
11388
|
+
}
|
|
11389
|
+
),
|
|
11390
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11391
|
+
"div",
|
|
11392
|
+
{
|
|
11393
|
+
className: `fixed top-0 right-0 h-full w-80 bg-background border-l shadow-xl z-10 transition-all duration-300 ease-in-out ${isEpicSelectorOpen ? "translate-x-0 opacity-100 visible" : "translate-x-full opacity-0 invisible"}`,
|
|
11394
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
11395
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
11396
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
11397
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Epics" }),
|
|
11398
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11399
|
+
Button,
|
|
11400
|
+
{
|
|
11401
|
+
variant: "ghost",
|
|
11402
|
+
size: "sm",
|
|
11403
|
+
onClick: () => setIsEpicSelectorOpen(false),
|
|
11404
|
+
className: "h-8 w-8 p-0",
|
|
11405
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.X, { className: "h-4 w-4" })
|
|
11406
|
+
}
|
|
11407
|
+
)
|
|
11331
11408
|
] }),
|
|
11332
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11333
|
-
|
|
11409
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Filter which epics to display. Select none to show all." })
|
|
11410
|
+
] }),
|
|
11411
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto no-scrollbar", children: availableEpics.length > 0 ? availableEpics.map((epic) => {
|
|
11412
|
+
const isSelected = selectedEpicIds.includes(epic.id.toString());
|
|
11413
|
+
const taskCount = availableTasks.filter(
|
|
11414
|
+
(t) => extractId(t.epic) === epic.id
|
|
11415
|
+
).length;
|
|
11416
|
+
return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11417
|
+
"div",
|
|
11334
11418
|
{
|
|
11335
|
-
|
|
11336
|
-
|
|
11337
|
-
|
|
11338
|
-
|
|
11339
|
-
|
|
11340
|
-
|
|
11341
|
-
|
|
11342
|
-
|
|
11343
|
-
|
|
11344
|
-
|
|
11345
|
-
|
|
11346
|
-
|
|
11347
|
-
|
|
11348
|
-
|
|
11349
|
-
|
|
11350
|
-
|
|
11351
|
-
|
|
11352
|
-
|
|
11353
|
-
|
|
11354
|
-
|
|
11355
|
-
|
|
11356
|
-
|
|
11357
|
-
|
|
11358
|
-
|
|
11359
|
-
|
|
11360
|
-
|
|
11361
|
-
|
|
11362
|
-
|
|
11363
|
-
|
|
11364
|
-
|
|
11365
|
-
|
|
11366
|
-
|
|
11367
|
-
|
|
11368
|
-
|
|
11369
|
-
|
|
11370
|
-
|
|
11371
|
-
|
|
11372
|
-
|
|
11373
|
-
|
|
11374
|
-
|
|
11375
|
-
|
|
11376
|
-
|
|
11377
|
-
|
|
11378
|
-
|
|
11379
|
-
|
|
11380
|
-
|
|
11381
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
11382
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: `w-4 h-4 rounded-full ${epic.color}` }),
|
|
11383
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("h3", { className: "font-semibold text-foreground select-none flex-1", children: epic.name }),
|
|
11384
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex gap-1", children: [
|
|
11419
|
+
className: `p-3 rounded-lg border transition-all ${isSelected ? "bg-primary/10 border-primary/30 ring-1 ring-primary/20" : "bg-card border-border"}`,
|
|
11420
|
+
children: [
|
|
11421
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
11422
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
11423
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
11424
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "font-medium text-sm text-foreground truncate", children: epic.name })
|
|
11425
|
+
] }),
|
|
11426
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "ml-2 flex items-center gap-1", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Badge, { variant: "secondary", className: "text-xs", children: taskCount }) })
|
|
11427
|
+
] }),
|
|
11428
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11429
|
+
Button,
|
|
11430
|
+
{
|
|
11431
|
+
variant: isSelected ? "default" : "outline",
|
|
11432
|
+
size: "sm",
|
|
11433
|
+
className: "w-full mt-2 text-xs h-7",
|
|
11434
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
11435
|
+
children: isSelected ? "Deselect" : "Select"
|
|
11436
|
+
}
|
|
11437
|
+
)
|
|
11438
|
+
]
|
|
11439
|
+
},
|
|
11440
|
+
epic.id
|
|
11441
|
+
);
|
|
11442
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "text-sm text-muted-foreground text-center py-8", children: "No epics yet. Add one to get started." }) }) })
|
|
11443
|
+
] })
|
|
11444
|
+
}
|
|
11445
|
+
)
|
|
11446
|
+
] }),
|
|
11447
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 gap-3 auto-rows-max", children: visibleEpics.map((epic) => {
|
|
11448
|
+
const epicTasks = getTasksByEpic(epic.id.toString());
|
|
11449
|
+
const totalPoints = epicTasks.reduce(
|
|
11450
|
+
(sum, task) => sum + (task.storyPoints || 0),
|
|
11451
|
+
0
|
|
11452
|
+
);
|
|
11453
|
+
return /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11454
|
+
Card,
|
|
11455
|
+
{
|
|
11456
|
+
className: "flex flex-col bg-card shadow-sm",
|
|
11457
|
+
style: { maxHeight: "420px" },
|
|
11458
|
+
onDragOver: handleDragOver,
|
|
11459
|
+
onDrop: (e) => handleDrop(e, epic.id.toString()),
|
|
11460
|
+
children: [
|
|
11461
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "p-3 border-b border-border flex-shrink-0", children: editingEpic === epic.id.toString() ? (
|
|
11462
|
+
/* Edit Mode */
|
|
11463
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "space-y-3", children: [
|
|
11464
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
11385
11465
|
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11386
|
-
|
|
11466
|
+
Input,
|
|
11387
11467
|
{
|
|
11388
|
-
|
|
11389
|
-
|
|
11390
|
-
|
|
11391
|
-
className: "
|
|
11392
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Edit2, { className: "h-3 w-3" })
|
|
11468
|
+
value: editForm.name || "",
|
|
11469
|
+
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
11470
|
+
placeholder: "Epic name",
|
|
11471
|
+
className: "font-semibold text-sm"
|
|
11393
11472
|
}
|
|
11394
11473
|
),
|
|
11395
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.
|
|
11396
|
-
|
|
11397
|
-
|
|
11398
|
-
|
|
11399
|
-
|
|
11400
|
-
|
|
11401
|
-
|
|
11402
|
-
|
|
11403
|
-
|
|
11404
|
-
|
|
11405
|
-
|
|
11406
|
-
|
|
11407
|
-
|
|
11408
|
-
|
|
11409
|
-
|
|
11410
|
-
|
|
11411
|
-
|
|
11412
|
-
|
|
11413
|
-
|
|
11414
|
-
|
|
11474
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex gap-1 ml-2", children: [
|
|
11475
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11476
|
+
Button,
|
|
11477
|
+
{
|
|
11478
|
+
size: "sm",
|
|
11479
|
+
variant: "ghost",
|
|
11480
|
+
onClick: handleSaveEdit,
|
|
11481
|
+
className: "p-1 h-7 w-7",
|
|
11482
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Check, { className: "h-3 w-3" })
|
|
11483
|
+
}
|
|
11484
|
+
),
|
|
11485
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11486
|
+
Button,
|
|
11487
|
+
{
|
|
11488
|
+
size: "sm",
|
|
11489
|
+
variant: "ghost",
|
|
11490
|
+
onClick: handleCancelEdit,
|
|
11491
|
+
className: "p-1 h-7 w-7",
|
|
11492
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.X, { className: "h-3 w-3" })
|
|
11493
|
+
}
|
|
11494
|
+
)
|
|
11495
|
+
] })
|
|
11415
11496
|
] }),
|
|
11416
|
-
/* @__PURE__ */ (0, import_jsx_runtime65.
|
|
11417
|
-
|
|
11497
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11498
|
+
Textarea,
|
|
11418
11499
|
{
|
|
11419
|
-
|
|
11420
|
-
|
|
11421
|
-
|
|
11422
|
-
|
|
11423
|
-
" tasks"
|
|
11424
|
-
]
|
|
11500
|
+
value: editForm.description || "",
|
|
11501
|
+
onChange: (e) => setEditForm({ ...editForm, description: e.target.value }),
|
|
11502
|
+
placeholder: "Epic description",
|
|
11503
|
+
className: "text-xs min-h-[50px]"
|
|
11425
11504
|
}
|
|
11426
11505
|
),
|
|
11506
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
11507
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { children: [
|
|
11508
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("label", { className: "text-xs text-muted-foreground", children: "Confidence" }),
|
|
11509
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11510
|
+
"select",
|
|
11511
|
+
{
|
|
11512
|
+
value: editForm.confidence || epic.confidence,
|
|
11513
|
+
onChange: (e) => setEditForm({
|
|
11514
|
+
...editForm,
|
|
11515
|
+
confidence: e.target.value
|
|
11516
|
+
}),
|
|
11517
|
+
className: "flex h-7 w-full rounded-md border border-input bg-background px-2 py-1 text-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
11518
|
+
children: [
|
|
11519
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("option", { value: "low", children: "Low" }),
|
|
11520
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("option", { value: "medium", children: "Medium" }),
|
|
11521
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("option", { value: "high", children: "High" })
|
|
11522
|
+
]
|
|
11523
|
+
}
|
|
11524
|
+
)
|
|
11525
|
+
] }),
|
|
11526
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { children: [
|
|
11527
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("label", { className: "text-xs text-muted-foreground", children: "Phase" }),
|
|
11528
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11529
|
+
"select",
|
|
11530
|
+
{
|
|
11531
|
+
value: editForm.phase?.toString() || epic.phase.toString(),
|
|
11532
|
+
onChange: (e) => setEditForm({ ...editForm, phase: parseInt(e.target.value) }),
|
|
11533
|
+
className: "flex h-7 w-full rounded-md border border-input bg-background px-2 py-1 text-xs ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
11534
|
+
children: [1, 2, 3, 4, 5, 6, 7, 8, 9].map((phase) => /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("option", { value: phase.toString(), children: [
|
|
11535
|
+
"Phase ",
|
|
11536
|
+
phase
|
|
11537
|
+
] }, phase))
|
|
11538
|
+
}
|
|
11539
|
+
)
|
|
11540
|
+
] })
|
|
11541
|
+
] })
|
|
11542
|
+
] })
|
|
11543
|
+
) : (
|
|
11544
|
+
/* Display Mode */
|
|
11545
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(import_jsx_runtime65.Fragment, { children: [
|
|
11546
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex items-center gap-1.5 mb-1.5", children: [
|
|
11547
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
11548
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("h3", { className: "font-semibold text-foreground text-sm select-none flex-1 truncate", children: epic.name }),
|
|
11549
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex gap-0.5", children: [
|
|
11550
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11551
|
+
Button,
|
|
11552
|
+
{
|
|
11553
|
+
size: "sm",
|
|
11554
|
+
variant: "ghost",
|
|
11555
|
+
onClick: () => handleEditEpic(epic),
|
|
11556
|
+
className: "p-1 h-6 w-6",
|
|
11557
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Edit2, { className: "h-3 w-3" })
|
|
11558
|
+
}
|
|
11559
|
+
),
|
|
11560
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11561
|
+
Button,
|
|
11562
|
+
{
|
|
11563
|
+
size: "sm",
|
|
11564
|
+
variant: "ghost",
|
|
11565
|
+
onClick: () => handleDeleteEpic(epic.id.toString()),
|
|
11566
|
+
className: "p-1 h-6 w-6 hover:bg-destructive/10 hover:text-destructive",
|
|
11567
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Trash2, { className: "h-3 w-3" })
|
|
11568
|
+
}
|
|
11569
|
+
)
|
|
11570
|
+
] })
|
|
11571
|
+
] }),
|
|
11572
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex flex-wrap gap-1 mb-2", children: [
|
|
11573
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Badge, { className: `text-xs px-1.5 py-0 ${getConfidenceColor(epic.confidence)}`, children: epic.confidence }),
|
|
11574
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(Badge, { variant: "outline", className: "text-xs px-1.5 py-0", children: getPhaseLabel(epic.phase) }),
|
|
11575
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(Badge, { variant: "secondary", className: "text-xs px-1.5 py-0 bg-muted text-muted-foreground", children: [
|
|
11576
|
+
epicTasks.length,
|
|
11577
|
+
"t \xB7 ",
|
|
11578
|
+
totalPoints,
|
|
11579
|
+
"pt"
|
|
11580
|
+
] })
|
|
11581
|
+
] }),
|
|
11582
|
+
epic.description && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)("p", { className: "text-xs text-muted-foreground mb-2 select-none line-clamp-2", children: epic.description }),
|
|
11427
11583
|
/* @__PURE__ */ (0, import_jsx_runtime65.jsxs)(
|
|
11428
|
-
|
|
11584
|
+
Button,
|
|
11429
11585
|
{
|
|
11430
|
-
|
|
11431
|
-
|
|
11586
|
+
onClick: () => {
|
|
11587
|
+
setIsAddTaskModalOpen(true);
|
|
11588
|
+
setAddTaskEpic(epic);
|
|
11589
|
+
},
|
|
11590
|
+
variant: "outline",
|
|
11591
|
+
size: "sm",
|
|
11592
|
+
className: "w-full gap-1 h-7 text-xs",
|
|
11432
11593
|
children: [
|
|
11433
|
-
|
|
11434
|
-
"
|
|
11594
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Plus, { className: "h-3 w-3" }),
|
|
11595
|
+
"Add Task"
|
|
11435
11596
|
]
|
|
11436
11597
|
}
|
|
11437
11598
|
)
|
|
11438
|
-
] })
|
|
11439
|
-
|
|
11440
|
-
|
|
11441
|
-
|
|
11442
|
-
|
|
11443
|
-
|
|
11444
|
-
|
|
11445
|
-
|
|
11446
|
-
}
|
|
11447
|
-
|
|
11448
|
-
|
|
11449
|
-
|
|
11450
|
-
|
|
11451
|
-
|
|
11452
|
-
|
|
11453
|
-
|
|
11454
|
-
|
|
11455
|
-
|
|
11456
|
-
|
|
11457
|
-
|
|
11458
|
-
|
|
11459
|
-
|
|
11460
|
-
|
|
11461
|
-
|
|
11462
|
-
|
|
11463
|
-
|
|
11464
|
-
|
|
11465
|
-
|
|
11466
|
-
|
|
11467
|
-
|
|
11468
|
-
|
|
11469
|
-
|
|
11470
|
-
|
|
11471
|
-
|
|
11472
|
-
|
|
11473
|
-
|
|
11474
|
-
|
|
11475
|
-
|
|
11476
|
-
|
|
11477
|
-
|
|
11478
|
-
|
|
11479
|
-
},
|
|
11480
|
-
epic.id
|
|
11481
|
-
);
|
|
11482
|
-
}) })
|
|
11599
|
+
] })
|
|
11600
|
+
) }),
|
|
11601
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("div", { className: "flex-1 p-2 overflow-y-auto no-scrollbar min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11602
|
+
"div",
|
|
11603
|
+
{
|
|
11604
|
+
className: `space-y-2 min-h-[80px] border-2 border-dashed rounded p-2 transition-colors ${draggedTask ? "border-primary bg-primary/10" : "border-border"}`,
|
|
11605
|
+
children: epicTasks.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "flex flex-col items-center justify-center h-16 text-muted-foreground", children: [
|
|
11606
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.Move, { className: "h-5 w-5 mb-1" }),
|
|
11607
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)("span", { className: "text-xs select-none", children: "Drop tasks here" })
|
|
11608
|
+
] }) : epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime65.jsxs)("div", { className: "relative group", children: [
|
|
11609
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11610
|
+
TaskCard,
|
|
11611
|
+
{
|
|
11612
|
+
task,
|
|
11613
|
+
epic,
|
|
11614
|
+
onDragStart: handleDragStart,
|
|
11615
|
+
onTaskClick: handleTaskClick,
|
|
11616
|
+
isCompact: true
|
|
11617
|
+
}
|
|
11618
|
+
),
|
|
11619
|
+
/* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11620
|
+
"button",
|
|
11621
|
+
{
|
|
11622
|
+
onClick: (e) => {
|
|
11623
|
+
e.stopPropagation();
|
|
11624
|
+
handleRemoveFromEpic(task);
|
|
11625
|
+
},
|
|
11626
|
+
title: "Remove from epic",
|
|
11627
|
+
className: "absolute top-1 right-1 opacity-0 group-hover:opacity-100 transition-opacity bg-background/80 hover:bg-destructive/10 hover:text-destructive rounded p-0.5",
|
|
11628
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(import_lucide_react35.X, { className: "h-3 w-3" })
|
|
11629
|
+
}
|
|
11630
|
+
)
|
|
11631
|
+
] }, task.id))
|
|
11632
|
+
}
|
|
11633
|
+
) })
|
|
11634
|
+
]
|
|
11635
|
+
},
|
|
11636
|
+
epic.id
|
|
11637
|
+
);
|
|
11638
|
+
}) })
|
|
11639
|
+
]
|
|
11483
11640
|
}
|
|
11484
11641
|
) })
|
|
11485
11642
|
] }),
|
|
@@ -11502,21 +11659,417 @@ var EpicsView = ({
|
|
|
11502
11659
|
defaultEpicId: addTaskEpic?.id.toString() || "",
|
|
11503
11660
|
sprints
|
|
11504
11661
|
}
|
|
11662
|
+
),
|
|
11663
|
+
selectedTask && /* @__PURE__ */ (0, import_jsx_runtime65.jsx)(
|
|
11664
|
+
TaskDetailsModal,
|
|
11665
|
+
{
|
|
11666
|
+
isOpen: !!selectedTask,
|
|
11667
|
+
onClose: () => setSelectedTask(null),
|
|
11668
|
+
initialTask: selectedTask,
|
|
11669
|
+
epics: availableEpics,
|
|
11670
|
+
sprints,
|
|
11671
|
+
onUpdateTask: handleUpdateTask,
|
|
11672
|
+
onDeleteTask: handleDeleteTask,
|
|
11673
|
+
onAddComment,
|
|
11674
|
+
colleagues,
|
|
11675
|
+
onUploadFile,
|
|
11676
|
+
onDeleteFile,
|
|
11677
|
+
onFileUpdate
|
|
11678
|
+
}
|
|
11505
11679
|
)
|
|
11506
11680
|
] });
|
|
11507
11681
|
};
|
|
11508
11682
|
|
|
11509
|
-
// src/components/Projects/
|
|
11510
|
-
var import_react50 = require("react");
|
|
11511
|
-
var import_lucide_react37 = require("lucide-react");
|
|
11512
|
-
|
|
11513
|
-
// src/components/Projects/AddSprintModal.tsx
|
|
11683
|
+
// src/components/Projects/GanttView.tsx
|
|
11514
11684
|
var import_react49 = require("react");
|
|
11515
|
-
var import_lucide_react36 = require("lucide-react");
|
|
11516
11685
|
var import_date_fns = require("date-fns");
|
|
11686
|
+
var import_lucide_react36 = require("lucide-react");
|
|
11517
11687
|
var import_jsx_runtime66 = require("react/jsx-runtime");
|
|
11688
|
+
var PHASE_LABELS = {
|
|
11689
|
+
1: "Plan",
|
|
11690
|
+
2: "Dev",
|
|
11691
|
+
3: "Test",
|
|
11692
|
+
4: "Deploy",
|
|
11693
|
+
5: "Review",
|
|
11694
|
+
6: "Maint.",
|
|
11695
|
+
7: "Complete",
|
|
11696
|
+
8: "Archive",
|
|
11697
|
+
9: "Legacy"
|
|
11698
|
+
};
|
|
11699
|
+
var ZOOM_LEVELS = [
|
|
11700
|
+
{ label: "Quarter", dayWidth: 3 },
|
|
11701
|
+
{ label: "Month", dayWidth: 7 },
|
|
11702
|
+
{ label: "Week", dayWidth: 14 },
|
|
11703
|
+
{ label: "Day", dayWidth: 40 }
|
|
11704
|
+
];
|
|
11705
|
+
var ROW_HEIGHT = 48;
|
|
11706
|
+
var TIME_HEADER_HEIGHT = 60;
|
|
11707
|
+
var GanttView = ({
|
|
11708
|
+
tasks,
|
|
11709
|
+
epics,
|
|
11710
|
+
sprints,
|
|
11711
|
+
onTaskClick
|
|
11712
|
+
}) => {
|
|
11713
|
+
const [dayWidth, setDayWidth] = (0, import_react49.useState)(7);
|
|
11714
|
+
const [isFullscreen, setIsFullscreen] = (0, import_react49.useState)(false);
|
|
11715
|
+
const scrollRef = (0, import_react49.useRef)(null);
|
|
11716
|
+
const heroRef = (0, import_react49.useRef)(null);
|
|
11717
|
+
const [heroHeight, setHeroHeight] = (0, import_react49.useState)(0);
|
|
11718
|
+
(0, import_react49.useEffect)(() => {
|
|
11719
|
+
const measure = () => {
|
|
11720
|
+
if (heroRef.current) setHeroHeight(heroRef.current.offsetHeight);
|
|
11721
|
+
};
|
|
11722
|
+
const observer = new ResizeObserver(measure);
|
|
11723
|
+
if (heroRef.current) observer.observe(heroRef.current);
|
|
11724
|
+
return () => observer.disconnect();
|
|
11725
|
+
}, []);
|
|
11726
|
+
const { timelineStart, timelineEnd, totalDays } = (0, import_react49.useMemo)(() => {
|
|
11727
|
+
if (epics.length === 0) {
|
|
11728
|
+
const today = /* @__PURE__ */ new Date();
|
|
11729
|
+
const start = (0, import_date_fns.addDays)(today, -14);
|
|
11730
|
+
const end = (0, import_date_fns.addDays)(today, 76);
|
|
11731
|
+
return { timelineStart: start, timelineEnd: end, totalDays: 90 };
|
|
11732
|
+
}
|
|
11733
|
+
const allDates = epics.flatMap((e) => [new Date(e.startDate), new Date(e.endDate)]);
|
|
11734
|
+
const minTime = Math.min(...allDates.map((d) => d.getTime()));
|
|
11735
|
+
const maxTime = Math.max(...allDates.map((d) => d.getTime()));
|
|
11736
|
+
const paddedStart = (0, import_date_fns.addDays)(new Date(minTime), -14);
|
|
11737
|
+
const paddedEnd = (0, import_date_fns.addDays)(new Date(maxTime), 14);
|
|
11738
|
+
return {
|
|
11739
|
+
timelineStart: paddedStart,
|
|
11740
|
+
timelineEnd: paddedEnd,
|
|
11741
|
+
totalDays: (0, import_date_fns.differenceInDays)(paddedEnd, paddedStart)
|
|
11742
|
+
};
|
|
11743
|
+
}, [epics]);
|
|
11744
|
+
const { groups, sortedKeys } = (0, import_react49.useMemo)(() => {
|
|
11745
|
+
const groups2 = {};
|
|
11746
|
+
epics.forEach((epic) => {
|
|
11747
|
+
if (!groups2[epic.name]) groups2[epic.name] = [];
|
|
11748
|
+
groups2[epic.name].push(epic);
|
|
11749
|
+
});
|
|
11750
|
+
Object.values(groups2).forEach((list) => list.sort((a, b) => a.phase - b.phase));
|
|
11751
|
+
const sortedKeys2 = Object.keys(groups2).sort((a, b) => {
|
|
11752
|
+
const aMin = Math.min(...groups2[a].map((e) => new Date(e.startDate).getTime()));
|
|
11753
|
+
const bMin = Math.min(...groups2[b].map((e) => new Date(e.startDate).getTime()));
|
|
11754
|
+
return aMin - bMin;
|
|
11755
|
+
});
|
|
11756
|
+
return { groups: groups2, sortedKeys: sortedKeys2 };
|
|
11757
|
+
}, [epics]);
|
|
11758
|
+
const realSprints = (0, import_react49.useMemo)(
|
|
11759
|
+
() => sprints.filter((s) => {
|
|
11760
|
+
const name = s.name.toLowerCase();
|
|
11761
|
+
return name !== "backlog" && name !== "all tasks";
|
|
11762
|
+
}),
|
|
11763
|
+
[sprints]
|
|
11764
|
+
);
|
|
11765
|
+
const monthHeaders = (0, import_react49.useMemo)(
|
|
11766
|
+
() => (0, import_date_fns.eachMonthOfInterval)({ start: timelineStart, end: timelineEnd }).map((month) => ({
|
|
11767
|
+
month,
|
|
11768
|
+
left: (0, import_date_fns.differenceInDays)(month, timelineStart) * dayWidth
|
|
11769
|
+
})),
|
|
11770
|
+
[timelineStart, timelineEnd, dayWidth]
|
|
11771
|
+
);
|
|
11772
|
+
const totalWidth = Math.max(totalDays * dayWidth, 600);
|
|
11773
|
+
const scrollToToday = (0, import_react49.useCallback)(() => {
|
|
11774
|
+
if (scrollRef.current) {
|
|
11775
|
+
const todayOffset = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
11776
|
+
scrollRef.current.scrollLeft = Math.max(0, todayOffset - 200);
|
|
11777
|
+
}
|
|
11778
|
+
}, [timelineStart, dayWidth]);
|
|
11779
|
+
const todayLeft = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
11780
|
+
const getEpicStats = (epic) => {
|
|
11781
|
+
const epicTasks = tasks.filter((t) => extractId(t.epic) === epic.id);
|
|
11782
|
+
const done = epicTasks.filter((t) => t.status === "done").length;
|
|
11783
|
+
const pct = epicTasks.length > 0 ? Math.round(done / epicTasks.length * 100) : 0;
|
|
11784
|
+
return { total: epicTasks.length, done, pct };
|
|
11785
|
+
};
|
|
11786
|
+
const getGroupStats = (epicList) => {
|
|
11787
|
+
const allTasks = epicList.flatMap(
|
|
11788
|
+
(e) => tasks.filter((t) => extractId(t.epic) === e.id)
|
|
11789
|
+
);
|
|
11790
|
+
const done = allTasks.filter((t) => t.status === "done").length;
|
|
11791
|
+
const pct = allTasks.length > 0 ? Math.round(done / allTasks.length * 100) : 0;
|
|
11792
|
+
return { total: allTasks.length, done, pct };
|
|
11793
|
+
};
|
|
11794
|
+
const isSprintActive = (sprint) => {
|
|
11795
|
+
const today = /* @__PURE__ */ new Date();
|
|
11796
|
+
try {
|
|
11797
|
+
return (0, import_date_fns.isWithinInterval)(today, {
|
|
11798
|
+
start: new Date(sprint.startDate),
|
|
11799
|
+
end: new Date(sprint.endDate)
|
|
11800
|
+
});
|
|
11801
|
+
} catch {
|
|
11802
|
+
return false;
|
|
11803
|
+
}
|
|
11804
|
+
};
|
|
11805
|
+
const chartContent = /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
|
|
11806
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "w-52 flex-shrink-0 border-r bg-background z-10 flex flex-col", children: [
|
|
11807
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11808
|
+
"div",
|
|
11809
|
+
{
|
|
11810
|
+
className: "border-b flex items-end pb-2 px-3 flex-shrink-0 bg-muted/20",
|
|
11811
|
+
style: { height: TIME_HEADER_HEIGHT },
|
|
11812
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "text-xs font-semibold text-muted-foreground tracking-wider uppercase", children: "Epic" })
|
|
11813
|
+
}
|
|
11814
|
+
),
|
|
11815
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "overflow-y-auto flex-1", children: [
|
|
11816
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "flex items-center justify-center h-24 text-sm text-muted-foreground", children: "No epics" }),
|
|
11817
|
+
sortedKeys.map((name) => {
|
|
11818
|
+
const stats = getGroupStats(groups[name]);
|
|
11819
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
|
|
11820
|
+
"div",
|
|
11821
|
+
{
|
|
11822
|
+
className: "flex flex-col justify-center px-3 border-b",
|
|
11823
|
+
style: { height: ROW_HEIGHT },
|
|
11824
|
+
children: [
|
|
11825
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "text-sm font-medium truncate", title: name, children: name }),
|
|
11826
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("span", { className: "text-xs text-muted-foreground", children: [
|
|
11827
|
+
stats.total,
|
|
11828
|
+
" task",
|
|
11829
|
+
stats.total !== 1 ? "s" : "",
|
|
11830
|
+
" \xB7 ",
|
|
11831
|
+
stats.pct,
|
|
11832
|
+
"%"
|
|
11833
|
+
] })
|
|
11834
|
+
]
|
|
11835
|
+
},
|
|
11836
|
+
name
|
|
11837
|
+
);
|
|
11838
|
+
})
|
|
11839
|
+
] })
|
|
11840
|
+
] }),
|
|
11841
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "flex-1 overflow-x-auto overflow-y-auto", ref: scrollRef, children: /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { style: { width: totalWidth, position: "relative" }, children: [
|
|
11842
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
|
|
11843
|
+
"div",
|
|
11844
|
+
{
|
|
11845
|
+
className: "sticky top-0 border-b bg-muted/20 z-20 flex-shrink-0",
|
|
11846
|
+
style: { height: TIME_HEADER_HEIGHT, width: totalWidth },
|
|
11847
|
+
children: [
|
|
11848
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11849
|
+
"div",
|
|
11850
|
+
{
|
|
11851
|
+
className: "absolute top-2 text-xs font-semibold text-muted-foreground select-none",
|
|
11852
|
+
style: { left: left + 4 },
|
|
11853
|
+
children: (0, import_date_fns.format)(month, "MMM yyyy")
|
|
11854
|
+
},
|
|
11855
|
+
month.toISOString()
|
|
11856
|
+
)),
|
|
11857
|
+
realSprints.map((sprint) => {
|
|
11858
|
+
const start = new Date(sprint.startDate);
|
|
11859
|
+
const end = new Date(sprint.endDate);
|
|
11860
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
11861
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
11862
|
+
const right = Math.min(
|
|
11863
|
+
totalWidth,
|
|
11864
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
11865
|
+
);
|
|
11866
|
+
const width = right - left;
|
|
11867
|
+
if (width <= 0) return null;
|
|
11868
|
+
const active = isSprintActive(sprint);
|
|
11869
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11870
|
+
"div",
|
|
11871
|
+
{
|
|
11872
|
+
className: `absolute bottom-0 border-l border-t text-xs px-1 overflow-hidden whitespace-nowrap select-none flex items-center ${active ? "border-primary/50 bg-primary/10 text-primary font-medium" : "border-border bg-muted/40 text-muted-foreground"}`,
|
|
11873
|
+
style: { left, width, height: 22 },
|
|
11874
|
+
title: sprint.name,
|
|
11875
|
+
children: sprint.name
|
|
11876
|
+
},
|
|
11877
|
+
`header-sprint-${sprint.id}`
|
|
11878
|
+
);
|
|
11879
|
+
})
|
|
11880
|
+
]
|
|
11881
|
+
}
|
|
11882
|
+
),
|
|
11883
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { style: { position: "relative", width: totalWidth }, children: [
|
|
11884
|
+
realSprints.map((sprint) => {
|
|
11885
|
+
const start = new Date(sprint.startDate);
|
|
11886
|
+
const end = new Date(sprint.endDate);
|
|
11887
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
11888
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
11889
|
+
const right = Math.min(
|
|
11890
|
+
totalWidth,
|
|
11891
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
11892
|
+
);
|
|
11893
|
+
const width = right - left;
|
|
11894
|
+
if (width <= 0 || !isSprintActive(sprint)) return null;
|
|
11895
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11896
|
+
"div",
|
|
11897
|
+
{
|
|
11898
|
+
className: "absolute inset-y-0 bg-primary/5 pointer-events-none",
|
|
11899
|
+
style: { left, width }
|
|
11900
|
+
},
|
|
11901
|
+
`bg-${sprint.id}`
|
|
11902
|
+
);
|
|
11903
|
+
}),
|
|
11904
|
+
realSprints.map((sprint) => {
|
|
11905
|
+
const left = (0, import_date_fns.differenceInDays)(new Date(sprint.startDate), timelineStart) * dayWidth;
|
|
11906
|
+
if (left < 0 || left > totalWidth) return null;
|
|
11907
|
+
const active = isSprintActive(sprint);
|
|
11908
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11909
|
+
"div",
|
|
11910
|
+
{
|
|
11911
|
+
className: `absolute inset-y-0 pointer-events-none ${active ? "border-l border-primary/40" : "border-l border-dashed border-border/60"}`,
|
|
11912
|
+
style: { left }
|
|
11913
|
+
},
|
|
11914
|
+
`line-${sprint.id}`
|
|
11915
|
+
);
|
|
11916
|
+
}),
|
|
11917
|
+
todayLeft >= 0 && todayLeft <= totalWidth && /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
|
|
11918
|
+
"div",
|
|
11919
|
+
{
|
|
11920
|
+
className: "absolute inset-y-0 pointer-events-none z-10",
|
|
11921
|
+
style: { left: todayLeft },
|
|
11922
|
+
children: [
|
|
11923
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "absolute inset-y-0 w-0.5 bg-destructive/50" }),
|
|
11924
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "absolute top-1 -translate-x-1/2 w-2 h-2 rounded-full bg-destructive" })
|
|
11925
|
+
]
|
|
11926
|
+
}
|
|
11927
|
+
),
|
|
11928
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11929
|
+
"div",
|
|
11930
|
+
{
|
|
11931
|
+
className: "absolute inset-y-0 border-l border-border/30 pointer-events-none",
|
|
11932
|
+
style: { left }
|
|
11933
|
+
},
|
|
11934
|
+
`grid-${month.toISOString()}`
|
|
11935
|
+
)),
|
|
11936
|
+
sortedKeys.map((name) => {
|
|
11937
|
+
const epicList = groups[name];
|
|
11938
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11939
|
+
"div",
|
|
11940
|
+
{
|
|
11941
|
+
className: "border-b relative flex items-center",
|
|
11942
|
+
style: { height: ROW_HEIGHT },
|
|
11943
|
+
children: epicList.map((epic) => {
|
|
11944
|
+
const start = new Date(epic.startDate);
|
|
11945
|
+
const end = new Date(epic.endDate);
|
|
11946
|
+
const left = (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth;
|
|
11947
|
+
const width = Math.max(8, (0, import_date_fns.differenceInDays)(end, start) * dayWidth);
|
|
11948
|
+
const stats = getEpicStats(epic);
|
|
11949
|
+
const phaseLabel = PHASE_LABELS[epic.phase] ?? `Phase ${epic.phase}`;
|
|
11950
|
+
const showLabel = width >= 50;
|
|
11951
|
+
const tooltip = [
|
|
11952
|
+
`${epic.name} \xB7 ${phaseLabel}`,
|
|
11953
|
+
epic.description ? epic.description : null,
|
|
11954
|
+
`${(0, import_date_fns.format)(start, "dd MMM yyyy")} \u2192 ${(0, import_date_fns.format)(end, "dd MMM yyyy")}`,
|
|
11955
|
+
`${stats.total} tasks \xB7 ${stats.pct}% complete`
|
|
11956
|
+
].filter(Boolean).join("\n");
|
|
11957
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
|
|
11958
|
+
"div",
|
|
11959
|
+
{
|
|
11960
|
+
className: "absolute rounded overflow-hidden cursor-pointer hover:ring-2 hover:ring-white/40 transition-all",
|
|
11961
|
+
style: { left, width, height: 32, top: 8 },
|
|
11962
|
+
title: tooltip,
|
|
11963
|
+
children: [
|
|
11964
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11965
|
+
"div",
|
|
11966
|
+
{
|
|
11967
|
+
className: `absolute inset-0 ${epic.color}`,
|
|
11968
|
+
style: { opacity: 0.2 }
|
|
11969
|
+
}
|
|
11970
|
+
),
|
|
11971
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11972
|
+
"div",
|
|
11973
|
+
{
|
|
11974
|
+
className: `absolute inset-y-0 left-0 ${epic.color} transition-all`,
|
|
11975
|
+
style: { width: `${stats.pct}%`, opacity: 0.85 }
|
|
11976
|
+
}
|
|
11977
|
+
),
|
|
11978
|
+
showLabel && /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "absolute inset-0 flex items-center px-2 gap-1.5 z-10", children: [
|
|
11979
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("span", { className: "text-xs font-semibold text-white drop-shadow truncate", children: phaseLabel }),
|
|
11980
|
+
stats.total > 0 && /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("span", { className: "text-xs text-white/80 drop-shadow shrink-0", children: [
|
|
11981
|
+
stats.pct,
|
|
11982
|
+
"%"
|
|
11983
|
+
] })
|
|
11984
|
+
] })
|
|
11985
|
+
]
|
|
11986
|
+
},
|
|
11987
|
+
epic.id
|
|
11988
|
+
);
|
|
11989
|
+
})
|
|
11990
|
+
},
|
|
11991
|
+
name
|
|
11992
|
+
);
|
|
11993
|
+
}),
|
|
11994
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
11995
|
+
"div",
|
|
11996
|
+
{
|
|
11997
|
+
className: "flex items-center justify-center text-sm text-muted-foreground",
|
|
11998
|
+
style: { height: 200 },
|
|
11999
|
+
children: "No epics to display on the timeline"
|
|
12000
|
+
}
|
|
12001
|
+
)
|
|
12002
|
+
] })
|
|
12003
|
+
] }) })
|
|
12004
|
+
] });
|
|
12005
|
+
const inner = /* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: `flex flex-col ${isFullscreen ? "h-screen" : "h-full"} overflow-hidden`, children: [
|
|
12006
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
12007
|
+
DashboardHero,
|
|
12008
|
+
{
|
|
12009
|
+
title: "Gantt Chart",
|
|
12010
|
+
description: "Epic timeline with sprint alignment and phase-based grouping.",
|
|
12011
|
+
gradient: "bg-gradient-to-r from-indigo-600 via-blue-600 to-cyan-600",
|
|
12012
|
+
badge: `${sortedKeys.length} epic${sortedKeys.length !== 1 ? "s" : ""}`
|
|
12013
|
+
}
|
|
12014
|
+
) }),
|
|
12015
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)("div", { className: "flex items-center gap-2 px-4 py-2 border-b bg-background flex-shrink-0", children: [
|
|
12016
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_lucide_react36.BarChart2, { className: "h-4 w-4 text-muted-foreground" }),
|
|
12017
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "flex items-center gap-1", children: ZOOM_LEVELS.map((z) => /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
12018
|
+
Button,
|
|
12019
|
+
{
|
|
12020
|
+
variant: dayWidth === z.dayWidth ? "default" : "outline",
|
|
12021
|
+
size: "sm",
|
|
12022
|
+
className: "h-7 px-2 text-xs",
|
|
12023
|
+
onClick: () => setDayWidth(z.dayWidth),
|
|
12024
|
+
children: z.label
|
|
12025
|
+
},
|
|
12026
|
+
z.label
|
|
12027
|
+
)) }),
|
|
12028
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "flex-1" }),
|
|
12029
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsxs)(
|
|
12030
|
+
Button,
|
|
12031
|
+
{
|
|
12032
|
+
variant: "outline",
|
|
12033
|
+
size: "sm",
|
|
12034
|
+
className: "h-7 px-2 text-xs",
|
|
12035
|
+
onClick: scrollToToday,
|
|
12036
|
+
children: [
|
|
12037
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_lucide_react36.Calendar, { className: "h-3 w-3 mr-1" }),
|
|
12038
|
+
"Today"
|
|
12039
|
+
]
|
|
12040
|
+
}
|
|
12041
|
+
),
|
|
12042
|
+
/* @__PURE__ */ (0, import_jsx_runtime66.jsx)(
|
|
12043
|
+
Button,
|
|
12044
|
+
{
|
|
12045
|
+
variant: "outline",
|
|
12046
|
+
size: "sm",
|
|
12047
|
+
className: "h-7 w-7 p-0",
|
|
12048
|
+
onClick: () => setIsFullscreen((v) => !v),
|
|
12049
|
+
title: isFullscreen ? "Exit fullscreen" : "Fullscreen",
|
|
12050
|
+
children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_lucide_react36.Minimize2, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime66.jsx)(import_lucide_react36.Maximize2, { className: "h-3.5 w-3.5" })
|
|
12051
|
+
}
|
|
12052
|
+
)
|
|
12053
|
+
] }),
|
|
12054
|
+
chartContent
|
|
12055
|
+
] });
|
|
12056
|
+
if (isFullscreen) {
|
|
12057
|
+
return /* @__PURE__ */ (0, import_jsx_runtime66.jsx)("div", { className: "fixed inset-0 z-50 bg-background overflow-hidden", children: inner });
|
|
12058
|
+
}
|
|
12059
|
+
return inner;
|
|
12060
|
+
};
|
|
12061
|
+
|
|
12062
|
+
// src/components/Projects/PlanningView.tsx
|
|
12063
|
+
var import_react51 = require("react");
|
|
12064
|
+
var import_lucide_react38 = require("lucide-react");
|
|
12065
|
+
|
|
12066
|
+
// src/components/Projects/AddSprintModal.tsx
|
|
12067
|
+
var import_react50 = require("react");
|
|
12068
|
+
var import_lucide_react37 = require("lucide-react");
|
|
12069
|
+
var import_date_fns2 = require("date-fns");
|
|
12070
|
+
var import_jsx_runtime67 = require("react/jsx-runtime");
|
|
11518
12071
|
var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
11519
|
-
const [formData, setFormData] = (0,
|
|
12072
|
+
const [formData, setFormData] = (0, import_react50.useState)({
|
|
11520
12073
|
name: "",
|
|
11521
12074
|
description: "",
|
|
11522
12075
|
startDate: void 0,
|
|
@@ -11557,12 +12110,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11557
12110
|
});
|
|
11558
12111
|
onClose();
|
|
11559
12112
|
};
|
|
11560
|
-
return /* @__PURE__ */ (0,
|
|
11561
|
-
/* @__PURE__ */ (0,
|
|
11562
|
-
/* @__PURE__ */ (0,
|
|
11563
|
-
/* @__PURE__ */ (0,
|
|
11564
|
-
/* @__PURE__ */ (0,
|
|
11565
|
-
/* @__PURE__ */ (0,
|
|
12113
|
+
return /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Dialog, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(DialogContent, { className: "sm:max-w-md", children: [
|
|
12114
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(DialogTitle, { children: "Add New Sprint" }) }),
|
|
12115
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
12116
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "space-y-2", children: [
|
|
12117
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Label3, { htmlFor: "name", children: "Sprint Name *" }),
|
|
12118
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
|
|
11566
12119
|
Input,
|
|
11567
12120
|
{
|
|
11568
12121
|
id: "name",
|
|
@@ -11573,9 +12126,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11573
12126
|
}
|
|
11574
12127
|
)
|
|
11575
12128
|
] }),
|
|
11576
|
-
/* @__PURE__ */ (0,
|
|
11577
|
-
/* @__PURE__ */ (0,
|
|
11578
|
-
/* @__PURE__ */ (0,
|
|
12129
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "space-y-2", children: [
|
|
12130
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Label3, { htmlFor: "description", children: "Description" }),
|
|
12131
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
|
|
11579
12132
|
Textarea,
|
|
11580
12133
|
{
|
|
11581
12134
|
id: "description",
|
|
@@ -11586,11 +12139,11 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11586
12139
|
}
|
|
11587
12140
|
)
|
|
11588
12141
|
] }),
|
|
11589
|
-
/* @__PURE__ */ (0,
|
|
11590
|
-
/* @__PURE__ */ (0,
|
|
11591
|
-
/* @__PURE__ */ (0,
|
|
11592
|
-
/* @__PURE__ */ (0,
|
|
11593
|
-
/* @__PURE__ */ (0,
|
|
12142
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
12143
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "space-y-2", children: [
|
|
12144
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Label3, { children: "Start Date *" }),
|
|
12145
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Popover, { children: [
|
|
12146
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
|
|
11594
12147
|
Button,
|
|
11595
12148
|
{
|
|
11596
12149
|
variant: "outline",
|
|
@@ -11599,12 +12152,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11599
12152
|
!formData.startDate && "text-muted-foreground"
|
|
11600
12153
|
),
|
|
11601
12154
|
children: [
|
|
11602
|
-
/* @__PURE__ */ (0,
|
|
11603
|
-
formData.startDate ? (0,
|
|
12155
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_lucide_react37.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
12156
|
+
formData.startDate ? (0, import_date_fns2.format)(formData.startDate, "PPP") : "Pick a date"
|
|
11604
12157
|
]
|
|
11605
12158
|
}
|
|
11606
12159
|
) }),
|
|
11607
|
-
/* @__PURE__ */ (0,
|
|
12160
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
|
|
11608
12161
|
Calendar3,
|
|
11609
12162
|
{
|
|
11610
12163
|
mode: "single",
|
|
@@ -11615,10 +12168,10 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11615
12168
|
) })
|
|
11616
12169
|
] })
|
|
11617
12170
|
] }),
|
|
11618
|
-
/* @__PURE__ */ (0,
|
|
11619
|
-
/* @__PURE__ */ (0,
|
|
11620
|
-
/* @__PURE__ */ (0,
|
|
11621
|
-
/* @__PURE__ */ (0,
|
|
12171
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "space-y-2", children: [
|
|
12172
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Label3, { children: "End Date *" }),
|
|
12173
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(Popover, { children: [
|
|
12174
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime67.jsxs)(
|
|
11622
12175
|
Button,
|
|
11623
12176
|
{
|
|
11624
12177
|
variant: "outline",
|
|
@@ -11627,12 +12180,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11627
12180
|
!formData.endDate && "text-muted-foreground"
|
|
11628
12181
|
),
|
|
11629
12182
|
children: [
|
|
11630
|
-
/* @__PURE__ */ (0,
|
|
11631
|
-
formData.endDate ? (0,
|
|
12183
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(import_lucide_react37.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
12184
|
+
formData.endDate ? (0, import_date_fns2.format)(formData.endDate, "PPP") : "Pick a date"
|
|
11632
12185
|
]
|
|
11633
12186
|
}
|
|
11634
12187
|
) }),
|
|
11635
|
-
/* @__PURE__ */ (0,
|
|
12188
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
|
|
11636
12189
|
Calendar3,
|
|
11637
12190
|
{
|
|
11638
12191
|
mode: "single",
|
|
@@ -11645,9 +12198,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11645
12198
|
] })
|
|
11646
12199
|
] })
|
|
11647
12200
|
] }),
|
|
11648
|
-
/* @__PURE__ */ (0,
|
|
11649
|
-
/* @__PURE__ */ (0,
|
|
11650
|
-
/* @__PURE__ */ (0,
|
|
12201
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsxs)("div", { className: "flex justify-end gap-3 pt-4", children: [
|
|
12202
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(Button, { type: "button", variant: "outline", onClick: handleClose, children: "Cancel" }),
|
|
12203
|
+
/* @__PURE__ */ (0, import_jsx_runtime67.jsx)(
|
|
11651
12204
|
Button,
|
|
11652
12205
|
{
|
|
11653
12206
|
type: "submit",
|
|
@@ -11661,7 +12214,7 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
11661
12214
|
};
|
|
11662
12215
|
|
|
11663
12216
|
// src/components/Projects/PlanningView.tsx
|
|
11664
|
-
var
|
|
12217
|
+
var import_jsx_runtime68 = require("react/jsx-runtime");
|
|
11665
12218
|
var PlanningView = ({
|
|
11666
12219
|
tasks,
|
|
11667
12220
|
epics,
|
|
@@ -11672,25 +12225,25 @@ var PlanningView = ({
|
|
|
11672
12225
|
onUpdateSprint,
|
|
11673
12226
|
onDeleteSprint
|
|
11674
12227
|
}) => {
|
|
11675
|
-
const [selectedSprintIds, setSelectedSprintIds] = (0,
|
|
11676
|
-
const [collapsedEpics, setCollapsedEpics] = (0,
|
|
11677
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
11678
|
-
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0,
|
|
11679
|
-
const [dragOverTarget, setDragOverTarget] = (0,
|
|
11680
|
-
const [editingSprintId, setEditingSprintId] = (0,
|
|
11681
|
-
const [sprintEditForm, setSprintEditForm] = (0,
|
|
12228
|
+
const [selectedSprintIds, setSelectedSprintIds] = (0, import_react51.useState)([]);
|
|
12229
|
+
const [collapsedEpics, setCollapsedEpics] = (0, import_react51.useState)(/* @__PURE__ */ new Set());
|
|
12230
|
+
const [draggedTask, setDraggedTask] = (0, import_react51.useState)(null);
|
|
12231
|
+
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0, import_react51.useState)(false);
|
|
12232
|
+
const [dragOverTarget, setDragOverTarget] = (0, import_react51.useState)(null);
|
|
12233
|
+
const [editingSprintId, setEditingSprintId] = (0, import_react51.useState)(null);
|
|
12234
|
+
const [sprintEditForm, setSprintEditForm] = (0, import_react51.useState)({
|
|
11682
12235
|
name: "",
|
|
11683
12236
|
description: "",
|
|
11684
12237
|
startDate: "",
|
|
11685
12238
|
endDate: ""
|
|
11686
12239
|
});
|
|
11687
|
-
const [availableSprints, setAvailableSprints] = (0,
|
|
11688
|
-
const [sprintFilter, setSprintFilter] = (0,
|
|
11689
|
-
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0,
|
|
11690
|
-
const [heroHeight, setHeroHeight] = (0,
|
|
11691
|
-
const heroRef = (0,
|
|
11692
|
-
const containerRef = (0,
|
|
11693
|
-
(0,
|
|
12240
|
+
const [availableSprints, setAvailableSprints] = (0, import_react51.useState)([]);
|
|
12241
|
+
const [sprintFilter, setSprintFilter] = (0, import_react51.useState)("upcoming");
|
|
12242
|
+
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0, import_react51.useState)(false);
|
|
12243
|
+
const [heroHeight, setHeroHeight] = (0, import_react51.useState)(0);
|
|
12244
|
+
const heroRef = (0, import_react51.useRef)(null);
|
|
12245
|
+
const containerRef = (0, import_react51.useRef)(null);
|
|
12246
|
+
(0, import_react51.useEffect)(() => {
|
|
11694
12247
|
const savedSprintIds = localStorage.getItem("planningView_selectedSprints");
|
|
11695
12248
|
if (savedSprintIds) {
|
|
11696
12249
|
try {
|
|
@@ -11703,10 +12256,10 @@ var PlanningView = ({
|
|
|
11703
12256
|
}
|
|
11704
12257
|
}
|
|
11705
12258
|
}, []);
|
|
11706
|
-
(0,
|
|
12259
|
+
(0, import_react51.useEffect)(() => {
|
|
11707
12260
|
localStorage.setItem("planningView_selectedSprints", JSON.stringify(selectedSprintIds));
|
|
11708
12261
|
}, [selectedSprintIds]);
|
|
11709
|
-
(0,
|
|
12262
|
+
(0, import_react51.useEffect)(() => {
|
|
11710
12263
|
const updateHeroHeight = () => {
|
|
11711
12264
|
if (heroRef.current) {
|
|
11712
12265
|
setHeroHeight(heroRef.current.offsetHeight);
|
|
@@ -11767,7 +12320,7 @@ var PlanningView = ({
|
|
|
11767
12320
|
});
|
|
11768
12321
|
return { tasksByEpic, unassignedTasks };
|
|
11769
12322
|
};
|
|
11770
|
-
(0,
|
|
12323
|
+
(0, import_react51.useEffect)(() => {
|
|
11771
12324
|
setAvailableSprints(sprints);
|
|
11772
12325
|
}, [sprints]);
|
|
11773
12326
|
const displayedSprints = availableSprints.filter((sprint) => {
|
|
@@ -11890,7 +12443,7 @@ var PlanningView = ({
|
|
|
11890
12443
|
e.dataTransfer.setData("text/plain", task.id.toString());
|
|
11891
12444
|
handleDragStart(e, task);
|
|
11892
12445
|
};
|
|
11893
|
-
return /* @__PURE__ */ (0,
|
|
12446
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
11894
12447
|
Card,
|
|
11895
12448
|
{
|
|
11896
12449
|
className: "p-3 cursor-grab active:cursor-grabbing hover:shadow-md transition-all duration-200 border border-border bg-card hover:bg-accent/50",
|
|
@@ -11898,28 +12451,28 @@ var PlanningView = ({
|
|
|
11898
12451
|
onDragStart: handleCardDragStart,
|
|
11899
12452
|
onClick: handleCardClick,
|
|
11900
12453
|
style: { userSelect: "none" },
|
|
11901
|
-
children: /* @__PURE__ */ (0,
|
|
11902
|
-
/* @__PURE__ */ (0,
|
|
11903
|
-
/* @__PURE__ */ (0,
|
|
11904
|
-
/* @__PURE__ */ (0,
|
|
12454
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2 pointer-events-none", children: [
|
|
12455
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
12456
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h4", { className: "font-medium text-sm text-foreground line-clamp-1", children: task.name }),
|
|
12457
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Badge, { className: `text-xs ${getPriorityColor(task.priority || "medium")}`, children: task.priority?.[0]?.toUpperCase() })
|
|
11905
12458
|
] }),
|
|
11906
|
-
/* @__PURE__ */ (0,
|
|
11907
|
-
/* @__PURE__ */ (0,
|
|
11908
|
-
epic && /* @__PURE__ */ (0,
|
|
11909
|
-
/* @__PURE__ */ (0,
|
|
12459
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
|
|
12460
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-1", children: [
|
|
12461
|
+
epic && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
12462
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "text-muted-foreground truncate", children: epic?.name })
|
|
11910
12463
|
] }),
|
|
11911
|
-
/* @__PURE__ */ (0,
|
|
12464
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "text-muted-foreground", children: getDisplayName(task.assignee?.value?.name) })
|
|
11912
12465
|
] }),
|
|
11913
|
-
showSprint && sprint && /* @__PURE__ */ (0,
|
|
11914
|
-
/* @__PURE__ */ (0,
|
|
11915
|
-
/* @__PURE__ */ (0,
|
|
12466
|
+
showSprint && sprint && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
|
|
12467
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Calendar, { className: "h-3 w-3" }),
|
|
12468
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { children: sprint.name })
|
|
11916
12469
|
] })
|
|
11917
12470
|
] })
|
|
11918
12471
|
}
|
|
11919
12472
|
);
|
|
11920
12473
|
};
|
|
11921
|
-
return /* @__PURE__ */ (0,
|
|
11922
|
-
/* @__PURE__ */ (0,
|
|
12474
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { ref: containerRef, className: "h-full flex flex-col px-2 md:px-4 py-4", children: [
|
|
12475
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
11923
12476
|
DashboardHero,
|
|
11924
12477
|
{
|
|
11925
12478
|
title: "Sprint Planning",
|
|
@@ -11931,7 +12484,7 @@ var PlanningView = ({
|
|
|
11931
12484
|
}
|
|
11932
12485
|
}
|
|
11933
12486
|
) }),
|
|
11934
|
-
/* @__PURE__ */ (0,
|
|
12487
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
11935
12488
|
"div",
|
|
11936
12489
|
{
|
|
11937
12490
|
className: "h-full",
|
|
@@ -11939,30 +12492,30 @@ var PlanningView = ({
|
|
|
11939
12492
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
11940
12493
|
},
|
|
11941
12494
|
children: [
|
|
11942
|
-
/* @__PURE__ */ (0,
|
|
11943
|
-
/* @__PURE__ */ (0,
|
|
11944
|
-
/* @__PURE__ */ (0,
|
|
11945
|
-
/* @__PURE__ */ (0,
|
|
11946
|
-
/* @__PURE__ */ (0,
|
|
11947
|
-
/* @__PURE__ */ (0,
|
|
12495
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "mb-4", children: [
|
|
12496
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
12497
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
12498
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { children: [
|
|
12499
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Sprint Board" }),
|
|
12500
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
11948
12501
|
selectedSprintIds?.length,
|
|
11949
12502
|
"/3 selected"
|
|
11950
12503
|
] })
|
|
11951
12504
|
] }),
|
|
11952
|
-
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0,
|
|
11953
|
-
/* @__PURE__ */ (0,
|
|
11954
|
-
/* @__PURE__ */ (0,
|
|
12505
|
+
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
12506
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
12507
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleSprints.map((sprint) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
11955
12508
|
"div",
|
|
11956
12509
|
{
|
|
11957
12510
|
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
11958
12511
|
children: [
|
|
11959
|
-
/* @__PURE__ */ (0,
|
|
11960
|
-
/* @__PURE__ */ (0,
|
|
12512
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "max-w-[80px] truncate", children: sprint.name }),
|
|
12513
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
11961
12514
|
"button",
|
|
11962
12515
|
{
|
|
11963
12516
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
11964
12517
|
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
11965
|
-
children: /* @__PURE__ */ (0,
|
|
12518
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.X, { className: "h-4 w-4" })
|
|
11966
12519
|
}
|
|
11967
12520
|
)
|
|
11968
12521
|
]
|
|
@@ -11971,20 +12524,20 @@ var PlanningView = ({
|
|
|
11971
12524
|
)) })
|
|
11972
12525
|
] })
|
|
11973
12526
|
] }),
|
|
11974
|
-
/* @__PURE__ */ (0,
|
|
11975
|
-
/* @__PURE__ */ (0,
|
|
12527
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
12528
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
11976
12529
|
Button,
|
|
11977
12530
|
{
|
|
11978
12531
|
onClick: () => setIsAddSprintModalOpen(true),
|
|
11979
12532
|
className: "bg-primary hover:bg-primary/90 text-primary-foreground gap-1",
|
|
11980
12533
|
size: "sm",
|
|
11981
12534
|
children: [
|
|
11982
|
-
/* @__PURE__ */ (0,
|
|
12535
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Plus, { className: "h-3 w-3" }),
|
|
11983
12536
|
"Add"
|
|
11984
12537
|
]
|
|
11985
12538
|
}
|
|
11986
12539
|
),
|
|
11987
|
-
/* @__PURE__ */ (0,
|
|
12540
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
11988
12541
|
Button,
|
|
11989
12542
|
{
|
|
11990
12543
|
onClick: () => setIsSprintSelectorOpen(!isSprintSelectorOpen),
|
|
@@ -11992,43 +12545,43 @@ var PlanningView = ({
|
|
|
11992
12545
|
size: "sm",
|
|
11993
12546
|
className: "gap-1",
|
|
11994
12547
|
children: [
|
|
11995
|
-
/* @__PURE__ */ (0,
|
|
12548
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Calendar, { className: "h-3 w-3" }),
|
|
11996
12549
|
isSprintSelectorOpen ? "Close" : "Select"
|
|
11997
12550
|
]
|
|
11998
12551
|
}
|
|
11999
12552
|
)
|
|
12000
12553
|
] })
|
|
12001
12554
|
] }) }),
|
|
12002
|
-
isSprintSelectorOpen && /* @__PURE__ */ (0,
|
|
12555
|
+
isSprintSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12003
12556
|
"div",
|
|
12004
12557
|
{
|
|
12005
12558
|
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
12006
12559
|
onClick: () => setIsSprintSelectorOpen(false)
|
|
12007
12560
|
}
|
|
12008
12561
|
),
|
|
12009
|
-
/* @__PURE__ */ (0,
|
|
12562
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12010
12563
|
"div",
|
|
12011
12564
|
{
|
|
12012
12565
|
className: `fixed top-0 right-0 h-full w-80 bg-background border-l shadow-xl z-10 transition-all duration-300 ease-in-out ${isSprintSelectorOpen ? "translate-x-0 opacity-100 visible" : "translate-x-full opacity-0 invisible"}`,
|
|
12013
|
-
children: /* @__PURE__ */ (0,
|
|
12014
|
-
/* @__PURE__ */ (0,
|
|
12015
|
-
/* @__PURE__ */ (0,
|
|
12016
|
-
/* @__PURE__ */ (0,
|
|
12017
|
-
/* @__PURE__ */ (0,
|
|
12566
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
12567
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
12568
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
12569
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Sprints" }),
|
|
12570
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12018
12571
|
Button,
|
|
12019
12572
|
{
|
|
12020
12573
|
variant: "ghost",
|
|
12021
12574
|
size: "sm",
|
|
12022
12575
|
onClick: () => setIsSprintSelectorOpen(false),
|
|
12023
12576
|
className: "h-8 w-8 p-0",
|
|
12024
|
-
children: /* @__PURE__ */ (0,
|
|
12577
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.X, { className: "h-4 w-4" })
|
|
12025
12578
|
}
|
|
12026
12579
|
)
|
|
12027
12580
|
] }),
|
|
12028
|
-
/* @__PURE__ */ (0,
|
|
12581
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Choose up to 3 sprints to view in your planning board" })
|
|
12029
12582
|
] }),
|
|
12030
|
-
/* @__PURE__ */ (0,
|
|
12031
|
-
/* @__PURE__ */ (0,
|
|
12583
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: [
|
|
12584
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex gap-1 mb-4 bg-muted p-1 rounded-lg", children: [
|
|
12032
12585
|
{ key: "all", label: "All", count: sprints.length },
|
|
12033
12586
|
{
|
|
12034
12587
|
key: "active",
|
|
@@ -12040,7 +12593,7 @@ var PlanningView = ({
|
|
|
12040
12593
|
label: "Upcoming"
|
|
12041
12594
|
// count: sprints.filter((s) => !s.isActive).length,
|
|
12042
12595
|
}
|
|
12043
|
-
].map((filter) => /* @__PURE__ */ (0,
|
|
12596
|
+
].map((filter) => /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12044
12597
|
Button,
|
|
12045
12598
|
{
|
|
12046
12599
|
variant: sprintFilter === filter.key ? "default" : "outline",
|
|
@@ -12056,18 +12609,18 @@ var PlanningView = ({
|
|
|
12056
12609
|
},
|
|
12057
12610
|
filter.key
|
|
12058
12611
|
)) }),
|
|
12059
|
-
/* @__PURE__ */ (0,
|
|
12612
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto", children: displayedSprints.length > 0 ? displayedSprints.map((sprint) => {
|
|
12060
12613
|
const isSelected = selectedSprintIds.includes(sprint.id.toString());
|
|
12061
12614
|
const taskCount = tasks.filter(
|
|
12062
12615
|
(task) => extractId(task.sprint) === sprint.id
|
|
12063
12616
|
).length;
|
|
12064
12617
|
const canSelect = !isSelected && selectedSprintIds.length < 3;
|
|
12065
|
-
return /* @__PURE__ */ (0,
|
|
12618
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12066
12619
|
"div",
|
|
12067
12620
|
{
|
|
12068
12621
|
className: `p-3 rounded-lg border transition-all ${isSelected ? "bg-primary/10 border-primary/30" : canSelect ? "bg-card border-border hover:border-primary/50" : "bg-muted/30 border-border/30 opacity-60"}`,
|
|
12069
|
-
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0,
|
|
12070
|
-
/* @__PURE__ */ (0,
|
|
12622
|
+
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-3", children: [
|
|
12623
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12071
12624
|
Input,
|
|
12072
12625
|
{
|
|
12073
12626
|
value: sprintEditForm.name,
|
|
@@ -12076,7 +12629,7 @@ var PlanningView = ({
|
|
|
12076
12629
|
placeholder: "Sprint name"
|
|
12077
12630
|
}
|
|
12078
12631
|
),
|
|
12079
|
-
/* @__PURE__ */ (0,
|
|
12632
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12080
12633
|
Textarea,
|
|
12081
12634
|
{
|
|
12082
12635
|
value: sprintEditForm.description,
|
|
@@ -12088,10 +12641,10 @@ var PlanningView = ({
|
|
|
12088
12641
|
placeholder: "Sprint description"
|
|
12089
12642
|
}
|
|
12090
12643
|
),
|
|
12091
|
-
/* @__PURE__ */ (0,
|
|
12092
|
-
/* @__PURE__ */ (0,
|
|
12093
|
-
/* @__PURE__ */ (0,
|
|
12094
|
-
/* @__PURE__ */ (0,
|
|
12644
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
12645
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { children: [
|
|
12646
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "Start Date" }),
|
|
12647
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12095
12648
|
Input,
|
|
12096
12649
|
{
|
|
12097
12650
|
type: "date",
|
|
@@ -12104,9 +12657,9 @@ var PlanningView = ({
|
|
|
12104
12657
|
}
|
|
12105
12658
|
)
|
|
12106
12659
|
] }),
|
|
12107
|
-
/* @__PURE__ */ (0,
|
|
12108
|
-
/* @__PURE__ */ (0,
|
|
12109
|
-
/* @__PURE__ */ (0,
|
|
12660
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { children: [
|
|
12661
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "End Date" }),
|
|
12662
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12110
12663
|
Input,
|
|
12111
12664
|
{
|
|
12112
12665
|
type: "date",
|
|
@@ -12120,20 +12673,20 @@ var PlanningView = ({
|
|
|
12120
12673
|
)
|
|
12121
12674
|
] })
|
|
12122
12675
|
] }),
|
|
12123
|
-
/* @__PURE__ */ (0,
|
|
12124
|
-
/* @__PURE__ */ (0,
|
|
12676
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex gap-2", children: [
|
|
12677
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12125
12678
|
Button,
|
|
12126
12679
|
{
|
|
12127
12680
|
size: "sm",
|
|
12128
12681
|
onClick: () => handleSprintEditSave(),
|
|
12129
12682
|
className: "flex-1",
|
|
12130
12683
|
children: [
|
|
12131
|
-
/* @__PURE__ */ (0,
|
|
12684
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Check, { className: "h-3 w-3 mr-1" }),
|
|
12132
12685
|
"Save"
|
|
12133
12686
|
]
|
|
12134
12687
|
}
|
|
12135
12688
|
),
|
|
12136
|
-
/* @__PURE__ */ (0,
|
|
12689
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12137
12690
|
Button,
|
|
12138
12691
|
{
|
|
12139
12692
|
size: "sm",
|
|
@@ -12141,18 +12694,18 @@ var PlanningView = ({
|
|
|
12141
12694
|
onClick: handleSprintEditCancel,
|
|
12142
12695
|
className: "flex-1",
|
|
12143
12696
|
children: [
|
|
12144
|
-
/* @__PURE__ */ (0,
|
|
12697
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.X, { className: "h-3 w-3 mr-1" }),
|
|
12145
12698
|
"Cancel"
|
|
12146
12699
|
]
|
|
12147
12700
|
}
|
|
12148
12701
|
)
|
|
12149
12702
|
] })
|
|
12150
|
-
] }) : /* @__PURE__ */ (0,
|
|
12151
|
-
/* @__PURE__ */ (0,
|
|
12152
|
-
/* @__PURE__ */ (0,
|
|
12153
|
-
/* @__PURE__ */ (0,
|
|
12154
|
-
/* @__PURE__ */ (0,
|
|
12155
|
-
isSprintActive(sprint) && /* @__PURE__ */ (0,
|
|
12703
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { children: [
|
|
12704
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
12705
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
12706
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
12707
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h4", { className: "font-medium text-sm text-foreground truncate", children: sprint.name }),
|
|
12708
|
+
isSprintActive(sprint) && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12156
12709
|
Badge,
|
|
12157
12710
|
{
|
|
12158
12711
|
variant: "default",
|
|
@@ -12161,43 +12714,43 @@ var PlanningView = ({
|
|
|
12161
12714
|
}
|
|
12162
12715
|
)
|
|
12163
12716
|
] }),
|
|
12164
|
-
/* @__PURE__ */ (0,
|
|
12165
|
-
/* @__PURE__ */ (0,
|
|
12166
|
-
/* @__PURE__ */ (0,
|
|
12167
|
-
/* @__PURE__ */ (0,
|
|
12717
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "text-xs text-muted-foreground line-clamp-2 mb-2", children: sprint.description }),
|
|
12718
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
|
|
12719
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
12720
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.CalendarDays, { className: "h-3 w-3" }),
|
|
12168
12721
|
new Date(sprint.startDate).toLocaleDateString()
|
|
12169
12722
|
] }),
|
|
12170
|
-
/* @__PURE__ */ (0,
|
|
12171
|
-
/* @__PURE__ */ (0,
|
|
12723
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
12724
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.User, { className: "h-3 w-3" }),
|
|
12172
12725
|
taskCount,
|
|
12173
12726
|
" tasks"
|
|
12174
12727
|
] })
|
|
12175
12728
|
] })
|
|
12176
12729
|
] }),
|
|
12177
|
-
/* @__PURE__ */ (0,
|
|
12178
|
-
/* @__PURE__ */ (0,
|
|
12730
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-1 ml-2", children: [
|
|
12731
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12179
12732
|
Button,
|
|
12180
12733
|
{
|
|
12181
12734
|
size: "sm",
|
|
12182
12735
|
variant: "ghost",
|
|
12183
12736
|
onClick: () => handleSprintEditStart(sprint),
|
|
12184
12737
|
className: "h-6 w-6 p-0",
|
|
12185
|
-
children: /* @__PURE__ */ (0,
|
|
12738
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Edit2, { className: "h-3 w-3" })
|
|
12186
12739
|
}
|
|
12187
12740
|
),
|
|
12188
|
-
/* @__PURE__ */ (0,
|
|
12741
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12189
12742
|
Button,
|
|
12190
12743
|
{
|
|
12191
12744
|
size: "sm",
|
|
12192
12745
|
variant: "ghost",
|
|
12193
12746
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
12194
12747
|
className: "h-6 w-6 p-0 text-destructive hover:text-destructive",
|
|
12195
|
-
children: /* @__PURE__ */ (0,
|
|
12748
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Trash2, { className: "h-3 w-3" })
|
|
12196
12749
|
}
|
|
12197
12750
|
)
|
|
12198
12751
|
] })
|
|
12199
12752
|
] }),
|
|
12200
|
-
/* @__PURE__ */ (0,
|
|
12753
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex items-center justify-between mt-2", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12201
12754
|
Button,
|
|
12202
12755
|
{
|
|
12203
12756
|
variant: isSelected ? "default" : "outline",
|
|
@@ -12205,21 +12758,21 @@ var PlanningView = ({
|
|
|
12205
12758
|
className: "text-xs w-full h-8 flex items-center justify-center cursor-pointer",
|
|
12206
12759
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
12207
12760
|
disabled: !isSelected && selectedSprintIds?.length >= 3,
|
|
12208
|
-
children: /* @__PURE__ */ (0,
|
|
12761
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "pointer-events-none select-none", children: isSelected ? "Deselect" : selectedSprintIds?.length >= 3 ? "Limit Reached" : "Select" })
|
|
12209
12762
|
}
|
|
12210
12763
|
) })
|
|
12211
12764
|
] })
|
|
12212
12765
|
},
|
|
12213
12766
|
sprint.id
|
|
12214
12767
|
);
|
|
12215
|
-
}) : /* @__PURE__ */ (0,
|
|
12216
|
-
/* @__PURE__ */ (0,
|
|
12217
|
-
/* @__PURE__ */ (0,
|
|
12768
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "text-center py-8 text-muted-foreground", children: [
|
|
12769
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Calendar, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
|
|
12770
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("p", { className: "text-sm", children: [
|
|
12218
12771
|
'No sprints found for "',
|
|
12219
12772
|
sprintFilter,
|
|
12220
12773
|
'" filter'
|
|
12221
12774
|
] }),
|
|
12222
|
-
/* @__PURE__ */ (0,
|
|
12775
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12223
12776
|
Button,
|
|
12224
12777
|
{
|
|
12225
12778
|
variant: "link",
|
|
@@ -12230,18 +12783,18 @@ var PlanningView = ({
|
|
|
12230
12783
|
}
|
|
12231
12784
|
)
|
|
12232
12785
|
] }) }),
|
|
12233
|
-
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0,
|
|
12234
|
-
/* @__PURE__ */ (0,
|
|
12235
|
-
/* @__PURE__ */ (0,
|
|
12236
|
-
/* @__PURE__ */ (0,
|
|
12786
|
+
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "mt-4 p-4 bg-muted/50 rounded-lg border-2 border-dashed border-border", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "text-center", children: [
|
|
12787
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Calendar, { className: "h-6 w-6 mx-auto mb-2 text-muted-foreground" }),
|
|
12788
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "text-sm text-muted-foreground font-medium", children: "Select sprints to start planning" }),
|
|
12789
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("p", { className: "text-xs text-muted-foreground mt-1", children: "Choose up to 3 sprints to view alongside your backlog" })
|
|
12237
12790
|
] }) })
|
|
12238
12791
|
] })
|
|
12239
12792
|
] })
|
|
12240
12793
|
}
|
|
12241
12794
|
)
|
|
12242
12795
|
] }),
|
|
12243
|
-
/* @__PURE__ */ (0,
|
|
12244
|
-
/* @__PURE__ */ (0,
|
|
12796
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-4 gap-6 h-full flex-1 min-h-0", children: [
|
|
12797
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "lg:col-span-1", children: /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12245
12798
|
Card,
|
|
12246
12799
|
{
|
|
12247
12800
|
className: "p-4 h-full bg-card border-l-4 border-l-gray-400 shadow-sm hover:shadow-md transition-shadow duration-200 flex flex-col",
|
|
@@ -12253,78 +12806,78 @@ var PlanningView = ({
|
|
|
12253
12806
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
12254
12807
|
},
|
|
12255
12808
|
children: [
|
|
12256
|
-
/* @__PURE__ */ (0,
|
|
12257
|
-
/* @__PURE__ */ (0,
|
|
12258
|
-
/* @__PURE__ */ (0,
|
|
12259
|
-
/* @__PURE__ */ (0,
|
|
12809
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
12810
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: "Backlog" }),
|
|
12811
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
12812
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(Badge, { variant: "secondary", className: "bg-muted text-muted-foreground", children: [
|
|
12260
12813
|
backlogTasks?.length,
|
|
12261
12814
|
" tasks"
|
|
12262
12815
|
] }),
|
|
12263
|
-
/* @__PURE__ */ (0,
|
|
12816
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(Badge, { variant: "outline", className: "bg-gray-50 text-gray-700 border-gray-200", children: [
|
|
12264
12817
|
backlogStoryPoints,
|
|
12265
12818
|
" pts"
|
|
12266
12819
|
] })
|
|
12267
12820
|
] })
|
|
12268
12821
|
] }),
|
|
12269
|
-
/* @__PURE__ */ (0,
|
|
12822
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12270
12823
|
"div",
|
|
12271
12824
|
{
|
|
12272
12825
|
className: `flex-1 overflow-y-auto space-y-3 min-h-0 p-3 rounded transition-colors ${dragOverTarget === "backlog" ? "bg-primary/10" : ""}`,
|
|
12273
12826
|
children: (() => {
|
|
12274
12827
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(backlogTasks);
|
|
12275
|
-
return /* @__PURE__ */ (0,
|
|
12828
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
|
|
12276
12829
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
12277
12830
|
const epic = getEpicById(epicId);
|
|
12278
12831
|
if (!epic) return null;
|
|
12279
12832
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
12280
|
-
return /* @__PURE__ */ (0,
|
|
12281
|
-
/* @__PURE__ */ (0,
|
|
12833
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2", children: [
|
|
12834
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12282
12835
|
"div",
|
|
12283
12836
|
{
|
|
12284
12837
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
12285
12838
|
onClick: () => toggleEpicCollapse(epicId),
|
|
12286
12839
|
children: [
|
|
12287
|
-
/* @__PURE__ */ (0,
|
|
12288
|
-
/* @__PURE__ */ (0,
|
|
12289
|
-
/* @__PURE__ */ (0,
|
|
12840
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
12841
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
12842
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
12290
12843
|
"(",
|
|
12291
12844
|
epicTasks?.length,
|
|
12292
12845
|
")"
|
|
12293
12846
|
] }),
|
|
12294
|
-
/* @__PURE__ */ (0,
|
|
12847
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
12295
12848
|
]
|
|
12296
12849
|
}
|
|
12297
12850
|
),
|
|
12298
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
12851
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
12299
12852
|
] }, epicId);
|
|
12300
12853
|
}),
|
|
12301
12854
|
unassignedTasks?.length > 0 && (() => {
|
|
12302
12855
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
12303
|
-
return /* @__PURE__ */ (0,
|
|
12304
|
-
/* @__PURE__ */ (0,
|
|
12856
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2", children: [
|
|
12857
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12305
12858
|
"div",
|
|
12306
12859
|
{
|
|
12307
12860
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
12308
12861
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
12309
12862
|
children: [
|
|
12310
|
-
/* @__PURE__ */ (0,
|
|
12311
|
-
/* @__PURE__ */ (0,
|
|
12312
|
-
/* @__PURE__ */ (0,
|
|
12863
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
12864
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
12865
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
12313
12866
|
"(",
|
|
12314
12867
|
unassignedTasks?.length,
|
|
12315
12868
|
")"
|
|
12316
12869
|
] }),
|
|
12317
|
-
/* @__PURE__ */ (0,
|
|
12870
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
12318
12871
|
]
|
|
12319
12872
|
}
|
|
12320
12873
|
),
|
|
12321
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
12874
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
12322
12875
|
] });
|
|
12323
12876
|
})(),
|
|
12324
|
-
backlogTasks?.length === 0 && /* @__PURE__ */ (0,
|
|
12325
|
-
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0,
|
|
12326
|
-
/* @__PURE__ */ (0,
|
|
12327
|
-
backlogTasks?.map((task) => /* @__PURE__ */ (0,
|
|
12877
|
+
backlogTasks?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex items-center justify-center h-32 text-muted-foreground text-sm select-none", children: "Drop tasks here to move to backlog" }),
|
|
12878
|
+
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2", children: [
|
|
12879
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "text-xs text-muted-foreground mb-2", children: "Direct backlog tasks:" }),
|
|
12880
|
+
backlogTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CompactTaskCard, { task }, task.id))
|
|
12328
12881
|
] })
|
|
12329
12882
|
] });
|
|
12330
12883
|
})()
|
|
@@ -12341,7 +12894,7 @@ var PlanningView = ({
|
|
|
12341
12894
|
(sum, task) => sum + (task?.storyPoints || 0),
|
|
12342
12895
|
0
|
|
12343
12896
|
);
|
|
12344
|
-
return /* @__PURE__ */ (0,
|
|
12897
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12345
12898
|
Card,
|
|
12346
12899
|
{
|
|
12347
12900
|
className: "p-4 h-full bg-card border-l-4 border-l-blue-500 shadow-sm hover:shadow-md transition-shadow duration-200 flex flex-col",
|
|
@@ -12353,10 +12906,10 @@ var PlanningView = ({
|
|
|
12353
12906
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
12354
12907
|
},
|
|
12355
12908
|
children: [
|
|
12356
|
-
/* @__PURE__ */ (0,
|
|
12357
|
-
/* @__PURE__ */ (0,
|
|
12358
|
-
/* @__PURE__ */ (0,
|
|
12359
|
-
/* @__PURE__ */ (0,
|
|
12909
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
12910
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: sprint.name }) }),
|
|
12911
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
12912
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12360
12913
|
Badge,
|
|
12361
12914
|
{
|
|
12362
12915
|
variant: "secondary",
|
|
@@ -12367,7 +12920,7 @@ var PlanningView = ({
|
|
|
12367
12920
|
]
|
|
12368
12921
|
}
|
|
12369
12922
|
),
|
|
12370
|
-
/* @__PURE__ */ (0,
|
|
12923
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12371
12924
|
Badge,
|
|
12372
12925
|
{
|
|
12373
12926
|
variant: "outline",
|
|
@@ -12378,7 +12931,7 @@ var PlanningView = ({
|
|
|
12378
12931
|
]
|
|
12379
12932
|
}
|
|
12380
12933
|
),
|
|
12381
|
-
/* @__PURE__ */ (0,
|
|
12934
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12382
12935
|
Button,
|
|
12383
12936
|
{
|
|
12384
12937
|
size: "sm",
|
|
@@ -12388,73 +12941,73 @@ var PlanningView = ({
|
|
|
12388
12941
|
handleSprintEditStart(sprint);
|
|
12389
12942
|
},
|
|
12390
12943
|
className: "h-6 px-2",
|
|
12391
|
-
children: /* @__PURE__ */ (0,
|
|
12944
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Edit2, { className: "h-3 w-3" })
|
|
12392
12945
|
}
|
|
12393
12946
|
),
|
|
12394
|
-
/* @__PURE__ */ (0,
|
|
12947
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12395
12948
|
Button,
|
|
12396
12949
|
{
|
|
12397
12950
|
size: "sm",
|
|
12398
12951
|
variant: "ghost",
|
|
12399
12952
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
12400
12953
|
className: "h-6 px-2 text-destructive hover:text-destructive",
|
|
12401
|
-
children: /* @__PURE__ */ (0,
|
|
12954
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.Trash2, { className: "h-3 w-3" })
|
|
12402
12955
|
}
|
|
12403
12956
|
)
|
|
12404
12957
|
] })
|
|
12405
12958
|
] }),
|
|
12406
|
-
/* @__PURE__ */ (0,
|
|
12959
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex-1 overflow-y-auto space-y-3 min-h-0", children: (() => {
|
|
12407
12960
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(sprintTasksFiltered);
|
|
12408
|
-
return /* @__PURE__ */ (0,
|
|
12961
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(import_jsx_runtime68.Fragment, { children: [
|
|
12409
12962
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
12410
12963
|
const epic = getEpicById(epicId);
|
|
12411
12964
|
if (!epic) return null;
|
|
12412
12965
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
12413
|
-
return /* @__PURE__ */ (0,
|
|
12414
|
-
/* @__PURE__ */ (0,
|
|
12966
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2", children: [
|
|
12967
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12415
12968
|
"div",
|
|
12416
12969
|
{
|
|
12417
12970
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
12418
12971
|
onClick: () => toggleEpicCollapse(epicId),
|
|
12419
12972
|
children: [
|
|
12420
|
-
/* @__PURE__ */ (0,
|
|
12421
|
-
/* @__PURE__ */ (0,
|
|
12422
|
-
/* @__PURE__ */ (0,
|
|
12973
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
12974
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
12975
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
12423
12976
|
"(",
|
|
12424
12977
|
epicTasks?.length,
|
|
12425
12978
|
")"
|
|
12426
12979
|
] }),
|
|
12427
|
-
/* @__PURE__ */ (0,
|
|
12980
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
12428
12981
|
]
|
|
12429
12982
|
}
|
|
12430
12983
|
),
|
|
12431
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
12984
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
12432
12985
|
] }, epicId);
|
|
12433
12986
|
}),
|
|
12434
12987
|
unassignedTasks?.length > 0 && (() => {
|
|
12435
12988
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
12436
|
-
return /* @__PURE__ */ (0,
|
|
12437
|
-
/* @__PURE__ */ (0,
|
|
12989
|
+
return /* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("div", { className: "space-y-2", children: [
|
|
12990
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)(
|
|
12438
12991
|
"div",
|
|
12439
12992
|
{
|
|
12440
12993
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
12441
12994
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
12442
12995
|
children: [
|
|
12443
|
-
/* @__PURE__ */ (0,
|
|
12444
|
-
/* @__PURE__ */ (0,
|
|
12445
|
-
/* @__PURE__ */ (0,
|
|
12996
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
12997
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
12998
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
12446
12999
|
"(",
|
|
12447
13000
|
unassignedTasks?.length,
|
|
12448
13001
|
")"
|
|
12449
13002
|
] }),
|
|
12450
|
-
/* @__PURE__ */ (0,
|
|
13003
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(import_lucide_react38.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
12451
13004
|
]
|
|
12452
13005
|
}
|
|
12453
13006
|
),
|
|
12454
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
13007
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime68.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
12455
13008
|
] });
|
|
12456
13009
|
})(),
|
|
12457
|
-
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0,
|
|
13010
|
+
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime68.jsx)("div", { className: "flex items-center justify-center h-32 text-muted-foreground text-sm select-none", children: "Drop tasks here" })
|
|
12458
13011
|
] });
|
|
12459
13012
|
})() })
|
|
12460
13013
|
]
|
|
@@ -12463,7 +13016,7 @@ var PlanningView = ({
|
|
|
12463
13016
|
);
|
|
12464
13017
|
})
|
|
12465
13018
|
] }),
|
|
12466
|
-
/* @__PURE__ */ (0,
|
|
13019
|
+
/* @__PURE__ */ (0, import_jsx_runtime68.jsx)(
|
|
12467
13020
|
AddSprintModal,
|
|
12468
13021
|
{
|
|
12469
13022
|
isOpen: isAddSprintModalOpen,
|
|
@@ -12478,9 +13031,9 @@ var PlanningView = ({
|
|
|
12478
13031
|
};
|
|
12479
13032
|
|
|
12480
13033
|
// src/components/Projects/TasksView.tsx
|
|
12481
|
-
var
|
|
12482
|
-
var
|
|
12483
|
-
var
|
|
13034
|
+
var import_react52 = require("react");
|
|
13035
|
+
var import_lucide_react39 = require("lucide-react");
|
|
13036
|
+
var import_jsx_runtime69 = require("react/jsx-runtime");
|
|
12484
13037
|
var formatDate = (date) => {
|
|
12485
13038
|
return date.toLocaleDateString("en-US", {
|
|
12486
13039
|
weekday: "short",
|
|
@@ -12518,7 +13071,7 @@ var isTomorrow = (date) => {
|
|
|
12518
13071
|
return date.toDateString() === tomorrow.toDateString();
|
|
12519
13072
|
};
|
|
12520
13073
|
var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
12521
|
-
const [formData, setFormData] = (0,
|
|
13074
|
+
const [formData, setFormData] = (0, import_react52.useState)({
|
|
12522
13075
|
title: "",
|
|
12523
13076
|
description: "",
|
|
12524
13077
|
dueDate: "",
|
|
@@ -12532,7 +13085,7 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12532
13085
|
reminderMinutes: 15,
|
|
12533
13086
|
tags: ""
|
|
12534
13087
|
});
|
|
12535
|
-
const [isColleagueError, setIsColleagueError] = (0,
|
|
13088
|
+
const [isColleagueError, setIsColleagueError] = (0, import_react52.useState)(false);
|
|
12536
13089
|
const handleSubmit = (e) => {
|
|
12537
13090
|
e.preventDefault();
|
|
12538
13091
|
const colleague = colleagues.find((c) => c?.id.toString() === formData.colleagueId.toString());
|
|
@@ -12577,18 +13130,18 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12577
13130
|
tags: ""
|
|
12578
13131
|
});
|
|
12579
13132
|
};
|
|
12580
|
-
(0,
|
|
13133
|
+
(0, import_react52.useEffect)(() => {
|
|
12581
13134
|
if (formData.colleagueId) {
|
|
12582
13135
|
setIsColleagueError(false);
|
|
12583
13136
|
}
|
|
12584
13137
|
}, [formData.colleagueId]);
|
|
12585
13138
|
const validColleagues = colleagues.filter(Boolean);
|
|
12586
|
-
return /* @__PURE__ */ (0,
|
|
12587
|
-
/* @__PURE__ */ (0,
|
|
12588
|
-
/* @__PURE__ */ (0,
|
|
12589
|
-
/* @__PURE__ */ (0,
|
|
12590
|
-
/* @__PURE__ */ (0,
|
|
12591
|
-
/* @__PURE__ */ (0,
|
|
13139
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
13140
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(DialogTitle, { children: "Add New Reminder" }) }),
|
|
13141
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
13142
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13143
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "title", children: "Title" }),
|
|
13144
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12592
13145
|
Input,
|
|
12593
13146
|
{
|
|
12594
13147
|
id: "title",
|
|
@@ -12599,9 +13152,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12599
13152
|
}
|
|
12600
13153
|
)
|
|
12601
13154
|
] }) }),
|
|
12602
|
-
/* @__PURE__ */ (0,
|
|
12603
|
-
/* @__PURE__ */ (0,
|
|
12604
|
-
/* @__PURE__ */ (0,
|
|
13155
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13156
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "description", children: "Description" }),
|
|
13157
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12605
13158
|
Textarea,
|
|
12606
13159
|
{
|
|
12607
13160
|
id: "description",
|
|
@@ -12612,10 +13165,10 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12612
13165
|
}
|
|
12613
13166
|
)
|
|
12614
13167
|
] }),
|
|
12615
|
-
/* @__PURE__ */ (0,
|
|
12616
|
-
/* @__PURE__ */ (0,
|
|
12617
|
-
/* @__PURE__ */ (0,
|
|
12618
|
-
/* @__PURE__ */ (0,
|
|
13168
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
13169
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13170
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "dueDate", children: "Due Date" }),
|
|
13171
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12619
13172
|
Input,
|
|
12620
13173
|
{
|
|
12621
13174
|
id: "dueDate",
|
|
@@ -12626,9 +13179,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12626
13179
|
}
|
|
12627
13180
|
)
|
|
12628
13181
|
] }),
|
|
12629
|
-
/* @__PURE__ */ (0,
|
|
12630
|
-
/* @__PURE__ */ (0,
|
|
12631
|
-
/* @__PURE__ */ (0,
|
|
13182
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13183
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "dueTime", children: "Due Time (optional)" }),
|
|
13184
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12632
13185
|
Input,
|
|
12633
13186
|
{
|
|
12634
13187
|
id: "dueTime",
|
|
@@ -12639,9 +13192,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12639
13192
|
)
|
|
12640
13193
|
] })
|
|
12641
13194
|
] }),
|
|
12642
|
-
/* @__PURE__ */ (0,
|
|
12643
|
-
/* @__PURE__ */ (0,
|
|
12644
|
-
/* @__PURE__ */ (0,
|
|
13195
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13196
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { className: `${isColleagueError ? "text-destructive" : ""}`, htmlFor: "colleague", children: "Assigned Colleague" }),
|
|
13197
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
|
|
12645
13198
|
Select,
|
|
12646
13199
|
{
|
|
12647
13200
|
value: formData.colleagueId,
|
|
@@ -12650,11 +13203,11 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12650
13203
|
},
|
|
12651
13204
|
required: true,
|
|
12652
13205
|
children: [
|
|
12653
|
-
/* @__PURE__ */ (0,
|
|
13206
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12654
13207
|
SelectTrigger,
|
|
12655
13208
|
{
|
|
12656
13209
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
12657
|
-
children: /* @__PURE__ */ (0,
|
|
13210
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12658
13211
|
SelectValue,
|
|
12659
13212
|
{
|
|
12660
13213
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
@@ -12664,15 +13217,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12664
13217
|
)
|
|
12665
13218
|
}
|
|
12666
13219
|
),
|
|
12667
|
-
/* @__PURE__ */ (0,
|
|
13220
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectContent, { children: validColleagues.map((colleague) => /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectItem, { value: colleague.id.toString(), children: colleague.name }, colleague.id)) })
|
|
12668
13221
|
]
|
|
12669
13222
|
}
|
|
12670
13223
|
),
|
|
12671
|
-
isColleagueError && /* @__PURE__ */ (0,
|
|
13224
|
+
isColleagueError && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "text-destructive text-sm", children: "Please select a digital colleague" })
|
|
12672
13225
|
] }),
|
|
12673
|
-
/* @__PURE__ */ (0,
|
|
12674
|
-
/* @__PURE__ */ (0,
|
|
12675
|
-
/* @__PURE__ */ (0,
|
|
13226
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "space-y-2", children: [
|
|
13227
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
13228
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12676
13229
|
"input",
|
|
12677
13230
|
{
|
|
12678
13231
|
type: "checkbox",
|
|
@@ -12682,12 +13235,12 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12682
13235
|
className: "rounded border-border"
|
|
12683
13236
|
}
|
|
12684
13237
|
),
|
|
12685
|
-
/* @__PURE__ */ (0,
|
|
13238
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "isRecurring", children: "Make this a recurring reminder" })
|
|
12686
13239
|
] }),
|
|
12687
|
-
formData.isRecurring && /* @__PURE__ */ (0,
|
|
12688
|
-
/* @__PURE__ */ (0,
|
|
12689
|
-
/* @__PURE__ */ (0,
|
|
12690
|
-
/* @__PURE__ */ (0,
|
|
13240
|
+
formData.isRecurring && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "grid grid-cols-2 gap-4 pl-6", children: [
|
|
13241
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13242
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "recurrencePattern", children: "Frequency" }),
|
|
13243
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
|
|
12691
13244
|
Select,
|
|
12692
13245
|
{
|
|
12693
13246
|
value: formData.recurrencePattern,
|
|
@@ -12696,20 +13249,20 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12696
13249
|
recurrencePattern: value
|
|
12697
13250
|
}),
|
|
12698
13251
|
children: [
|
|
12699
|
-
/* @__PURE__ */ (0,
|
|
12700
|
-
/* @__PURE__ */ (0,
|
|
12701
|
-
/* @__PURE__ */ (0,
|
|
12702
|
-
/* @__PURE__ */ (0,
|
|
12703
|
-
/* @__PURE__ */ (0,
|
|
12704
|
-
/* @__PURE__ */ (0,
|
|
13252
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectTrigger, { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectValue, {}) }),
|
|
13253
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectContent, { children: [
|
|
13254
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectItem, { value: "daily", children: "Daily" }),
|
|
13255
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectItem, { value: "weekly", children: "Weekly" }),
|
|
13256
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectItem, { value: "monthly", children: "Monthly" }),
|
|
13257
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectItem, { value: "yearly", children: "Yearly" })
|
|
12705
13258
|
] })
|
|
12706
13259
|
]
|
|
12707
13260
|
}
|
|
12708
13261
|
)
|
|
12709
13262
|
] }),
|
|
12710
|
-
/* @__PURE__ */ (0,
|
|
12711
|
-
/* @__PURE__ */ (0,
|
|
12712
|
-
/* @__PURE__ */ (0,
|
|
13263
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13264
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "recurrenceInterval", children: "Every" }),
|
|
13265
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12713
13266
|
Input,
|
|
12714
13267
|
{
|
|
12715
13268
|
id: "recurrenceInterval",
|
|
@@ -12722,15 +13275,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
12722
13275
|
] })
|
|
12723
13276
|
] })
|
|
12724
13277
|
] }),
|
|
12725
|
-
/* @__PURE__ */ (0,
|
|
12726
|
-
/* @__PURE__ */ (0,
|
|
12727
|
-
/* @__PURE__ */ (0,
|
|
13278
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
13279
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Button, { type: "button", variant: "outline", onClick: () => setOpen(false), children: "Cancel" }),
|
|
13280
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Button, { type: "submit", children: "Add Reminder" })
|
|
12728
13281
|
] })
|
|
12729
13282
|
] })
|
|
12730
13283
|
] }) });
|
|
12731
13284
|
};
|
|
12732
13285
|
var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose }) => {
|
|
12733
|
-
const [formData, setFormData] = (0,
|
|
13286
|
+
const [formData, setFormData] = (0, import_react52.useState)({
|
|
12734
13287
|
title: reminder.title,
|
|
12735
13288
|
description: reminder.description,
|
|
12736
13289
|
dueDate: reminder.dueDate?.toString().split("T")[0],
|
|
@@ -12764,12 +13317,12 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12764
13317
|
onClose();
|
|
12765
13318
|
};
|
|
12766
13319
|
const validColleagues = colleagues.filter(Boolean);
|
|
12767
|
-
return /* @__PURE__ */ (0,
|
|
12768
|
-
/* @__PURE__ */ (0,
|
|
12769
|
-
/* @__PURE__ */ (0,
|
|
12770
|
-
/* @__PURE__ */ (0,
|
|
12771
|
-
/* @__PURE__ */ (0,
|
|
12772
|
-
/* @__PURE__ */ (0,
|
|
13320
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Dialog, { open, onOpenChange: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
13321
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(DialogTitle, { children: "Edit Reminder" }) }),
|
|
13322
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
13323
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13324
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "edit-title", children: "Title" }),
|
|
13325
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12773
13326
|
Input,
|
|
12774
13327
|
{
|
|
12775
13328
|
id: "edit-title",
|
|
@@ -12780,9 +13333,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12780
13333
|
}
|
|
12781
13334
|
)
|
|
12782
13335
|
] }) }),
|
|
12783
|
-
/* @__PURE__ */ (0,
|
|
12784
|
-
/* @__PURE__ */ (0,
|
|
12785
|
-
/* @__PURE__ */ (0,
|
|
13336
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13337
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "edit-description", children: "Description" }),
|
|
13338
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12786
13339
|
Textarea,
|
|
12787
13340
|
{
|
|
12788
13341
|
id: "edit-description",
|
|
@@ -12793,10 +13346,10 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12793
13346
|
}
|
|
12794
13347
|
)
|
|
12795
13348
|
] }),
|
|
12796
|
-
/* @__PURE__ */ (0,
|
|
12797
|
-
/* @__PURE__ */ (0,
|
|
12798
|
-
/* @__PURE__ */ (0,
|
|
12799
|
-
/* @__PURE__ */ (0,
|
|
13349
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
13350
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13351
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "edit-dueDate", children: "Due Date" }),
|
|
13352
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12800
13353
|
Input,
|
|
12801
13354
|
{
|
|
12802
13355
|
id: "edit-dueDate",
|
|
@@ -12807,9 +13360,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12807
13360
|
}
|
|
12808
13361
|
)
|
|
12809
13362
|
] }),
|
|
12810
|
-
/* @__PURE__ */ (0,
|
|
12811
|
-
/* @__PURE__ */ (0,
|
|
12812
|
-
/* @__PURE__ */ (0,
|
|
13363
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13364
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "edit-dueTime", children: "Due Time (optional)" }),
|
|
13365
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12813
13366
|
Input,
|
|
12814
13367
|
{
|
|
12815
13368
|
id: "edit-dueTime",
|
|
@@ -12820,8 +13373,8 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12820
13373
|
)
|
|
12821
13374
|
] })
|
|
12822
13375
|
] }),
|
|
12823
|
-
/* @__PURE__ */ (0,
|
|
12824
|
-
/* @__PURE__ */ (0,
|
|
13376
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "space-y-2", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
13377
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12825
13378
|
"input",
|
|
12826
13379
|
{
|
|
12827
13380
|
type: "checkbox",
|
|
@@ -12831,17 +13384,17 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
12831
13384
|
className: "rounded border-border"
|
|
12832
13385
|
}
|
|
12833
13386
|
),
|
|
12834
|
-
/* @__PURE__ */ (0,
|
|
13387
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Label3, { htmlFor: "edit-isRecurring", children: "Make this a recurring reminder" })
|
|
12835
13388
|
] }) }),
|
|
12836
|
-
/* @__PURE__ */ (0,
|
|
12837
|
-
/* @__PURE__ */ (0,
|
|
12838
|
-
/* @__PURE__ */ (0,
|
|
13389
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
13390
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Button, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }),
|
|
13391
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(Button, { type: "submit", children: "Save Changes" })
|
|
12839
13392
|
] })
|
|
12840
13393
|
] })
|
|
12841
13394
|
] }) });
|
|
12842
13395
|
};
|
|
12843
13396
|
var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }) => {
|
|
12844
|
-
const [isEditing, setIsEditing] = (0,
|
|
13397
|
+
const [isEditing, setIsEditing] = (0, import_react52.useState)(false);
|
|
12845
13398
|
if (!reminder || !reminder.id) {
|
|
12846
13399
|
return null;
|
|
12847
13400
|
}
|
|
@@ -12859,8 +13412,8 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
12859
13412
|
if (tomorrow) return "Tomorrow";
|
|
12860
13413
|
return formatDate(new Date(reminder.dueDate || ""));
|
|
12861
13414
|
};
|
|
12862
|
-
return /* @__PURE__ */ (0,
|
|
12863
|
-
/* @__PURE__ */ (0,
|
|
13415
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(import_jsx_runtime69.Fragment, { children: [
|
|
13416
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12864
13417
|
EditReminderModal,
|
|
12865
13418
|
{
|
|
12866
13419
|
reminder,
|
|
@@ -12870,61 +13423,61 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
12870
13423
|
onClose: () => setIsEditing(false)
|
|
12871
13424
|
}
|
|
12872
13425
|
),
|
|
12873
|
-
/* @__PURE__ */ (0,
|
|
13426
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12874
13427
|
Card,
|
|
12875
13428
|
{
|
|
12876
|
-
children: /* @__PURE__ */ (0,
|
|
12877
|
-
/* @__PURE__ */ (0,
|
|
12878
|
-
/* @__PURE__ */ (0,
|
|
13429
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(CardContent, { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
13430
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-start space-x-3 flex-1", children: [
|
|
13431
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12879
13432
|
"button",
|
|
12880
13433
|
{
|
|
12881
13434
|
onClick: handleToggleComplete,
|
|
12882
13435
|
className: "mt-1 text-primary hover:text-primary/80"
|
|
12883
13436
|
}
|
|
12884
13437
|
),
|
|
12885
|
-
/* @__PURE__ */ (0,
|
|
12886
|
-
/* @__PURE__ */ (0,
|
|
13438
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex-1", children: [
|
|
13439
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "flex items-center space-x-2 mb-1", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12887
13440
|
"h3",
|
|
12888
13441
|
{
|
|
12889
13442
|
children: reminder.title
|
|
12890
13443
|
}
|
|
12891
13444
|
) }),
|
|
12892
|
-
/* @__PURE__ */ (0,
|
|
12893
|
-
/* @__PURE__ */ (0,
|
|
12894
|
-
/* @__PURE__ */ (0,
|
|
12895
|
-
/* @__PURE__ */ (0,
|
|
12896
|
-
/* @__PURE__ */ (0,
|
|
13445
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "text-sm text-muted-foreground mb-2", children: reminder.description }),
|
|
13446
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-4 text-sm text-muted-foreground", children: [
|
|
13447
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
13448
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.Calendar, { className: "h-4 w-4" }),
|
|
13449
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { className: overdue ? "text-destructive font-medium" : "", children: getDateLabel() })
|
|
12897
13450
|
] }),
|
|
12898
|
-
reminder.dueTime && /* @__PURE__ */ (0,
|
|
12899
|
-
/* @__PURE__ */ (0,
|
|
12900
|
-
/* @__PURE__ */ (0,
|
|
13451
|
+
reminder.dueTime && /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
13452
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.Clock, { className: "h-4 w-4" }),
|
|
13453
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: formatTime(reminder.dueTime) })
|
|
12901
13454
|
] }),
|
|
12902
|
-
/* @__PURE__ */ (0,
|
|
12903
|
-
/* @__PURE__ */ (0,
|
|
12904
|
-
/* @__PURE__ */ (0,
|
|
13455
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
13456
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.User, { className: "h-4 w-4" }),
|
|
13457
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: typeof reminder.assignedColleague !== "number" ? reminder.assignedColleague.name : "Unknown Colleague" })
|
|
12905
13458
|
] })
|
|
12906
13459
|
] })
|
|
12907
13460
|
] })
|
|
12908
13461
|
] }),
|
|
12909
|
-
/* @__PURE__ */ (0,
|
|
12910
|
-
/* @__PURE__ */ (0,
|
|
13462
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
13463
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12911
13464
|
Button,
|
|
12912
13465
|
{
|
|
12913
13466
|
variant: "ghost",
|
|
12914
13467
|
size: "sm",
|
|
12915
13468
|
onClick: () => setIsEditing(true),
|
|
12916
13469
|
className: "h-8 w-8 p-0",
|
|
12917
|
-
children: /* @__PURE__ */ (0,
|
|
13470
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.Edit2, { className: "h-4 w-4" })
|
|
12918
13471
|
}
|
|
12919
13472
|
),
|
|
12920
|
-
/* @__PURE__ */ (0,
|
|
13473
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
12921
13474
|
Button,
|
|
12922
13475
|
{
|
|
12923
13476
|
variant: "ghost",
|
|
12924
13477
|
size: "sm",
|
|
12925
13478
|
onClick: () => onDeleteReminder(reminder.id.toString()),
|
|
12926
13479
|
className: "h-8 w-8 p-0 text-destructive hover:text-destructive/80",
|
|
12927
|
-
children: /* @__PURE__ */ (0,
|
|
13480
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.Trash2, { className: "h-4 w-4" })
|
|
12928
13481
|
}
|
|
12929
13482
|
)
|
|
12930
13483
|
] })
|
|
@@ -12940,15 +13493,15 @@ var TasksView = ({
|
|
|
12940
13493
|
onUpdateReminder,
|
|
12941
13494
|
onDeleteReminder
|
|
12942
13495
|
}) => {
|
|
12943
|
-
const [reminders, setReminders] = (0,
|
|
12944
|
-
const [colleagues, setColleagues] = (0,
|
|
12945
|
-
const [filter, setFilter] = (0,
|
|
12946
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
12947
|
-
const [openAddReminderModal, setOpenAddReminderModal] = (0,
|
|
12948
|
-
(0,
|
|
13496
|
+
const [reminders, setReminders] = (0, import_react52.useState)(initialReminders.filter(Boolean));
|
|
13497
|
+
const [colleagues, setColleagues] = (0, import_react52.useState)(initialColleagues.filter(Boolean));
|
|
13498
|
+
const [filter, setFilter] = (0, import_react52.useState)("all");
|
|
13499
|
+
const [searchTerm, setSearchTerm] = (0, import_react52.useState)("");
|
|
13500
|
+
const [openAddReminderModal, setOpenAddReminderModal] = (0, import_react52.useState)(false);
|
|
13501
|
+
(0, import_react52.useEffect)(() => {
|
|
12949
13502
|
setReminders(initialReminders.filter(Boolean));
|
|
12950
13503
|
}, [initialReminders]);
|
|
12951
|
-
(0,
|
|
13504
|
+
(0, import_react52.useEffect)(() => {
|
|
12952
13505
|
setColleagues(initialColleagues.filter(Boolean));
|
|
12953
13506
|
}, [initialColleagues]);
|
|
12954
13507
|
const handleAddReminder = (newReminder) => {
|
|
@@ -13036,8 +13589,8 @@ var TasksView = ({
|
|
|
13036
13589
|
// lastUpdated: new Date(),
|
|
13037
13590
|
// isActive: true,
|
|
13038
13591
|
};
|
|
13039
|
-
return /* @__PURE__ */ (0,
|
|
13040
|
-
/* @__PURE__ */ (0,
|
|
13592
|
+
return /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
13593
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
13041
13594
|
DashboardHero,
|
|
13042
13595
|
{
|
|
13043
13596
|
title: "Task Reminders",
|
|
@@ -13051,8 +13604,8 @@ var TasksView = ({
|
|
|
13051
13604
|
}
|
|
13052
13605
|
}
|
|
13053
13606
|
),
|
|
13054
|
-
/* @__PURE__ */ (0,
|
|
13055
|
-
/* @__PURE__ */ (0,
|
|
13607
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "h-full bg-background", children: [
|
|
13608
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
13056
13609
|
AddReminderModal,
|
|
13057
13610
|
{
|
|
13058
13611
|
colleagues,
|
|
@@ -13061,48 +13614,48 @@ var TasksView = ({
|
|
|
13061
13614
|
setOpen: setOpenAddReminderModal
|
|
13062
13615
|
}
|
|
13063
13616
|
),
|
|
13064
|
-
/* @__PURE__ */ (0,
|
|
13065
|
-
/* @__PURE__ */ (0,
|
|
13066
|
-
/* @__PURE__ */ (0,
|
|
13067
|
-
/* @__PURE__ */ (0,
|
|
13068
|
-
/* @__PURE__ */ (0,
|
|
13617
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "p-6", children: [
|
|
13618
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [
|
|
13619
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { children: [
|
|
13620
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Task Reminders" }),
|
|
13621
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "text-muted-foreground", children: "Manage your digital colleague task reminders" })
|
|
13069
13622
|
] }),
|
|
13070
|
-
/* @__PURE__ */ (0,
|
|
13623
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(
|
|
13071
13624
|
Button,
|
|
13072
13625
|
{
|
|
13073
13626
|
className: "flex items-center space-x-2",
|
|
13074
13627
|
onClick: () => setOpenAddReminderModal(true),
|
|
13075
13628
|
children: [
|
|
13076
|
-
/* @__PURE__ */ (0,
|
|
13077
|
-
/* @__PURE__ */ (0,
|
|
13629
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(import_lucide_react39.Plus, { className: "h-4 w-4" }),
|
|
13630
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("span", { children: "Add Reminder" })
|
|
13078
13631
|
]
|
|
13079
13632
|
}
|
|
13080
13633
|
)
|
|
13081
13634
|
] }),
|
|
13082
|
-
/* @__PURE__ */ (0,
|
|
13083
|
-
/* @__PURE__ */ (0,
|
|
13084
|
-
/* @__PURE__ */ (0,
|
|
13085
|
-
/* @__PURE__ */ (0,
|
|
13635
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "grid grid-cols-5 gap-4 mb-6", children: [
|
|
13636
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-4", children: [
|
|
13637
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-2xl font-bold text-foreground", children: stats.total }),
|
|
13638
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-sm text-muted-foreground", children: "Total" })
|
|
13086
13639
|
] }),
|
|
13087
|
-
/* @__PURE__ */ (0,
|
|
13088
|
-
/* @__PURE__ */ (0,
|
|
13089
|
-
/* @__PURE__ */ (0,
|
|
13640
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-4", children: [
|
|
13641
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-2xl font-bold text-primary", children: stats.overdue }),
|
|
13642
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-sm text-muted-foreground", children: "Pending" })
|
|
13090
13643
|
] }),
|
|
13091
|
-
/* @__PURE__ */ (0,
|
|
13092
|
-
/* @__PURE__ */ (0,
|
|
13093
|
-
/* @__PURE__ */ (0,
|
|
13644
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-4", children: [
|
|
13645
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-2xl font-bold text-success", children: stats.today }),
|
|
13646
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-sm text-muted-foreground", children: "Completed" })
|
|
13094
13647
|
] }),
|
|
13095
|
-
/* @__PURE__ */ (0,
|
|
13096
|
-
/* @__PURE__ */ (0,
|
|
13097
|
-
/* @__PURE__ */ (0,
|
|
13648
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-4", children: [
|
|
13649
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-2xl font-bold text-destructive", children: stats.overdue }),
|
|
13650
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-sm text-muted-foreground", children: "Overdue" })
|
|
13098
13651
|
] }),
|
|
13099
|
-
/* @__PURE__ */ (0,
|
|
13100
|
-
/* @__PURE__ */ (0,
|
|
13101
|
-
/* @__PURE__ */ (0,
|
|
13652
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-4", children: [
|
|
13653
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-2xl font-bold text-warning", children: stats.today }),
|
|
13654
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-sm text-muted-foreground", children: "Today" })
|
|
13102
13655
|
] })
|
|
13103
13656
|
] }),
|
|
13104
|
-
/* @__PURE__ */ (0,
|
|
13105
|
-
/* @__PURE__ */ (0,
|
|
13657
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)("div", { className: "flex items-center space-x-4 mb-6", children: [
|
|
13658
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
13106
13659
|
Input,
|
|
13107
13660
|
{
|
|
13108
13661
|
placeholder: "Search reminders...",
|
|
@@ -13111,25 +13664,25 @@ var TasksView = ({
|
|
|
13111
13664
|
className: "max-w-md"
|
|
13112
13665
|
}
|
|
13113
13666
|
) }),
|
|
13114
|
-
/* @__PURE__ */ (0,
|
|
13115
|
-
/* @__PURE__ */ (0,
|
|
13116
|
-
/* @__PURE__ */ (0,
|
|
13117
|
-
/* @__PURE__ */ (0,
|
|
13667
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Select, { value: filter, onValueChange: (value) => setFilter(value), children: [
|
|
13668
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(SelectValue, {}) }),
|
|
13669
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectContent, { children: [
|
|
13670
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectItem, { value: "all", children: [
|
|
13118
13671
|
"All (",
|
|
13119
13672
|
stats.total,
|
|
13120
13673
|
")"
|
|
13121
13674
|
] }),
|
|
13122
|
-
/* @__PURE__ */ (0,
|
|
13675
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectItem, { value: "overdue", children: [
|
|
13123
13676
|
"Overdue (",
|
|
13124
13677
|
stats.overdue,
|
|
13125
13678
|
")"
|
|
13126
13679
|
] }),
|
|
13127
|
-
/* @__PURE__ */ (0,
|
|
13680
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectItem, { value: "overdue", children: [
|
|
13128
13681
|
"Overdue (",
|
|
13129
13682
|
stats.overdue,
|
|
13130
13683
|
")"
|
|
13131
13684
|
] }),
|
|
13132
|
-
/* @__PURE__ */ (0,
|
|
13685
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(SelectItem, { value: "today", children: [
|
|
13133
13686
|
"Today (",
|
|
13134
13687
|
stats.today,
|
|
13135
13688
|
")"
|
|
@@ -13137,11 +13690,11 @@ var TasksView = ({
|
|
|
13137
13690
|
] })
|
|
13138
13691
|
] })
|
|
13139
13692
|
] }),
|
|
13140
|
-
/* @__PURE__ */ (0,
|
|
13141
|
-
/* @__PURE__ */ (0,
|
|
13142
|
-
!searchTerm && filter === "all" && /* @__PURE__ */ (0,
|
|
13693
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "space-y-4", children: sortedReminders.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime69.jsxs)(Card, { className: "p-8 text-center", children: [
|
|
13694
|
+
/* @__PURE__ */ (0, import_jsx_runtime69.jsx)("div", { className: "text-muted-foreground", children: searchTerm || filter !== "all" ? "No reminders match your filters" : "No reminders yet" }),
|
|
13695
|
+
!searchTerm && filter === "all" && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)("p", { className: "text-sm text-muted-foreground/60 mt-2", children: "Create your first reminder to get started" })
|
|
13143
13696
|
] }) : sortedReminders.map(
|
|
13144
|
-
(reminder) => reminder && /* @__PURE__ */ (0,
|
|
13697
|
+
(reminder) => reminder && /* @__PURE__ */ (0, import_jsx_runtime69.jsx)(
|
|
13145
13698
|
ReminderCard,
|
|
13146
13699
|
{
|
|
13147
13700
|
reminder,
|
|
@@ -13159,7 +13712,7 @@ var TasksView = ({
|
|
|
13159
13712
|
|
|
13160
13713
|
// src/components/Projects/ProjectView.tsx
|
|
13161
13714
|
var import_navigation = require("next/navigation");
|
|
13162
|
-
var
|
|
13715
|
+
var import_jsx_runtime70 = require("react/jsx-runtime");
|
|
13163
13716
|
function ProjectView({
|
|
13164
13717
|
title = "",
|
|
13165
13718
|
initialTasks = [],
|
|
@@ -13207,47 +13760,47 @@ function ProjectView({
|
|
|
13207
13760
|
onCopilotClick,
|
|
13208
13761
|
handleAddComment
|
|
13209
13762
|
}) {
|
|
13210
|
-
const [tasks, setTasks] = (0,
|
|
13211
|
-
const [epics, setEpics] = (0,
|
|
13212
|
-
const [sprints, setSprints] = (0,
|
|
13213
|
-
const [projects, setProjects] = (0,
|
|
13214
|
-
const [reminders, setReminders] = (0,
|
|
13215
|
-
const [colleagues, setColleagues] = (0,
|
|
13216
|
-
const [users, setUsers] = (0,
|
|
13217
|
-
const [files, setFiles] = (0,
|
|
13218
|
-
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0,
|
|
13219
|
-
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0,
|
|
13220
|
-
const [selectedTask, setSelectedTask] = (0,
|
|
13221
|
-
const [selectedEpicForTask, setSelectedEpicForTask] = (0,
|
|
13222
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
13223
|
-
const [currentView, setCurrentView] = (0,
|
|
13224
|
-
const [mobileMenuOpen, setMobileMenuOpen] = (0,
|
|
13763
|
+
const [tasks, setTasks] = (0, import_react53.useState)(initialTasks);
|
|
13764
|
+
const [epics, setEpics] = (0, import_react53.useState)(initialEpics);
|
|
13765
|
+
const [sprints, setSprints] = (0, import_react53.useState)(initialSprints);
|
|
13766
|
+
const [projects, setProjects] = (0, import_react53.useState)(initialProjects);
|
|
13767
|
+
const [reminders, setReminders] = (0, import_react53.useState)(initialReminders);
|
|
13768
|
+
const [colleagues, setColleagues] = (0, import_react53.useState)(initialColleagues);
|
|
13769
|
+
const [users, setUsers] = (0, import_react53.useState)(initialUsers);
|
|
13770
|
+
const [files, setFiles] = (0, import_react53.useState)(initialFiles);
|
|
13771
|
+
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react53.useState)(false);
|
|
13772
|
+
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react53.useState)(false);
|
|
13773
|
+
const [selectedTask, setSelectedTask] = (0, import_react53.useState)(null);
|
|
13774
|
+
const [selectedEpicForTask, setSelectedEpicForTask] = (0, import_react53.useState)(null);
|
|
13775
|
+
const [draggedTask, setDraggedTask] = (0, import_react53.useState)(null);
|
|
13776
|
+
const [currentView, setCurrentView] = (0, import_react53.useState)(initialView || "kanban");
|
|
13777
|
+
const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react53.useState)(false);
|
|
13225
13778
|
const router = (0, import_navigation.useRouter)();
|
|
13226
|
-
(0,
|
|
13779
|
+
(0, import_react53.useEffect)(() => {
|
|
13227
13780
|
setTasks(initialTasks);
|
|
13228
13781
|
}, [initialTasks]);
|
|
13229
|
-
(0,
|
|
13782
|
+
(0, import_react53.useEffect)(() => {
|
|
13230
13783
|
setSprints(initialSprints);
|
|
13231
13784
|
}, [initialSprints]);
|
|
13232
|
-
(0,
|
|
13785
|
+
(0, import_react53.useEffect)(() => {
|
|
13233
13786
|
setEpics(initialEpics);
|
|
13234
13787
|
}, [initialEpics]);
|
|
13235
|
-
(0,
|
|
13788
|
+
(0, import_react53.useEffect)(() => {
|
|
13236
13789
|
setProjects(initialProjects);
|
|
13237
13790
|
}, [initialProjects]);
|
|
13238
|
-
(0,
|
|
13791
|
+
(0, import_react53.useEffect)(() => {
|
|
13239
13792
|
setFiles(initialFiles);
|
|
13240
13793
|
}, [initialFiles]);
|
|
13241
|
-
(0,
|
|
13794
|
+
(0, import_react53.useEffect)(() => {
|
|
13242
13795
|
setUsers(initialUsers);
|
|
13243
13796
|
}, [initialUsers]);
|
|
13244
|
-
(0,
|
|
13797
|
+
(0, import_react53.useEffect)(() => {
|
|
13245
13798
|
setColleagues(initialColleagues);
|
|
13246
13799
|
}, [initialColleagues]);
|
|
13247
|
-
(0,
|
|
13800
|
+
(0, import_react53.useEffect)(() => {
|
|
13248
13801
|
setReminders(initialReminders);
|
|
13249
13802
|
}, [initialReminders]);
|
|
13250
|
-
(0,
|
|
13803
|
+
(0, import_react53.useEffect)(() => {
|
|
13251
13804
|
setCurrentView(initialView);
|
|
13252
13805
|
}, [initialView]);
|
|
13253
13806
|
const filteredTasks = tasks.filter((task) => {
|
|
@@ -13453,6 +14006,8 @@ function ProjectView({
|
|
|
13453
14006
|
return "Documentation";
|
|
13454
14007
|
case "epics":
|
|
13455
14008
|
return "Epic Planning";
|
|
14009
|
+
case "gantt":
|
|
14010
|
+
return "Gantt Chart";
|
|
13456
14011
|
default:
|
|
13457
14012
|
return "Project Board";
|
|
13458
14013
|
}
|
|
@@ -13468,8 +14023,8 @@ function ProjectView({
|
|
|
13468
14023
|
const recentTeams = mockTeams.sort((a, b) => b.lastUsed.getTime() - a.lastUsed.getTime()).slice(0, 3);
|
|
13469
14024
|
const hasMoreTeams = mockTeams.length > 3;
|
|
13470
14025
|
const additionalTeams = mockTeams.slice(3);
|
|
13471
|
-
return /* @__PURE__ */ (0,
|
|
13472
|
-
currentView === "kanban" && /* @__PURE__ */ (0,
|
|
14026
|
+
return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)(ManagementSidebar, { currentView, onViewChange: handleViewChange, children: [
|
|
14027
|
+
currentView === "kanban" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "h-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13473
14028
|
KanbanBoardView,
|
|
13474
14029
|
{
|
|
13475
14030
|
initialProjects: projects,
|
|
@@ -13486,7 +14041,7 @@ function ProjectView({
|
|
|
13486
14041
|
onAddComment: handleAddComment
|
|
13487
14042
|
}
|
|
13488
14043
|
) }),
|
|
13489
|
-
currentView === "planning" && /* @__PURE__ */ (0,
|
|
14044
|
+
currentView === "planning" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13490
14045
|
PlanningView,
|
|
13491
14046
|
{
|
|
13492
14047
|
tasks,
|
|
@@ -13499,7 +14054,7 @@ function ProjectView({
|
|
|
13499
14054
|
onDeleteSprint: handleDeleteSprint
|
|
13500
14055
|
}
|
|
13501
14056
|
) }),
|
|
13502
|
-
currentView === "tasks" && /* @__PURE__ */ (0,
|
|
14057
|
+
currentView === "tasks" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13503
14058
|
TasksView,
|
|
13504
14059
|
{
|
|
13505
14060
|
initialReminders: reminders,
|
|
@@ -13509,7 +14064,7 @@ function ProjectView({
|
|
|
13509
14064
|
onDeleteReminder: handleDeleteReminder
|
|
13510
14065
|
}
|
|
13511
14066
|
) }),
|
|
13512
|
-
currentView === "files" && /* @__PURE__ */ (0,
|
|
14067
|
+
currentView === "files" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13513
14068
|
FileView,
|
|
13514
14069
|
{
|
|
13515
14070
|
initialFiles: files,
|
|
@@ -13520,7 +14075,7 @@ function ProjectView({
|
|
|
13520
14075
|
compactView: false
|
|
13521
14076
|
}
|
|
13522
14077
|
) }),
|
|
13523
|
-
currentView === "epics" && /* @__PURE__ */ (0,
|
|
14078
|
+
currentView === "epics" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13524
14079
|
EpicsView,
|
|
13525
14080
|
{
|
|
13526
14081
|
tasks,
|
|
@@ -13534,7 +14089,17 @@ function ProjectView({
|
|
|
13534
14089
|
onDeleteEpic: handleDeleteEpic
|
|
13535
14090
|
}
|
|
13536
14091
|
) }),
|
|
13537
|
-
/* @__PURE__ */ (0,
|
|
14092
|
+
currentView === "gantt" && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
14093
|
+
GanttView,
|
|
14094
|
+
{
|
|
14095
|
+
tasks,
|
|
14096
|
+
epics,
|
|
14097
|
+
sprints,
|
|
14098
|
+
onUpdateEpic: handleUpdateEpic,
|
|
14099
|
+
onTaskClick: handleTaskClick
|
|
14100
|
+
}
|
|
14101
|
+
) }),
|
|
14102
|
+
/* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13538
14103
|
AddTaskModal,
|
|
13539
14104
|
{
|
|
13540
14105
|
isOpen: isAddTaskModalOpen,
|
|
@@ -13546,7 +14111,7 @@ function ProjectView({
|
|
|
13546
14111
|
defaultEpicId: selectedEpicForTask || void 0
|
|
13547
14112
|
}
|
|
13548
14113
|
),
|
|
13549
|
-
/* @__PURE__ */ (0,
|
|
14114
|
+
/* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
13550
14115
|
AddEpicModal,
|
|
13551
14116
|
{
|
|
13552
14117
|
isOpen: isAddEpicModalOpen,
|
|
@@ -13558,18 +14123,18 @@ function ProjectView({
|
|
|
13558
14123
|
}
|
|
13559
14124
|
|
|
13560
14125
|
// src/components/Projects/ProjectsIndexView.tsx
|
|
13561
|
-
var
|
|
13562
|
-
var
|
|
14126
|
+
var import_react56 = require("react");
|
|
14127
|
+
var import_react57 = require("motion/react");
|
|
13563
14128
|
|
|
13564
14129
|
// src/components/Projects/project-card.tsx
|
|
13565
|
-
var
|
|
13566
|
-
var
|
|
14130
|
+
var import_react54 = require("motion/react");
|
|
14131
|
+
var import_lucide_react40 = require("lucide-react");
|
|
13567
14132
|
|
|
13568
14133
|
// src/components/ui/progress.tsx
|
|
13569
|
-
var
|
|
14134
|
+
var React36 = __toESM(require("react"));
|
|
13570
14135
|
var ProgressPrimitive = __toESM(require("@radix-ui/react-progress"));
|
|
13571
|
-
var
|
|
13572
|
-
var Progress =
|
|
14136
|
+
var import_jsx_runtime71 = require("react/jsx-runtime");
|
|
14137
|
+
var Progress = React36.forwardRef(({ className, value, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
13573
14138
|
ProgressPrimitive.Root,
|
|
13574
14139
|
{
|
|
13575
14140
|
ref,
|
|
@@ -13578,7 +14143,7 @@ var Progress = React35.forwardRef(({ className, value, ...props }, ref) => /* @_
|
|
|
13578
14143
|
className
|
|
13579
14144
|
),
|
|
13580
14145
|
...props,
|
|
13581
|
-
children: /* @__PURE__ */ (0,
|
|
14146
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
13582
14147
|
ProgressPrimitive.Indicator,
|
|
13583
14148
|
{
|
|
13584
14149
|
className: "h-full w-full flex-1 bg-primary transition-all",
|
|
@@ -13590,54 +14155,54 @@ var Progress = React35.forwardRef(({ className, value, ...props }, ref) => /* @_
|
|
|
13590
14155
|
Progress.displayName = ProgressPrimitive.Root.displayName;
|
|
13591
14156
|
|
|
13592
14157
|
// src/components/Projects/project-card.tsx
|
|
13593
|
-
var
|
|
14158
|
+
var import_jsx_runtime72 = require("react/jsx-runtime");
|
|
13594
14159
|
function ProjectCard({ project, onOpen, onShare, className }) {
|
|
13595
|
-
return /* @__PURE__ */ (0,
|
|
13596
|
-
/* @__PURE__ */ (0,
|
|
13597
|
-
/* @__PURE__ */ (0,
|
|
13598
|
-
/* @__PURE__ */ (0,
|
|
13599
|
-
/* @__PURE__ */ (0,
|
|
14160
|
+
return /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_react54.motion.div, { whileHover: { scale: 1.02, y: -5 }, whileTap: { scale: 0.98 }, className, children: /* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Card, { className: "overflow-hidden rounded-3xl border hover:border-primary/50 transition-all duration-300", children: [
|
|
14161
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(CardHeader, { children: [
|
|
14162
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
14163
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CardTitle, { children: project.name }),
|
|
14164
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(Badge, { variant: "outline", className: "rounded-xl", children: [
|
|
13600
14165
|
"Due ",
|
|
13601
14166
|
project.dueDate
|
|
13602
14167
|
] })
|
|
13603
14168
|
] }),
|
|
13604
|
-
/* @__PURE__ */ (0,
|
|
14169
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(CardDescription, { children: project.description })
|
|
13605
14170
|
] }),
|
|
13606
|
-
/* @__PURE__ */ (0,
|
|
13607
|
-
/* @__PURE__ */ (0,
|
|
13608
|
-
/* @__PURE__ */ (0,
|
|
13609
|
-
/* @__PURE__ */ (0,
|
|
13610
|
-
/* @__PURE__ */ (0,
|
|
14171
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(CardContent, { className: "space-y-4", children: [
|
|
14172
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "space-y-2", children: [
|
|
14173
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
14174
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)("span", { children: "Progress" }),
|
|
14175
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("span", { children: [
|
|
13611
14176
|
project.progress,
|
|
13612
14177
|
"%"
|
|
13613
14178
|
] })
|
|
13614
14179
|
] }),
|
|
13615
|
-
/* @__PURE__ */ (0,
|
|
14180
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Progress, { value: project.progress, className: "h-2 rounded-xl" })
|
|
13616
14181
|
] }),
|
|
13617
|
-
/* @__PURE__ */ (0,
|
|
13618
|
-
/* @__PURE__ */ (0,
|
|
13619
|
-
/* @__PURE__ */ (0,
|
|
14182
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center justify-between text-sm text-muted-foreground", children: [
|
|
14183
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center", children: [
|
|
14184
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react40.Users, { className: "mr-1 h-4 w-4" }),
|
|
13620
14185
|
project.members,
|
|
13621
14186
|
" members"
|
|
13622
14187
|
] }),
|
|
13623
|
-
/* @__PURE__ */ (0,
|
|
13624
|
-
/* @__PURE__ */ (0,
|
|
14188
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)("div", { className: "flex items-center", children: [
|
|
14189
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react40.FileText, { className: "mr-1 h-4 w-4" }),
|
|
13625
14190
|
project.files,
|
|
13626
14191
|
" files"
|
|
13627
14192
|
] })
|
|
13628
14193
|
] })
|
|
13629
14194
|
] }),
|
|
13630
|
-
/* @__PURE__ */ (0,
|
|
13631
|
-
/* @__PURE__ */ (0,
|
|
13632
|
-
/* @__PURE__ */ (0,
|
|
14195
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsxs)(CardFooter, { className: "flex gap-2", children: [
|
|
14196
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Button, { variant: "secondary", className: "flex-1 rounded-2xl", onClick: () => onOpen?.(project), children: "Open Project" }),
|
|
14197
|
+
/* @__PURE__ */ (0, import_jsx_runtime72.jsx)(Button, { variant: "outline", size: "icon", className: "rounded-2xl", onClick: () => onShare?.(project), children: /* @__PURE__ */ (0, import_jsx_runtime72.jsx)(import_lucide_react40.Share2, { className: "h-4 w-4" }) })
|
|
13633
14198
|
] })
|
|
13634
14199
|
] }) });
|
|
13635
14200
|
}
|
|
13636
14201
|
|
|
13637
14202
|
// src/components/Projects/project-form.tsx
|
|
13638
|
-
var
|
|
13639
|
-
var
|
|
13640
|
-
var
|
|
14203
|
+
var import_react55 = require("react");
|
|
14204
|
+
var import_lucide_react41 = require("lucide-react");
|
|
14205
|
+
var import_jsx_runtime73 = require("react/jsx-runtime");
|
|
13641
14206
|
var ProjectForm = ({
|
|
13642
14207
|
onSubmit,
|
|
13643
14208
|
onCancel,
|
|
@@ -13645,14 +14210,14 @@ var ProjectForm = ({
|
|
|
13645
14210
|
initialData,
|
|
13646
14211
|
className = ""
|
|
13647
14212
|
}) => {
|
|
13648
|
-
const [formData, setFormData] = (0,
|
|
14213
|
+
const [formData, setFormData] = (0, import_react55.useState)({
|
|
13649
14214
|
name: initialData?.name || "",
|
|
13650
14215
|
description: initialData?.description || "",
|
|
13651
14216
|
objectives: initialData?.objectives || "",
|
|
13652
14217
|
workInstructions: initialData?.workInstructions || "",
|
|
13653
14218
|
plan: initialData?.plan || false
|
|
13654
14219
|
});
|
|
13655
|
-
const [errors, setErrors] = (0,
|
|
14220
|
+
const [errors, setErrors] = (0, import_react55.useState)({});
|
|
13656
14221
|
const validateForm = () => {
|
|
13657
14222
|
const newErrors = {};
|
|
13658
14223
|
if (!formData.name.trim()) {
|
|
@@ -13690,19 +14255,19 @@ var ProjectForm = ({
|
|
|
13690
14255
|
setErrors((prev) => ({ ...prev, [field]: void 0 }));
|
|
13691
14256
|
}
|
|
13692
14257
|
};
|
|
13693
|
-
return /* @__PURE__ */ (0,
|
|
13694
|
-
/* @__PURE__ */ (0,
|
|
13695
|
-
/* @__PURE__ */ (0,
|
|
13696
|
-
/* @__PURE__ */ (0,
|
|
14258
|
+
return /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: `w-full max-w-2xl ${className}`, children: [
|
|
14259
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "mb-4", children: [
|
|
14260
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
14261
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react41.Plus, { className: "h-5 w-5" }),
|
|
13697
14262
|
"Create New Project"
|
|
13698
14263
|
] }),
|
|
13699
|
-
/* @__PURE__ */ (0,
|
|
14264
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("p", { className: "text-sm text-gray-500", children: "Set up a new project with clear objectives and work instructions to help your team collaborate effectively." })
|
|
13700
14265
|
] }),
|
|
13701
|
-
/* @__PURE__ */ (0,
|
|
13702
|
-
/* @__PURE__ */ (0,
|
|
13703
|
-
/* @__PURE__ */ (0,
|
|
13704
|
-
/* @__PURE__ */ (0,
|
|
13705
|
-
/* @__PURE__ */ (0,
|
|
14266
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("form", { onSubmit: handleSubmit, children: [
|
|
14267
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-6", children: [
|
|
14268
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-2", children: [
|
|
14269
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { htmlFor: "name", className: "text-sm font-medium", children: "Project Name *" }),
|
|
14270
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
|
|
13706
14271
|
Input,
|
|
13707
14272
|
{
|
|
13708
14273
|
id: "name",
|
|
@@ -13715,11 +14280,11 @@ var ProjectForm = ({
|
|
|
13715
14280
|
maxLength: 100
|
|
13716
14281
|
}
|
|
13717
14282
|
),
|
|
13718
|
-
errors.name && /* @__PURE__ */ (0,
|
|
14283
|
+
errors.name && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("p", { className: "text-sm text-red-600", children: errors.name })
|
|
13719
14284
|
] }),
|
|
13720
|
-
/* @__PURE__ */ (0,
|
|
13721
|
-
/* @__PURE__ */ (0,
|
|
13722
|
-
/* @__PURE__ */ (0,
|
|
14285
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-2", children: [
|
|
14286
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { htmlFor: "name", className: "text-sm font-medium", children: "Project Description *" }),
|
|
14287
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
|
|
13723
14288
|
Input,
|
|
13724
14289
|
{
|
|
13725
14290
|
id: "description",
|
|
@@ -13732,11 +14297,11 @@ var ProjectForm = ({
|
|
|
13732
14297
|
maxLength: 100
|
|
13733
14298
|
}
|
|
13734
14299
|
),
|
|
13735
|
-
errors.description && /* @__PURE__ */ (0,
|
|
14300
|
+
errors.description && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("p", { className: "text-sm text-red-600", children: errors.description })
|
|
13736
14301
|
] }),
|
|
13737
|
-
/* @__PURE__ */ (0,
|
|
13738
|
-
/* @__PURE__ */ (0,
|
|
13739
|
-
/* @__PURE__ */ (0,
|
|
14302
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-2", children: [
|
|
14303
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { htmlFor: "objectives", className: "text-sm font-medium", children: "Project Objectives *" }),
|
|
14304
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
|
|
13740
14305
|
Textarea,
|
|
13741
14306
|
{
|
|
13742
14307
|
id: "objectives",
|
|
@@ -13748,17 +14313,17 @@ var ProjectForm = ({
|
|
|
13748
14313
|
maxLength: 1e3
|
|
13749
14314
|
}
|
|
13750
14315
|
),
|
|
13751
|
-
/* @__PURE__ */ (0,
|
|
13752
|
-
/* @__PURE__ */ (0,
|
|
13753
|
-
/* @__PURE__ */ (0,
|
|
14316
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex justify-between text-xs text-gray-500", children: [
|
|
14317
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { children: errors.objectives && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { className: "text-red-600", children: errors.objectives }) }),
|
|
14318
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("span", { children: [
|
|
13754
14319
|
formData.objectives.length,
|
|
13755
14320
|
"/1000"
|
|
13756
14321
|
] })
|
|
13757
14322
|
] })
|
|
13758
14323
|
] }),
|
|
13759
|
-
/* @__PURE__ */ (0,
|
|
13760
|
-
/* @__PURE__ */ (0,
|
|
13761
|
-
/* @__PURE__ */ (0,
|
|
14324
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-2", children: [
|
|
14325
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { htmlFor: "workInstructions", className: "text-sm font-medium", children: "Work Instructions *" }),
|
|
14326
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
|
|
13762
14327
|
Textarea,
|
|
13763
14328
|
{
|
|
13764
14329
|
id: "workInstructions",
|
|
@@ -13770,18 +14335,18 @@ var ProjectForm = ({
|
|
|
13770
14335
|
maxLength: 2e3
|
|
13771
14336
|
}
|
|
13772
14337
|
),
|
|
13773
|
-
/* @__PURE__ */ (0,
|
|
13774
|
-
/* @__PURE__ */ (0,
|
|
13775
|
-
/* @__PURE__ */ (0,
|
|
14338
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex justify-between text-xs text-gray-500", children: [
|
|
14339
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { children: errors.workInstructions && /* @__PURE__ */ (0, import_jsx_runtime73.jsx)("span", { className: "text-red-600", children: errors.workInstructions }) }),
|
|
14340
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("span", { children: [
|
|
13776
14341
|
formData.workInstructions.length,
|
|
13777
14342
|
"/2000"
|
|
13778
14343
|
] })
|
|
13779
14344
|
] })
|
|
13780
14345
|
] }),
|
|
13781
|
-
/* @__PURE__ */ (0,
|
|
13782
|
-
/* @__PURE__ */ (0,
|
|
13783
|
-
/* @__PURE__ */ (0,
|
|
13784
|
-
/* @__PURE__ */ (0,
|
|
14346
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "space-y-3", children: [
|
|
14347
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { className: "text-sm font-medium", children: "Project Management" }),
|
|
14348
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
14349
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(
|
|
13785
14350
|
Checkbox,
|
|
13786
14351
|
{
|
|
13787
14352
|
id: "plan",
|
|
@@ -13790,13 +14355,13 @@ var ProjectForm = ({
|
|
|
13790
14355
|
disabled: isLoading
|
|
13791
14356
|
}
|
|
13792
14357
|
),
|
|
13793
|
-
/* @__PURE__ */ (0,
|
|
14358
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Label3, { htmlFor: "plan", className: "text-sm text-gray-700 cursor-pointer", children: "Enable project planning and management features" })
|
|
13794
14359
|
] }),
|
|
13795
|
-
/* @__PURE__ */ (0,
|
|
14360
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)("p", { className: "text-xs text-gray-500 ml-6", children: "This will allow project managers to create sprints, assign tasks, and track progress." })
|
|
13796
14361
|
] })
|
|
13797
14362
|
] }),
|
|
13798
|
-
/* @__PURE__ */ (0,
|
|
13799
|
-
onCancel && /* @__PURE__ */ (0,
|
|
14363
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsxs)("div", { className: "flex justify-end gap-3", children: [
|
|
14364
|
+
onCancel && /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(
|
|
13800
14365
|
Button,
|
|
13801
14366
|
{
|
|
13802
14367
|
type: "button",
|
|
@@ -13805,16 +14370,16 @@ var ProjectForm = ({
|
|
|
13805
14370
|
disabled: isLoading,
|
|
13806
14371
|
className: "flex items-center gap-2",
|
|
13807
14372
|
children: [
|
|
13808
|
-
/* @__PURE__ */ (0,
|
|
14373
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react41.X, { className: "h-4 w-4" }),
|
|
13809
14374
|
"Cancel"
|
|
13810
14375
|
]
|
|
13811
14376
|
}
|
|
13812
14377
|
),
|
|
13813
|
-
/* @__PURE__ */ (0,
|
|
13814
|
-
/* @__PURE__ */ (0,
|
|
14378
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(Button, { type: "submit", disabled: isLoading, className: "flex items-center gap-2", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(import_jsx_runtime73.Fragment, { children: [
|
|
14379
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react41.Loader2, { className: "h-4 w-4 animate-spin" }),
|
|
13815
14380
|
"Creating..."
|
|
13816
|
-
] }) : /* @__PURE__ */ (0,
|
|
13817
|
-
/* @__PURE__ */ (0,
|
|
14381
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime73.jsxs)(import_jsx_runtime73.Fragment, { children: [
|
|
14382
|
+
/* @__PURE__ */ (0, import_jsx_runtime73.jsx)(import_lucide_react41.Plus, { className: "h-4 w-4" }),
|
|
13818
14383
|
"Create Project"
|
|
13819
14384
|
] }) })
|
|
13820
14385
|
] })
|
|
@@ -13823,15 +14388,15 @@ var ProjectForm = ({
|
|
|
13823
14388
|
};
|
|
13824
14389
|
|
|
13825
14390
|
// src/components/Projects/ProjectsIndexView.tsx
|
|
13826
|
-
var
|
|
14391
|
+
var import_jsx_runtime74 = require("react/jsx-runtime");
|
|
13827
14392
|
function Home({
|
|
13828
14393
|
projects = [],
|
|
13829
14394
|
onAddProject,
|
|
13830
14395
|
handleProjectOpen,
|
|
13831
14396
|
handleProjectShare
|
|
13832
14397
|
}) {
|
|
13833
|
-
const [isNewProjectDialogOpen, setIsNewProjectDialogOpen] = (0,
|
|
13834
|
-
const [isSubmitting, setIsSubmitting] = (0,
|
|
14398
|
+
const [isNewProjectDialogOpen, setIsNewProjectDialogOpen] = (0, import_react56.useState)(false);
|
|
14399
|
+
const [isSubmitting, setIsSubmitting] = (0, import_react56.useState)(false);
|
|
13835
14400
|
const handleCreateProject = async (formData) => {
|
|
13836
14401
|
setIsSubmitting(true);
|
|
13837
14402
|
try {
|
|
@@ -13846,16 +14411,16 @@ function Home({
|
|
|
13846
14411
|
const handleNewProjectClick = () => {
|
|
13847
14412
|
setIsNewProjectDialogOpen(true);
|
|
13848
14413
|
};
|
|
13849
|
-
return /* @__PURE__ */ (0,
|
|
13850
|
-
/* @__PURE__ */ (0,
|
|
13851
|
-
|
|
14414
|
+
return /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
14415
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(import_react57.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(
|
|
14416
|
+
import_react57.motion.div,
|
|
13852
14417
|
{
|
|
13853
14418
|
initial: { opacity: 0, y: 10 },
|
|
13854
14419
|
animate: { opacity: 1, y: 0 },
|
|
13855
14420
|
exit: { opacity: 0, y: -10 },
|
|
13856
14421
|
transition: { duration: 0.2 },
|
|
13857
14422
|
children: [
|
|
13858
|
-
/* @__PURE__ */ (0,
|
|
14423
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
13859
14424
|
DashboardHero,
|
|
13860
14425
|
{
|
|
13861
14426
|
title: "Project Management",
|
|
@@ -13867,9 +14432,9 @@ function Home({
|
|
|
13867
14432
|
}
|
|
13868
14433
|
}
|
|
13869
14434
|
),
|
|
13870
|
-
/* @__PURE__ */ (0,
|
|
13871
|
-
/* @__PURE__ */ (0,
|
|
13872
|
-
/* @__PURE__ */ (0,
|
|
14435
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsxs)("section", { className: "space-y-4 mt-8", children: [
|
|
14436
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("h2", { className: "text-2xl font-semibold", children: "Active Projects" }),
|
|
14437
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)("div", { className: "grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-3", children: projects.map((project) => /* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
13873
14438
|
ProjectCard,
|
|
13874
14439
|
{
|
|
13875
14440
|
project,
|
|
@@ -13883,12 +14448,12 @@ function Home({
|
|
|
13883
14448
|
},
|
|
13884
14449
|
"projects-index-view"
|
|
13885
14450
|
) }),
|
|
13886
|
-
/* @__PURE__ */ (0,
|
|
13887
|
-
/* @__PURE__ */ (0,
|
|
13888
|
-
/* @__PURE__ */ (0,
|
|
13889
|
-
/* @__PURE__ */ (0,
|
|
14451
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(Dialog, { open: isNewProjectDialogOpen, onOpenChange: setIsNewProjectDialogOpen, children: /* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(DialogContent, { className: "max-w-3xl max-h-[90vh] overflow-y-auto", children: [
|
|
14452
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsxs)(DialogHeader, { className: "sr-only", children: [
|
|
14453
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(DialogTitle, { children: "Create New Project" }),
|
|
14454
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(DialogDescription, { children: "Fill out the form below to create a new project." })
|
|
13890
14455
|
] }),
|
|
13891
|
-
/* @__PURE__ */ (0,
|
|
14456
|
+
/* @__PURE__ */ (0, import_jsx_runtime74.jsx)(
|
|
13892
14457
|
ProjectForm,
|
|
13893
14458
|
{
|
|
13894
14459
|
onSubmit: handleCreateProject,
|
|
@@ -13902,45 +14467,45 @@ function Home({
|
|
|
13902
14467
|
}
|
|
13903
14468
|
|
|
13904
14469
|
// src/components/Foundry/Views/TeamsIndexView.tsx
|
|
13905
|
-
var
|
|
13906
|
-
var
|
|
14470
|
+
var import_react60 = require("react");
|
|
14471
|
+
var import_react61 = require("motion/react");
|
|
13907
14472
|
|
|
13908
14473
|
// src/components/Projects/team-card.tsx
|
|
13909
|
-
var
|
|
13910
|
-
var
|
|
13911
|
-
var
|
|
14474
|
+
var import_react58 = require("motion/react");
|
|
14475
|
+
var import_lucide_react42 = require("lucide-react");
|
|
14476
|
+
var import_jsx_runtime75 = require("react/jsx-runtime");
|
|
13912
14477
|
function TeamCard({ team, onOpen, className }) {
|
|
13913
|
-
return /* @__PURE__ */ (0,
|
|
13914
|
-
/* @__PURE__ */ (0,
|
|
13915
|
-
/* @__PURE__ */ (0,
|
|
13916
|
-
/* @__PURE__ */ (0,
|
|
14478
|
+
return /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_react58.motion.div, { whileHover: { scale: 1.02, y: -5 }, whileTap: { scale: 0.98 }, className, children: /* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(Card, { className: "overflow-hidden rounded-3xl border hover:border-primary/50 transition-all duration-300", children: [
|
|
14479
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(CardHeader, { children: [
|
|
14480
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CardTitle, { className: "text-lg", children: team.name }),
|
|
14481
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CardDescription, { className: "mt-1 text-sm", children: team.description })
|
|
13917
14482
|
] }),
|
|
13918
|
-
/* @__PURE__ */ (0,
|
|
13919
|
-
/* @__PURE__ */ (0,
|
|
13920
|
-
/* @__PURE__ */ (0,
|
|
13921
|
-
/* @__PURE__ */ (0,
|
|
13922
|
-
/* @__PURE__ */ (0,
|
|
13923
|
-
/* @__PURE__ */ (0,
|
|
14483
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)(CardContent, { className: "space-y-4", children: [
|
|
14484
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
14485
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
14486
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
14487
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react42.Users, { className: "h-4 w-4 text-blue-500" }),
|
|
14488
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { children: "Human" })
|
|
13924
14489
|
] }),
|
|
13925
|
-
/* @__PURE__ */ (0,
|
|
14490
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "font-medium", children: team.humanColleagues })
|
|
13926
14491
|
] }),
|
|
13927
|
-
/* @__PURE__ */ (0,
|
|
13928
|
-
/* @__PURE__ */ (0,
|
|
13929
|
-
/* @__PURE__ */ (0,
|
|
13930
|
-
/* @__PURE__ */ (0,
|
|
14492
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center justify-between text-sm", children: [
|
|
14493
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
14494
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react42.Bot, { className: "h-4 w-4 text-purple-500" }),
|
|
14495
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { children: "Digital" })
|
|
13931
14496
|
] }),
|
|
13932
|
-
/* @__PURE__ */ (0,
|
|
14497
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "font-medium", children: team.digitalColleagues })
|
|
13933
14498
|
] })
|
|
13934
14499
|
] }),
|
|
13935
|
-
/* @__PURE__ */ (0,
|
|
13936
|
-
/* @__PURE__ */ (0,
|
|
13937
|
-
/* @__PURE__ */ (0,
|
|
13938
|
-
/* @__PURE__ */ (0,
|
|
14500
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center justify-between text-sm border-t pt-4", children: [
|
|
14501
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
14502
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(import_lucide_react42.FolderOpen, { className: "h-4 w-4 text-green-500" }),
|
|
14503
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { children: "Projects" })
|
|
13939
14504
|
] }),
|
|
13940
|
-
/* @__PURE__ */ (0,
|
|
14505
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)("span", { className: "font-medium", children: team.projects })
|
|
13941
14506
|
] })
|
|
13942
14507
|
] }),
|
|
13943
|
-
/* @__PURE__ */ (0,
|
|
14508
|
+
/* @__PURE__ */ (0, import_jsx_runtime75.jsx)(CardFooter, { className: "flex gap-2", children: /* @__PURE__ */ (0, import_jsx_runtime75.jsx)(
|
|
13944
14509
|
Button,
|
|
13945
14510
|
{
|
|
13946
14511
|
variant: "secondary",
|
|
@@ -13953,14 +14518,14 @@ function TeamCard({ team, onOpen, className }) {
|
|
|
13953
14518
|
}
|
|
13954
14519
|
|
|
13955
14520
|
// src/components/Foundry/team-form.tsx
|
|
13956
|
-
var
|
|
13957
|
-
var
|
|
14521
|
+
var import_react59 = require("react");
|
|
14522
|
+
var import_lucide_react43 = require("lucide-react");
|
|
13958
14523
|
|
|
13959
14524
|
// src/components/ui/switch.tsx
|
|
13960
|
-
var
|
|
14525
|
+
var React38 = __toESM(require("react"));
|
|
13961
14526
|
var SwitchPrimitives = __toESM(require("@radix-ui/react-switch"));
|
|
13962
|
-
var
|
|
13963
|
-
var Switch =
|
|
14527
|
+
var import_jsx_runtime76 = require("react/jsx-runtime");
|
|
14528
|
+
var Switch = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
13964
14529
|
SwitchPrimitives.Root,
|
|
13965
14530
|
{
|
|
13966
14531
|
className: cn(
|
|
@@ -13969,7 +14534,7 @@ var Switch = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ *
|
|
|
13969
14534
|
),
|
|
13970
14535
|
...props,
|
|
13971
14536
|
ref,
|
|
13972
|
-
children: /* @__PURE__ */ (0,
|
|
14537
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime76.jsx)(
|
|
13973
14538
|
SwitchPrimitives.Thumb,
|
|
13974
14539
|
{
|
|
13975
14540
|
className: cn(
|
|
@@ -13982,7 +14547,7 @@ var Switch = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ *
|
|
|
13982
14547
|
Switch.displayName = SwitchPrimitives.Root.displayName;
|
|
13983
14548
|
|
|
13984
14549
|
// src/components/Foundry/team-form.tsx
|
|
13985
|
-
var
|
|
14550
|
+
var import_jsx_runtime77 = require("react/jsx-runtime");
|
|
13986
14551
|
function TeamForm({
|
|
13987
14552
|
team,
|
|
13988
14553
|
onSave,
|
|
@@ -13993,7 +14558,7 @@ function TeamForm({
|
|
|
13993
14558
|
cancelLabel = "Cancel",
|
|
13994
14559
|
readOnly = false
|
|
13995
14560
|
}) {
|
|
13996
|
-
const [formData, setFormData] = (0,
|
|
14561
|
+
const [formData, setFormData] = (0, import_react59.useState)({
|
|
13997
14562
|
name: "",
|
|
13998
14563
|
description: "",
|
|
13999
14564
|
systemMsg: "",
|
|
@@ -14003,8 +14568,8 @@ function TeamForm({
|
|
|
14003
14568
|
useChat: false,
|
|
14004
14569
|
...team
|
|
14005
14570
|
});
|
|
14006
|
-
const [editMode, setEditMode] = (0,
|
|
14007
|
-
(0,
|
|
14571
|
+
const [editMode, setEditMode] = (0, import_react59.useState)(!readOnly);
|
|
14572
|
+
(0, import_react59.useEffect)(() => {
|
|
14008
14573
|
if (team) {
|
|
14009
14574
|
setFormData(team);
|
|
14010
14575
|
}
|
|
@@ -14031,16 +14596,16 @@ function TeamForm({
|
|
|
14031
14596
|
};
|
|
14032
14597
|
const formTitle = title || (!editMode ? "View Team" : team ? "Edit Team" : "Create New Team");
|
|
14033
14598
|
const buttonLabel = submitLabel || (team ? "Update Team" : "Create Team");
|
|
14034
|
-
return /* @__PURE__ */ (0,
|
|
14035
|
-
/* @__PURE__ */ (0,
|
|
14036
|
-
/* @__PURE__ */ (0,
|
|
14599
|
+
return /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(import_jsx_runtime77.Fragment, { children: [
|
|
14600
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
14601
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_lucide_react43.Users, { className: "h-5 w-5" }),
|
|
14037
14602
|
formTitle
|
|
14038
14603
|
] }),
|
|
14039
|
-
/* @__PURE__ */ (0,
|
|
14040
|
-
/* @__PURE__ */ (0,
|
|
14041
|
-
/* @__PURE__ */ (0,
|
|
14042
|
-
/* @__PURE__ */ (0,
|
|
14043
|
-
/* @__PURE__ */ (0,
|
|
14604
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-6", children: [
|
|
14605
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "space-y-4", children: [
|
|
14606
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "space-y-2", children: [
|
|
14607
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "name", children: "Team Name *" }),
|
|
14608
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14044
14609
|
Input,
|
|
14045
14610
|
{
|
|
14046
14611
|
id: "name",
|
|
@@ -14052,9 +14617,9 @@ function TeamForm({
|
|
|
14052
14617
|
}
|
|
14053
14618
|
)
|
|
14054
14619
|
] }),
|
|
14055
|
-
/* @__PURE__ */ (0,
|
|
14056
|
-
/* @__PURE__ */ (0,
|
|
14057
|
-
/* @__PURE__ */ (0,
|
|
14620
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "space-y-2", children: [
|
|
14621
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "description", children: "Description" }),
|
|
14622
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14058
14623
|
Textarea,
|
|
14059
14624
|
{
|
|
14060
14625
|
id: "description",
|
|
@@ -14066,9 +14631,9 @@ function TeamForm({
|
|
|
14066
14631
|
}
|
|
14067
14632
|
)
|
|
14068
14633
|
] }),
|
|
14069
|
-
/* @__PURE__ */ (0,
|
|
14070
|
-
/* @__PURE__ */ (0,
|
|
14071
|
-
/* @__PURE__ */ (0,
|
|
14634
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "space-y-2", children: [
|
|
14635
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "systemMsg", children: "Ways of working" }),
|
|
14636
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14072
14637
|
Textarea,
|
|
14073
14638
|
{
|
|
14074
14639
|
id: "systemMsg",
|
|
@@ -14081,11 +14646,11 @@ function TeamForm({
|
|
|
14081
14646
|
)
|
|
14082
14647
|
] })
|
|
14083
14648
|
] }),
|
|
14084
|
-
/* @__PURE__ */ (0,
|
|
14085
|
-
/* @__PURE__ */ (0,
|
|
14086
|
-
/* @__PURE__ */ (0,
|
|
14087
|
-
/* @__PURE__ */ (0,
|
|
14088
|
-
/* @__PURE__ */ (0,
|
|
14649
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "space-y-4", children: [
|
|
14650
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)("h3", { className: "text-lg font-semibold", children: "Team Configuration" }),
|
|
14651
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: [
|
|
14652
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
14653
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14089
14654
|
Switch,
|
|
14090
14655
|
{
|
|
14091
14656
|
id: "useProjects",
|
|
@@ -14094,10 +14659,10 @@ function TeamForm({
|
|
|
14094
14659
|
disabled: isLoading || !editMode
|
|
14095
14660
|
}
|
|
14096
14661
|
),
|
|
14097
|
-
/* @__PURE__ */ (0,
|
|
14662
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "useProjects", children: "Enable Projects" })
|
|
14098
14663
|
] }),
|
|
14099
|
-
/* @__PURE__ */ (0,
|
|
14100
|
-
/* @__PURE__ */ (0,
|
|
14664
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
14665
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14101
14666
|
Switch,
|
|
14102
14667
|
{
|
|
14103
14668
|
id: "useKnowledge",
|
|
@@ -14106,10 +14671,10 @@ function TeamForm({
|
|
|
14106
14671
|
disabled: isLoading || !editMode
|
|
14107
14672
|
}
|
|
14108
14673
|
),
|
|
14109
|
-
/* @__PURE__ */ (0,
|
|
14674
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "useKnowledge", children: "Enable Knowledge Base" })
|
|
14110
14675
|
] }),
|
|
14111
|
-
/* @__PURE__ */ (0,
|
|
14112
|
-
/* @__PURE__ */ (0,
|
|
14676
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
14677
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14113
14678
|
Switch,
|
|
14114
14679
|
{
|
|
14115
14680
|
id: "useFiles",
|
|
@@ -14118,10 +14683,10 @@ function TeamForm({
|
|
|
14118
14683
|
disabled: isLoading || !editMode
|
|
14119
14684
|
}
|
|
14120
14685
|
),
|
|
14121
|
-
/* @__PURE__ */ (0,
|
|
14686
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "useFiles", children: "Enable File Management" })
|
|
14122
14687
|
] }),
|
|
14123
|
-
/* @__PURE__ */ (0,
|
|
14124
|
-
/* @__PURE__ */ (0,
|
|
14688
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
14689
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(
|
|
14125
14690
|
Switch,
|
|
14126
14691
|
{
|
|
14127
14692
|
id: "useChat",
|
|
@@ -14130,29 +14695,29 @@ function TeamForm({
|
|
|
14130
14695
|
disabled: isLoading || !editMode
|
|
14131
14696
|
}
|
|
14132
14697
|
),
|
|
14133
|
-
/* @__PURE__ */ (0,
|
|
14698
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Label3, { htmlFor: "useChat", children: "Enable Team Chat" })
|
|
14134
14699
|
] })
|
|
14135
14700
|
] })
|
|
14136
14701
|
] }),
|
|
14137
|
-
/* @__PURE__ */ (0,
|
|
14138
|
-
/* @__PURE__ */ (0,
|
|
14139
|
-
!editMode ? /* @__PURE__ */ (0,
|
|
14140
|
-
/* @__PURE__ */ (0,
|
|
14702
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsxs)("div", { className: "flex justify-end gap-2 pt-4 border-t", children: [
|
|
14703
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Button, { type: "button", variant: "outline", onClick: onCancel, disabled: isLoading, children: !editMode ? "Close" : cancelLabel }),
|
|
14704
|
+
!editMode ? /* @__PURE__ */ (0, import_jsx_runtime77.jsxs)(Button, { type: "button", onClick: handleEditToggle, disabled: isLoading, className: "gap-2", children: [
|
|
14705
|
+
/* @__PURE__ */ (0, import_jsx_runtime77.jsx)(import_lucide_react43.Edit, { className: "h-4 w-4" }),
|
|
14141
14706
|
"Edit"
|
|
14142
|
-
] }) : /* @__PURE__ */ (0,
|
|
14707
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime77.jsx)(Button, { type: "submit", disabled: isLoading || !formData.name?.trim(), children: isLoading ? "Saving..." : buttonLabel })
|
|
14143
14708
|
] })
|
|
14144
14709
|
] })
|
|
14145
14710
|
] });
|
|
14146
14711
|
}
|
|
14147
14712
|
|
|
14148
14713
|
// src/components/Foundry/Views/TeamsIndexView.tsx
|
|
14149
|
-
var
|
|
14714
|
+
var import_jsx_runtime78 = require("react/jsx-runtime");
|
|
14150
14715
|
function TeamsIndexView({
|
|
14151
14716
|
teams = [],
|
|
14152
14717
|
onCreateTeam,
|
|
14153
14718
|
onTeamOpen
|
|
14154
14719
|
}) {
|
|
14155
|
-
const [isNewTeamDialogOpen, setIsNewTeamDialogOpen] = (0,
|
|
14720
|
+
const [isNewTeamDialogOpen, setIsNewTeamDialogOpen] = (0, import_react60.useState)(false);
|
|
14156
14721
|
const handleNewTeamClick = () => {
|
|
14157
14722
|
setIsNewTeamDialogOpen(true);
|
|
14158
14723
|
};
|
|
@@ -14166,16 +14731,16 @@ function TeamsIndexView({
|
|
|
14166
14731
|
const handleTeamOpen = (team) => {
|
|
14167
14732
|
onTeamOpen?.(team);
|
|
14168
14733
|
};
|
|
14169
|
-
return /* @__PURE__ */ (0,
|
|
14170
|
-
/* @__PURE__ */ (0,
|
|
14171
|
-
|
|
14734
|
+
return /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
14735
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(import_react61.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(
|
|
14736
|
+
import_react61.motion.div,
|
|
14172
14737
|
{
|
|
14173
14738
|
initial: { opacity: 0, y: 10 },
|
|
14174
14739
|
animate: { opacity: 1, y: 0 },
|
|
14175
14740
|
exit: { opacity: 0, y: -10 },
|
|
14176
14741
|
transition: { duration: 0.2 },
|
|
14177
14742
|
children: [
|
|
14178
|
-
/* @__PURE__ */ (0,
|
|
14743
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
|
|
14179
14744
|
DashboardHero,
|
|
14180
14745
|
{
|
|
14181
14746
|
title: "My Teams",
|
|
@@ -14187,23 +14752,23 @@ function TeamsIndexView({
|
|
|
14187
14752
|
}
|
|
14188
14753
|
}
|
|
14189
14754
|
),
|
|
14190
|
-
/* @__PURE__ */ (0,
|
|
14191
|
-
/* @__PURE__ */ (0,
|
|
14192
|
-
teams.length === 0 ? /* @__PURE__ */ (0,
|
|
14193
|
-
/* @__PURE__ */ (0,
|
|
14194
|
-
/* @__PURE__ */ (0,
|
|
14195
|
-
] }) : /* @__PURE__ */ (0,
|
|
14755
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("section", { className: "space-y-4 mt-8", children: [
|
|
14756
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("h2", { className: "text-2xl font-semibold", children: "Active Teams" }),
|
|
14757
|
+
teams.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)("div", { className: "text-center py-12", children: [
|
|
14758
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("p", { className: "text-muted-foreground text-lg", children: "You're not part of any teams yet." }),
|
|
14759
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("p", { className: "text-muted-foreground text-sm mt-2", children: "Create a new team or ask to be added to an existing one." })
|
|
14760
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3", children: teams.map((team) => /* @__PURE__ */ (0, import_jsx_runtime78.jsx)(TeamCard, { team, onOpen: handleTeamOpen }, team.id)) })
|
|
14196
14761
|
] })
|
|
14197
14762
|
]
|
|
14198
14763
|
},
|
|
14199
14764
|
"teams-index-view"
|
|
14200
14765
|
) }),
|
|
14201
|
-
/* @__PURE__ */ (0,
|
|
14202
|
-
/* @__PURE__ */ (0,
|
|
14203
|
-
/* @__PURE__ */ (0,
|
|
14204
|
-
/* @__PURE__ */ (0,
|
|
14766
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(Dialog, { open: isNewTeamDialogOpen, onOpenChange: setIsNewTeamDialogOpen, children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(DialogContent, { className: "max-w-4xl max-h-[90vh] overflow-y-auto", children: [
|
|
14767
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)("div", { className: "sr-only", children: /* @__PURE__ */ (0, import_jsx_runtime78.jsxs)(DialogHeader, { children: [
|
|
14768
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(DialogTitle, { children: "Create New Team" }),
|
|
14769
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(DialogDescription, { children: "Set up a new team to collaborate with colleagues on projects." })
|
|
14205
14770
|
] }) }),
|
|
14206
|
-
/* @__PURE__ */ (0,
|
|
14771
|
+
/* @__PURE__ */ (0, import_jsx_runtime78.jsx)(
|
|
14207
14772
|
TeamForm,
|
|
14208
14773
|
{
|
|
14209
14774
|
title: "Create New Team",
|