cortex-react-components 3.3.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SSDRUPMS.mjs → chunk-2BKXIIFJ.mjs} +183 -36
- package/dist/{chunk-XFJPL6FS.mjs → chunk-3DWDGYDG.mjs} +1 -1
- package/dist/{chunk-WX5QYPGU.mjs → chunk-3K6EVFOW.mjs} +1 -1
- package/dist/{chunk-HLEMFDTD.mjs → chunk-3R2LCGLI.mjs} +1 -1
- package/dist/{chunk-JFXWP3RQ.mjs → chunk-3RYHYKVQ.mjs} +1 -1
- package/dist/{chunk-VMYEV3FG.mjs → chunk-4YRR74Y4.mjs} +1 -1
- package/dist/{chunk-PJZ5PWKP.mjs → chunk-5OGDBGXG.mjs} +1 -1
- package/dist/{chunk-I4MTJN23.mjs → chunk-6A7T3O6T.mjs} +6 -5
- package/dist/{chunk-KIZUBPPQ.mjs → chunk-6GO5N6ZP.mjs} +1 -1
- package/dist/{chunk-EJJITIA3.mjs → chunk-6LF4K7ER.mjs} +4 -4
- package/dist/{chunk-URC56DLC.mjs → chunk-6S7EQDLL.mjs} +1 -1
- package/dist/{chunk-EC5I4CIO.mjs → chunk-7HHLKQE4.mjs} +2 -2
- package/dist/{chunk-RFQKQLNT.mjs → chunk-7LM2P6N3.mjs} +4 -4
- package/dist/{chunk-IJ3E6ZXF.mjs → chunk-AZ5MV7NO.mjs} +1 -1
- package/dist/{chunk-V6YEUAIH.mjs → chunk-CV7GOXGO.mjs} +2 -2
- package/dist/{chunk-L4SNPNYU.mjs → chunk-D3AHBPI5.mjs} +2 -2
- package/dist/{chunk-FABRRO2B.mjs → chunk-DRLNETNN.mjs} +1 -1
- package/dist/{chunk-OXP3LJ53.mjs → chunk-DVWMM7AI.mjs} +4 -4
- package/dist/{chunk-HUZCVQP7.mjs → chunk-EEVXIKNB.mjs} +1 -1
- package/dist/{chunk-Z54HOXSV.mjs → chunk-ETV6EEYB.mjs} +1 -1
- package/dist/{chunk-EDYFH3EJ.mjs → chunk-F6SQTC6R.mjs} +4 -4
- package/dist/{chunk-IVOPNDSN.mjs → chunk-G5N5MCLS.mjs} +5 -5
- package/dist/{chunk-NVSA5BFC.mjs → chunk-GR45UN4U.mjs} +2 -2
- package/dist/{chunk-QETXXFRW.mjs → chunk-HNVHGBNE.mjs} +1 -1
- package/dist/{chunk-QPO45D6F.mjs → chunk-I2MVZVXE.mjs} +1 -1
- package/dist/chunk-IC4N2KYF.mjs +401 -0
- package/dist/{chunk-MZVEK6A5.mjs → chunk-IM5B557Z.mjs} +16 -16
- package/dist/{chunk-Q6CUUDUR.mjs → chunk-IQ67MHAY.mjs} +1 -1
- package/dist/{chunk-OCVHSV6Z.mjs → chunk-IWQEM5KO.mjs} +2 -2
- package/dist/{chunk-TDOOQIMQ.mjs → chunk-J5GM5CJK.mjs} +2 -2
- package/dist/chunk-JCSRFM37.mjs +595 -0
- package/dist/{chunk-QMFGV3M5.mjs → chunk-JOGVCBYP.mjs} +1 -1
- package/dist/{chunk-4P5Q6UXF.mjs → chunk-JWMQOARK.mjs} +1 -1
- package/dist/{chunk-DSVXGGGV.mjs → chunk-K5ZNBHQO.mjs} +1 -1
- package/dist/{chunk-YY4VLYYH.mjs → chunk-KJVAS4I7.mjs} +26 -11
- package/dist/{chunk-XZFMQXYJ.mjs → chunk-KMGTUNRZ.mjs} +1 -1
- package/dist/{chunk-ETG5N2OG.mjs → chunk-KYY7BMXI.mjs} +1 -1
- package/dist/{chunk-SSE3MQDP.mjs → chunk-LRMDRQRJ.mjs} +2 -2
- package/dist/{chunk-LGGOEYDB.mjs → chunk-LRTEGIZ7.mjs} +10 -10
- package/dist/{chunk-XGHUG2WQ.mjs → chunk-MDG2I4PB.mjs} +1 -1
- package/dist/{chunk-HMVIQFLN.mjs → chunk-N5HTSJLI.mjs} +1 -1
- package/dist/{chunk-IDMTHUC4.mjs → chunk-N5Q2DYUR.mjs} +1 -1
- package/dist/{chunk-7ZCW4XMR.mjs → chunk-NSYYRG6A.mjs} +1 -1
- package/dist/{chunk-CONYNX7Y.mjs → chunk-NUAJQK4H.mjs} +1 -1
- package/dist/{chunk-LM4J7254.mjs → chunk-OR3XMMEK.mjs} +9 -9
- package/dist/{chunk-EGZL4DVZ.mjs → chunk-PAXCURFR.mjs} +1 -1
- package/dist/{chunk-RC6YHGVV.mjs → chunk-PE7KJR4A.mjs} +1 -1
- package/dist/{chunk-LTDXFLCW.mjs → chunk-QDO6BAAN.mjs} +12 -4
- package/dist/{chunk-NQMJXY3N.mjs → chunk-QJGBUBSB.mjs} +1 -1
- package/dist/{chunk-YD7Q7IZX.mjs → chunk-QJQ66DYZ.mjs} +1 -1
- package/dist/{chunk-WJTVZ6CB.mjs → chunk-RNHGLZYP.mjs} +1 -1
- package/dist/{chunk-2D3EN2AX.mjs → chunk-SJI6X5DK.mjs} +2 -2
- package/dist/{chunk-4JHX6BW6.mjs → chunk-TZH6L2OH.mjs} +1 -1
- package/dist/{chunk-OPJMXB4K.mjs → chunk-UCK4TW63.mjs} +4 -4
- package/dist/{chunk-36W3BORX.mjs → chunk-WAR2OXXK.mjs} +1 -1
- package/dist/{chunk-SM57JU3T.mjs → chunk-WZBXR7J3.mjs} +5 -5
- package/dist/{chunk-LPK5R32M.mjs → chunk-X4GP2O3Y.mjs} +1 -1
- package/dist/{chunk-6NRBLKM4.mjs → chunk-XCZCWSOY.mjs} +2 -2
- package/dist/{chunk-KOK3VCJZ.mjs → chunk-Y4KJTMKO.mjs} +1 -1
- package/dist/{chunk-YFOEG4PP.mjs → chunk-Z6MYLHDW.mjs} +1 -1
- package/dist/components/AdvancedComponents/AppSidebar.d.ts +1 -1
- package/dist/components/AdvancedComponents/AppSidebar.js +480 -301
- package/dist/components/AdvancedComponents/AppSidebar.mjs +3 -3
- package/dist/components/AdvancedComponents/index.js +480 -301
- package/dist/components/AdvancedComponents/index.mjs +3 -3
- package/dist/components/Blocks/Banner.mjs +8 -8
- package/dist/components/Blocks/CallToAction.mjs +8 -8
- package/dist/components/Blocks/CollapsibleArea.mjs +9 -9
- package/dist/components/Blocks/Content.mjs +9 -9
- package/dist/components/Blocks/FeaturesBlock.mjs +8 -8
- package/dist/components/Blocks/ImageBlock.mjs +3 -3
- package/dist/components/Blocks/MediaBlock.mjs +3 -3
- package/dist/components/Blocks/RelatedPosts.mjs +10 -10
- package/dist/components/Blocks/RenderBlocks.mjs +11 -11
- package/dist/components/Blocks/ReusableContentBlock.mjs +11 -11
- package/dist/components/Blocks/index.mjs +18 -18
- package/dist/components/CRM/index.mjs +3 -3
- package/dist/components/Cards/ContentCard.mjs +8 -8
- package/dist/components/Cards/FeatureCard.mjs +8 -8
- package/dist/components/Cards/index.mjs +14 -14
- package/dist/components/Chat/ChatInterface.mjs +11 -11
- package/dist/components/Chat/CopilotInterface.d.ts +1 -1
- package/dist/components/Chat/CopilotInterface.js +527 -330
- package/dist/components/Chat/CopilotInterface.mjs +16 -16
- 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 +527 -330
- package/dist/components/Chat/demo-long-messages.mjs +16 -16
- package/dist/components/Chat/demo-tests.js +527 -330
- package/dist/components/Chat/demo-tests.mjs +16 -16
- package/dist/components/Chat/demo.js +527 -330
- package/dist/components/Chat/demo.mjs +16 -16
- package/dist/components/Chat/example-usage.js +527 -330
- package/dist/components/Chat/example-usage.mjs +16 -16
- package/dist/components/Chat/example-with-vercel-ai.js +527 -330
- package/dist/components/Chat/example-with-vercel-ai.mjs +16 -16
- package/dist/components/Chat/index.js +527 -330
- package/dist/components/Chat/index.mjs +21 -21
- package/dist/components/DeliveryLead/DeliveryLeadSubmissionWithList.mjs +2 -2
- package/dist/components/DeliveryLead/index.mjs +4 -4
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.d.ts +1 -9
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.js +22 -27
- package/dist/components/DigitalColleagues/Views/TeamsIndexView.mjs +4 -6
- 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/AppSidebarLeft.mjs +3 -3
- package/dist/components/Foundry/Knowledge/add-knowledge-modal.mjs +3 -3
- package/dist/components/Foundry/Knowledge/add-team-context.mjs +3 -3
- package/dist/components/Foundry/MainPage.mjs +7 -7
- package/dist/components/Foundry/ManagementSidebar.d.ts +2 -2
- package/dist/components/Foundry/ManagementSidebar.js +11 -3
- package/dist/components/Foundry/ManagementSidebar.mjs +1 -1
- package/dist/components/Foundry/Pages/dashboardpage.js +1423 -2039
- package/dist/components/Foundry/Pages/dashboardpage.mjs +23 -24
- package/dist/components/Foundry/RichText/index.mjs +3 -3
- package/dist/components/Foundry/RichText/plugins/toolbar-plugin.mjs +2 -2
- package/dist/components/Foundry/Views/ColleaguesView.js +5 -4
- package/dist/components/Foundry/Views/ColleaguesView.mjs +3 -3
- package/dist/components/Foundry/Views/KnowledgeView.mjs +10 -10
- package/dist/components/Foundry/Views/TeamsIndexView.js +5 -4
- package/dist/components/Foundry/Views/TeamsIndexView.mjs +4 -4
- package/dist/components/Foundry/Views/index.js +1350 -785
- 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.mjs +4 -4
- package/dist/components/Foundry/document-preview-examples.mjs +5 -5
- package/dist/components/Foundry/document-preview.mjs +5 -5
- package/dist/components/Foundry/file-edit.mjs +7 -7
- package/dist/components/Foundry/foundary-layout.js +480 -301
- package/dist/components/Foundry/foundary-layout.mjs +4 -4
- package/dist/components/Foundry/index.js +2746 -2866
- package/dist/components/Foundry/index.mjs +78 -79
- package/dist/components/Foundry/knowledge-browser.mjs +6 -6
- package/dist/components/Foundry/types.d.ts +26 -0
- package/dist/components/HeaderFooter/Header.mjs +1 -1
- package/dist/components/HeaderFooter/SectionHeading.mjs +9 -9
- 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 +9 -9
- package/dist/components/Heros/LowImpact/index.mjs +9 -9
- package/dist/components/Heros/MediumImpact/index.mjs +9 -9
- package/dist/components/Heros/PostHero/index.mjs +3 -3
- package/dist/components/Heros/RenderHero.mjs +12 -12
- package/dist/components/Heros/index.js +5 -4
- package/dist/components/Heros/index.mjs +19 -19
- package/dist/components/Layouts/OutputHeaderFooter.mjs +11 -11
- package/dist/components/Layouts/Print.mjs +15 -15
- package/dist/components/Layouts/SlideShow.mjs +17 -17
- package/dist/components/Layouts/index.mjs +21 -21
- package/dist/components/Menus/SidebarLeft.mjs +3 -3
- package/dist/components/Menus/SidebarLeftMulti.mjs +3 -3
- package/dist/components/Menus/SidebarRight.mjs +3 -3
- package/dist/components/Menus/index.mjs +5 -5
- package/dist/components/Payload/CollectionArchive/index.mjs +4 -4
- package/dist/components/Payload/Media/index.mjs +2 -2
- package/dist/components/Payload/PayloadCard/index.mjs +3 -3
- package/dist/components/Payload/RichText/index.mjs +8 -8
- package/dist/components/Payload/RichText/serialize.mjs +8 -8
- package/dist/components/Payload/index.mjs +10 -10
- 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 +46 -4
- package/dist/components/Projects/FileView.js +5 -4
- package/dist/components/Projects/FileView.mjs +11 -11
- 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 +5 -4
- package/dist/components/Projects/KanbanBoardView.mjs +16 -16
- package/dist/components/Projects/KanbanColumn.d.ts +1 -1
- package/dist/components/Projects/PlanningView.js +5 -4
- package/dist/components/Projects/PlanningView.mjs +3 -3
- package/dist/components/Projects/ProjectPage.d.ts +2 -2
- package/dist/components/Projects/ProjectPage.js +1725 -964
- package/dist/components/Projects/ProjectPage.mjs +29 -28
- package/dist/components/Projects/ProjectView.d.ts +1 -1
- package/dist/components/Projects/ProjectView.js +1207 -642
- package/dist/components/Projects/ProjectView.mjs +24 -23
- package/dist/components/Projects/ProjectsIndexView.js +5 -4
- package/dist/components/Projects/ProjectsIndexView.mjs +4 -4
- package/dist/components/Projects/SprintBoardView.d.ts +3 -0
- package/dist/components/Projects/SprintBoardView.js +251 -109
- package/dist/components/Projects/SprintBoardView.mjs +16 -16
- package/dist/components/Projects/TaskDetailsModal.mjs +10 -10
- package/dist/components/Projects/TasksView.js +5 -4
- package/dist/components/Projects/TasksView.mjs +3 -3
- 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.mjs +8 -8
- package/dist/components/Projects/index.js +537 -230
- package/dist/components/Projects/index.mjs +24 -24
- 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 +497 -325
- package/dist/components/dc-temp/dashboard-integration-example.mjs +6 -6
- package/dist/components/dc-temp/index.d.ts +3 -3
- package/dist/components/dc-temp/index.js +3745 -2979
- 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 +4128 -4209
- package/dist/components/index.mjs +176 -178
- package/dist/components/ui/index.mjs +9 -9
- package/dist/components/ui/sidebar.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 +4124 -4205
- package/dist/index.mjs +187 -189
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/pages/Blog.mjs +15 -15
- package/dist/pages/Documentation.mjs +7 -7
- package/dist/pages/IndexPage.mjs +20 -20
- package/dist/pages/Intranet.mjs +4 -4
- package/dist/pages/LandingPage.mjs +113 -115
- package/dist/pages/Page.mjs +19 -19
- package/dist/pages/Publish.mjs +104 -106
- package/dist/pages/Website.mjs +20 -20
- package/dist/sections/AboutSection.mjs +10 -10
- package/dist/sections/BlogDetail.mjs +9 -9
- package/dist/sections/BlogList.mjs +10 -10
- package/dist/sections/BlogListSection.mjs +5 -5
- package/dist/sections/ContactSection.mjs +10 -10
- package/dist/sections/PageSections.mjs +113 -115
- package/dist/sections/PricingSection.mjs +10 -10
- package/dist/sections/ServiceDetail.mjs +9 -9
- package/dist/sections/ServiceDetailSection.mjs +9 -9
- 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-GGOGMLBY.mjs → chunk-AKMJBGUU.mjs} +3 -3
- package/dist/{chunk-AEFGMCK3.mjs → chunk-D5KV6INF.mjs} +3 -3
- package/dist/{chunk-SNG6OKEL.mjs → chunk-FTVOJKVA.mjs} +3 -3
- package/dist/{chunk-GZGWWPCP.mjs → chunk-L666B5DN.mjs} +12 -12
- package/dist/{chunk-2YHN7ZCJ.mjs → chunk-NKRBXAPF.mjs} +3 -3
- /package/dist/components/{DigitalColleagues/AppSidebarLeft.css → Foundry/app-card.css} +0 -0
- /package/dist/components/{DigitalColleagues/DashboardHeader.css → Projects/GanttView.css} +0 -0
|
@@ -38,9 +38,9 @@ __export(ProjectView_exports, {
|
|
|
38
38
|
default: () => ProjectView
|
|
39
39
|
});
|
|
40
40
|
module.exports = __toCommonJS(ProjectView_exports);
|
|
41
|
-
var
|
|
41
|
+
var import_react30 = require("react");
|
|
42
42
|
|
|
43
|
-
// src/components/
|
|
43
|
+
// src/components/Foundry/ManagementSidebar.tsx
|
|
44
44
|
var import_lucide_react = require("lucide-react");
|
|
45
45
|
var import_jsx_runtime = require("react/jsx-runtime");
|
|
46
46
|
var viewConfig = [
|
|
@@ -79,6 +79,14 @@ var viewConfig = [
|
|
|
79
79
|
label: "Tasks",
|
|
80
80
|
color: "bg-brand-cyan",
|
|
81
81
|
title: "Tasks"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
key: "gantt",
|
|
85
|
+
icon: import_lucide_react.BarChart2,
|
|
86
|
+
label: "Gantt",
|
|
87
|
+
color: "bg-brand-blue",
|
|
88
|
+
title: "Gantt Chart",
|
|
89
|
+
hiddenOnMobile: true
|
|
82
90
|
}
|
|
83
91
|
];
|
|
84
92
|
var ManagementSidebar = ({
|
|
@@ -87,14 +95,14 @@ var ManagementSidebar = ({
|
|
|
87
95
|
children
|
|
88
96
|
}) => {
|
|
89
97
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex w-full h-screen", children: [
|
|
90
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-12 h-full bg-sidebar-background flex flex-col flex-shrink-0", children: viewConfig.map((view) => {
|
|
98
|
+
/* @__PURE__ */ (0, import_jsx_runtime.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) => {
|
|
91
99
|
const Icon2 = view.icon;
|
|
92
100
|
const isActive = currentView === view.key;
|
|
93
101
|
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
94
102
|
"button",
|
|
95
103
|
{
|
|
96
104
|
onClick: () => onViewChange(view.key),
|
|
97
|
-
className: `flex-1 w-12 flex items-center justify-center text-sidebar-foreground transition-all duration-200 relative
|
|
105
|
+
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" : ""}`,
|
|
98
106
|
title: view.title,
|
|
99
107
|
children: [
|
|
100
108
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
@@ -104,7 +112,7 @@ var ManagementSidebar = ({
|
|
|
104
112
|
view.key
|
|
105
113
|
);
|
|
106
114
|
}) }),
|
|
107
|
-
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "flex-1 min-w-0 px-4 md:px-6 h-full overflow-auto", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "w-full h-full", children }) })
|
|
115
|
+
/* @__PURE__ */ (0, import_jsx_runtime.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_runtime.jsx)("div", { className: "w-full h-full", children }) })
|
|
108
116
|
] });
|
|
109
117
|
};
|
|
110
118
|
|
|
@@ -4940,8 +4948,8 @@ function ToolbarPlugin() {
|
|
|
4940
4948
|
blockNode = curr;
|
|
4941
4949
|
}
|
|
4942
4950
|
if (blockNode) {
|
|
4943
|
-
const
|
|
4944
|
-
setAlignment(
|
|
4951
|
+
const format3 = blockNode.getFormatType();
|
|
4952
|
+
setAlignment(format3 || "left");
|
|
4945
4953
|
}
|
|
4946
4954
|
const tag = anchorNode.getTopLevelElement()?.__tag;
|
|
4947
4955
|
setBlockType(tag || "p");
|
|
@@ -5990,7 +5998,7 @@ var markdownToLexical = (markdown) => {
|
|
|
5990
5998
|
var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
5991
5999
|
let content = "";
|
|
5992
6000
|
let richTextContent = void 0;
|
|
5993
|
-
let
|
|
6001
|
+
let format3 = "text";
|
|
5994
6002
|
if (file.url) {
|
|
5995
6003
|
try {
|
|
5996
6004
|
let url = file.url;
|
|
@@ -6011,18 +6019,18 @@ var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
|
6011
6019
|
console.warn("No URL provided for file:", file.name);
|
|
6012
6020
|
}
|
|
6013
6021
|
if (file.mimeType === "text/markdown") {
|
|
6014
|
-
|
|
6022
|
+
format3 = "richText";
|
|
6015
6023
|
richTextContent = markdownToLexical(content);
|
|
6016
6024
|
} else if (file.mimeType?.startsWith("text/")) {
|
|
6017
|
-
|
|
6025
|
+
format3 = "text";
|
|
6018
6026
|
}
|
|
6019
6027
|
return {
|
|
6020
6028
|
id: file.id.toString(),
|
|
6021
6029
|
title: file.name,
|
|
6022
6030
|
description: void 0,
|
|
6023
|
-
content:
|
|
6024
|
-
richTextContent:
|
|
6025
|
-
format:
|
|
6031
|
+
content: format3 === "richText" ? void 0 : content,
|
|
6032
|
+
richTextContent: format3 === "richText" ? richTextContent : void 0,
|
|
6033
|
+
format: format3,
|
|
6026
6034
|
metadata: {},
|
|
6027
6035
|
createdAt: typeof file.createdAt === "string" ? new Date(file.createdAt) : file.createdAt,
|
|
6028
6036
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -6072,8 +6080,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
6072
6080
|
setRichTextContent(document2.richTextContent);
|
|
6073
6081
|
}
|
|
6074
6082
|
}, [document2]);
|
|
6075
|
-
const formatIcon = (
|
|
6076
|
-
switch (
|
|
6083
|
+
const formatIcon = (format3) => {
|
|
6084
|
+
switch (format3) {
|
|
6077
6085
|
case "markdown":
|
|
6078
6086
|
case "mdx":
|
|
6079
6087
|
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react11.FileText, { className: "h-6 w-6 text-primary" });
|
|
@@ -6085,8 +6093,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
6085
6093
|
return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_lucide_react11.File, { className: "h-6 w-6 text-muted-foreground" });
|
|
6086
6094
|
}
|
|
6087
6095
|
};
|
|
6088
|
-
const formatBadgeColor = (
|
|
6089
|
-
switch (
|
|
6096
|
+
const formatBadgeColor = (format3) => {
|
|
6097
|
+
switch (format3) {
|
|
6090
6098
|
case "markdown":
|
|
6091
6099
|
return "bg-primary/10 text-primary border-primary/20";
|
|
6092
6100
|
case "mdx":
|
|
@@ -6934,15 +6942,16 @@ function useLocalStorage(key, initialValue) {
|
|
|
6934
6942
|
return initialValue;
|
|
6935
6943
|
}
|
|
6936
6944
|
});
|
|
6937
|
-
const setValue = (value) => {
|
|
6945
|
+
const setValue = (0, import_react18.useCallback)((value) => {
|
|
6938
6946
|
try {
|
|
6939
|
-
|
|
6947
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
6948
|
+
setStoredValue(valueToStore);
|
|
6940
6949
|
if (typeof window !== "undefined") {
|
|
6941
|
-
window.localStorage.setItem(key, JSON.stringify(
|
|
6950
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
6942
6951
|
}
|
|
6943
6952
|
} catch (error) {
|
|
6944
6953
|
}
|
|
6945
|
-
};
|
|
6954
|
+
}, [key, storedValue]);
|
|
6946
6955
|
(0, import_react18.useEffect)(() => {
|
|
6947
6956
|
setValue(storedValue);
|
|
6948
6957
|
}, []);
|
|
@@ -7387,17 +7396,25 @@ var import_react22 = require("react");
|
|
|
7387
7396
|
var import_lucide_react16 = require("lucide-react");
|
|
7388
7397
|
var import_jsx_runtime45 = require("react/jsx-runtime");
|
|
7389
7398
|
var EpicsView = ({
|
|
7399
|
+
projectId,
|
|
7390
7400
|
tasks,
|
|
7391
7401
|
epics,
|
|
7392
7402
|
sprints,
|
|
7403
|
+
colleagues = [],
|
|
7393
7404
|
onUpdateTask,
|
|
7394
7405
|
onTaskClick,
|
|
7395
7406
|
onAddTaskToEpic,
|
|
7396
7407
|
onAddEpic,
|
|
7397
7408
|
onUpdateEpic,
|
|
7398
|
-
onDeleteEpic
|
|
7409
|
+
onDeleteEpic,
|
|
7410
|
+
onDeleteTask,
|
|
7411
|
+
onAddComment,
|
|
7412
|
+
onUploadFile,
|
|
7413
|
+
onDeleteFile,
|
|
7414
|
+
onFileUpdate
|
|
7399
7415
|
}) => {
|
|
7400
7416
|
const [availableEpics, setAvailableEpics] = (0, import_react22.useState)(epics);
|
|
7417
|
+
const [availableTasks, setAvailableTasks] = (0, import_react22.useState)(tasks);
|
|
7401
7418
|
const [draggedTask, setDraggedTask] = (0, import_react22.useState)(null);
|
|
7402
7419
|
const [editingEpic, setEditingEpic] = (0, import_react22.useState)(null);
|
|
7403
7420
|
const [editForm, setEditForm] = (0, import_react22.useState)({});
|
|
@@ -7405,16 +7422,29 @@ var EpicsView = ({
|
|
|
7405
7422
|
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react22.useState)(false);
|
|
7406
7423
|
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react22.useState)(false);
|
|
7407
7424
|
const [addTaskEpic, setAddTaskEpic] = (0, import_react22.useState)(null);
|
|
7425
|
+
const [selectedTask, setSelectedTask] = (0, import_react22.useState)(null);
|
|
7426
|
+
const [selectedEpicIds, setSelectedEpicIds] = useLocalStorage(
|
|
7427
|
+
`epicsView_selectedEpics${projectId ? `_${projectId}` : ""}`,
|
|
7428
|
+
[]
|
|
7429
|
+
);
|
|
7430
|
+
const [isEpicSelectorOpen, setIsEpicSelectorOpen] = (0, import_react22.useState)(false);
|
|
7408
7431
|
const heroRef = (0, import_react22.useRef)(null);
|
|
7409
7432
|
const containerRef = (0, import_react22.useRef)(null);
|
|
7410
7433
|
(0, import_react22.useEffect)(() => {
|
|
7411
7434
|
setAvailableEpics(epics);
|
|
7435
|
+
const validIds = new Set(epics.map((e) => e.id.toString()));
|
|
7436
|
+
setSelectedEpicIds((prev) => prev.filter((id) => validIds.has(id)));
|
|
7412
7437
|
}, [epics]);
|
|
7438
|
+
(0, import_react22.useEffect)(() => {
|
|
7439
|
+
setAvailableTasks(tasks);
|
|
7440
|
+
if (selectedTask) {
|
|
7441
|
+
setSelectedTask(tasks.find((t) => t.id === selectedTask.id) || null);
|
|
7442
|
+
}
|
|
7443
|
+
}, [tasks]);
|
|
7413
7444
|
(0, import_react22.useEffect)(() => {
|
|
7414
7445
|
const measureHeroHeight = () => {
|
|
7415
7446
|
if (heroRef.current) {
|
|
7416
|
-
|
|
7417
|
-
setHeroHeight(height);
|
|
7447
|
+
setHeroHeight(heroRef.current.offsetHeight);
|
|
7418
7448
|
}
|
|
7419
7449
|
};
|
|
7420
7450
|
measureHeroHeight();
|
|
@@ -7439,6 +7469,12 @@ var EpicsView = ({
|
|
|
7439
7469
|
}, 300);
|
|
7440
7470
|
return () => clearTimeout(timer);
|
|
7441
7471
|
}, [editingEpic]);
|
|
7472
|
+
const visibleEpics = selectedEpicIds.length === 0 ? availableEpics : availableEpics.filter((e) => selectedEpicIds.includes(e.id.toString()));
|
|
7473
|
+
const toggleEpicView = (epicId) => {
|
|
7474
|
+
setSelectedEpicIds(
|
|
7475
|
+
(prev) => prev.includes(epicId) ? prev.filter((id) => id !== epicId) : [...prev, epicId]
|
|
7476
|
+
);
|
|
7477
|
+
};
|
|
7442
7478
|
const handleDragStart = (task) => {
|
|
7443
7479
|
setDraggedTask(task);
|
|
7444
7480
|
};
|
|
@@ -7448,14 +7484,41 @@ var EpicsView = ({
|
|
|
7448
7484
|
const handleDrop = (e, epicId) => {
|
|
7449
7485
|
e.preventDefault();
|
|
7450
7486
|
if (draggedTask && extractId(draggedTask.epic).toString() !== epicId) {
|
|
7451
|
-
onUpdateTask(draggedTask.id.toString(), {
|
|
7452
|
-
|
|
7453
|
-
|
|
7487
|
+
onUpdateTask(draggedTask.id.toString(), { epic: Number(epicId) });
|
|
7488
|
+
setAvailableTasks(
|
|
7489
|
+
(prev) => prev.map((t) => t.id === draggedTask.id ? { ...t, epic: Number(epicId) } : t)
|
|
7490
|
+
);
|
|
7454
7491
|
setDraggedTask(null);
|
|
7455
7492
|
}
|
|
7456
7493
|
};
|
|
7457
7494
|
const getTasksByEpic = (epicId) => {
|
|
7458
|
-
return
|
|
7495
|
+
return availableTasks.filter((task) => extractId(task.epic).toString() === epicId);
|
|
7496
|
+
};
|
|
7497
|
+
const handleTaskClick = (task) => {
|
|
7498
|
+
setSelectedTask(task);
|
|
7499
|
+
onTaskClick?.(task);
|
|
7500
|
+
};
|
|
7501
|
+
const handleUpdateTask = async (taskId, updates) => {
|
|
7502
|
+
setAvailableTasks(
|
|
7503
|
+
(prev) => prev.map((t) => t.id === Number(taskId) ? { ...t, ...updates } : t)
|
|
7504
|
+
);
|
|
7505
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
7506
|
+
setSelectedTask((prev) => prev ? { ...prev, ...updates } : null);
|
|
7507
|
+
}
|
|
7508
|
+
await onUpdateTask(taskId, updates);
|
|
7509
|
+
};
|
|
7510
|
+
const handleDeleteTask = async (taskId) => {
|
|
7511
|
+
setAvailableTasks((prev) => prev.filter((t) => t.id !== Number(taskId)));
|
|
7512
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
7513
|
+
setSelectedTask(null);
|
|
7514
|
+
}
|
|
7515
|
+
await onDeleteTask?.(taskId);
|
|
7516
|
+
};
|
|
7517
|
+
const handleRemoveFromEpic = (task) => {
|
|
7518
|
+
onUpdateTask(task.id.toString(), { epic: null });
|
|
7519
|
+
setAvailableTasks(
|
|
7520
|
+
(prev) => prev.map((t) => t.id === task.id ? { ...t, epic: null } : t)
|
|
7521
|
+
);
|
|
7459
7522
|
};
|
|
7460
7523
|
const handleEditEpic = (epic) => {
|
|
7461
7524
|
setEditingEpic(epic.id.toString());
|
|
@@ -7464,19 +7527,15 @@ var EpicsView = ({
|
|
|
7464
7527
|
description: epic.description,
|
|
7465
7528
|
confidence: epic.confidence,
|
|
7466
7529
|
phase: epic.phase
|
|
7467
|
-
// progress: epic.progress || 0, // This is a number, not a string
|
|
7468
7530
|
});
|
|
7469
7531
|
};
|
|
7470
7532
|
const handleSaveEdit = async () => {
|
|
7471
7533
|
if (editingEpic && editForm.name) {
|
|
7472
7534
|
await onUpdateEpic(editingEpic.toString(), editForm);
|
|
7473
7535
|
setAvailableEpics(
|
|
7474
|
-
(prev) => prev.map(
|
|
7475
|
-
|
|
7476
|
-
|
|
7477
|
-
}
|
|
7478
|
-
return epic;
|
|
7479
|
-
})
|
|
7536
|
+
(prev) => prev.map(
|
|
7537
|
+
(epic) => epic.id.toString() === editingEpic ? { ...epic, ...editForm } : epic
|
|
7538
|
+
)
|
|
7480
7539
|
);
|
|
7481
7540
|
setEditingEpic(null);
|
|
7482
7541
|
setEditForm({});
|
|
@@ -7492,6 +7551,7 @@ var EpicsView = ({
|
|
|
7492
7551
|
)) {
|
|
7493
7552
|
await onDeleteEpic(epicId);
|
|
7494
7553
|
setAvailableEpics((prev) => prev.filter((epic) => epic.id.toString() !== epicId));
|
|
7554
|
+
setSelectedEpicIds((prev) => prev.filter((id) => id !== epicId));
|
|
7495
7555
|
}
|
|
7496
7556
|
};
|
|
7497
7557
|
const getPhaseLabel = (phase) => {
|
|
@@ -7534,218 +7594,315 @@ var EpicsView = ({
|
|
|
7534
7594
|
}
|
|
7535
7595
|
}
|
|
7536
7596
|
) }),
|
|
7537
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime45.
|
|
7597
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7538
7598
|
"div",
|
|
7539
7599
|
{
|
|
7540
|
-
className: "h-full overflow-y-auto",
|
|
7600
|
+
className: "h-full overflow-y-auto no-scrollbar",
|
|
7541
7601
|
style: {
|
|
7542
7602
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
7543
7603
|
},
|
|
7544
|
-
children:
|
|
7545
|
-
|
|
7546
|
-
|
|
7547
|
-
|
|
7548
|
-
|
|
7549
|
-
|
|
7550
|
-
|
|
7551
|
-
|
|
7552
|
-
|
|
7553
|
-
|
|
7554
|
-
|
|
7555
|
-
|
|
7556
|
-
|
|
7557
|
-
|
|
7558
|
-
|
|
7559
|
-
|
|
7560
|
-
|
|
7561
|
-
children: [
|
|
7562
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "p-4 border-b border-border", children: editingEpic === epic.id.toString() ? (
|
|
7563
|
-
/* Edit Mode */
|
|
7564
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "space-y-4", children: [
|
|
7565
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7566
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7567
|
-
Input,
|
|
7568
|
-
{
|
|
7569
|
-
value: editForm.name || "",
|
|
7570
|
-
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
7571
|
-
placeholder: "Epic name",
|
|
7572
|
-
className: "font-semibold"
|
|
7573
|
-
}
|
|
7574
|
-
),
|
|
7575
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex gap-2 ml-2", children: [
|
|
7576
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7577
|
-
Button,
|
|
7578
|
-
{
|
|
7579
|
-
size: "sm",
|
|
7580
|
-
variant: "ghost",
|
|
7581
|
-
onClick: handleSaveEdit,
|
|
7582
|
-
className: "p-1 h-8 w-8",
|
|
7583
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Check, { className: "h-4 w-4" })
|
|
7584
|
-
}
|
|
7585
|
-
),
|
|
7604
|
+
children: [
|
|
7605
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "mb-4", children: [
|
|
7606
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7607
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
7608
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { children: [
|
|
7609
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Epics" }),
|
|
7610
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "text-xs text-muted-foreground", children: selectedEpicIds.length === 0 ? "All showing" : `${selectedEpicIds.length}/${availableEpics.length} selected` })
|
|
7611
|
+
] }),
|
|
7612
|
+
selectedEpicIds.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
7613
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
7614
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleEpics.map((epic) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7615
|
+
"div",
|
|
7616
|
+
{
|
|
7617
|
+
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
7618
|
+
children: [
|
|
7619
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
7620
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "max-w-[80px] truncate", children: epic.name }),
|
|
7586
7621
|
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7587
|
-
|
|
7622
|
+
"button",
|
|
7588
7623
|
{
|
|
7589
|
-
|
|
7590
|
-
|
|
7591
|
-
onClick: handleCancelEdit,
|
|
7592
|
-
className: "p-1 h-8 w-8",
|
|
7624
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
7625
|
+
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
7593
7626
|
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.X, { className: "h-4 w-4" })
|
|
7594
7627
|
}
|
|
7595
7628
|
)
|
|
7596
|
-
]
|
|
7629
|
+
]
|
|
7630
|
+
},
|
|
7631
|
+
epic.id
|
|
7632
|
+
)) })
|
|
7633
|
+
] })
|
|
7634
|
+
] }),
|
|
7635
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7636
|
+
Button,
|
|
7637
|
+
{
|
|
7638
|
+
onClick: () => setIsEpicSelectorOpen(!isEpicSelectorOpen),
|
|
7639
|
+
variant: "outline",
|
|
7640
|
+
size: "sm",
|
|
7641
|
+
className: "gap-1",
|
|
7642
|
+
children: [
|
|
7643
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Layers, { className: "h-3 w-3" }),
|
|
7644
|
+
isEpicSelectorOpen ? "Close" : "Select"
|
|
7645
|
+
]
|
|
7646
|
+
}
|
|
7647
|
+
)
|
|
7648
|
+
] }) }),
|
|
7649
|
+
isEpicSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7650
|
+
"div",
|
|
7651
|
+
{
|
|
7652
|
+
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
7653
|
+
onClick: () => setIsEpicSelectorOpen(false)
|
|
7654
|
+
}
|
|
7655
|
+
),
|
|
7656
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7657
|
+
"div",
|
|
7658
|
+
{
|
|
7659
|
+
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"}`,
|
|
7660
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
7661
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
7662
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7663
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Epics" }),
|
|
7664
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7665
|
+
Button,
|
|
7666
|
+
{
|
|
7667
|
+
variant: "ghost",
|
|
7668
|
+
size: "sm",
|
|
7669
|
+
onClick: () => setIsEpicSelectorOpen(false),
|
|
7670
|
+
className: "h-8 w-8 p-0",
|
|
7671
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.X, { className: "h-4 w-4" })
|
|
7672
|
+
}
|
|
7673
|
+
)
|
|
7597
7674
|
] }),
|
|
7598
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7599
|
-
|
|
7675
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Filter which epics to display. Select none to show all." })
|
|
7676
|
+
] }),
|
|
7677
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto no-scrollbar", children: availableEpics.length > 0 ? availableEpics.map((epic) => {
|
|
7678
|
+
const isSelected = selectedEpicIds.includes(epic.id.toString());
|
|
7679
|
+
const taskCount = availableTasks.filter(
|
|
7680
|
+
(t) => extractId(t.epic) === epic.id
|
|
7681
|
+
).length;
|
|
7682
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7683
|
+
"div",
|
|
7600
7684
|
{
|
|
7601
|
-
|
|
7602
|
-
|
|
7603
|
-
|
|
7604
|
-
|
|
7605
|
-
|
|
7606
|
-
|
|
7607
|
-
|
|
7608
|
-
|
|
7609
|
-
|
|
7610
|
-
|
|
7611
|
-
|
|
7612
|
-
|
|
7613
|
-
|
|
7614
|
-
|
|
7615
|
-
|
|
7616
|
-
|
|
7617
|
-
|
|
7618
|
-
|
|
7619
|
-
|
|
7620
|
-
|
|
7621
|
-
|
|
7622
|
-
|
|
7623
|
-
|
|
7624
|
-
|
|
7625
|
-
|
|
7626
|
-
|
|
7627
|
-
|
|
7628
|
-
|
|
7629
|
-
|
|
7630
|
-
|
|
7631
|
-
|
|
7632
|
-
|
|
7633
|
-
|
|
7634
|
-
|
|
7635
|
-
|
|
7636
|
-
|
|
7637
|
-
|
|
7638
|
-
|
|
7639
|
-
|
|
7640
|
-
|
|
7641
|
-
|
|
7642
|
-
|
|
7643
|
-
|
|
7644
|
-
|
|
7645
|
-
|
|
7646
|
-
|
|
7647
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
7648
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: `w-4 h-4 rounded-full ${epic.color}` }),
|
|
7649
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h3", { className: "font-semibold text-foreground select-none flex-1", children: epic.name }),
|
|
7650
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex gap-1", children: [
|
|
7685
|
+
className: `p-3 rounded-lg border transition-all ${isSelected ? "bg-primary/10 border-primary/30 ring-1 ring-primary/20" : "bg-card border-border"}`,
|
|
7686
|
+
children: [
|
|
7687
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7688
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
7689
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
7690
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "font-medium text-sm text-foreground truncate", children: epic.name })
|
|
7691
|
+
] }),
|
|
7692
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "ml-2 flex items-center gap-1", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Badge, { variant: "secondary", className: "text-xs", children: taskCount }) })
|
|
7693
|
+
] }),
|
|
7694
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7695
|
+
Button,
|
|
7696
|
+
{
|
|
7697
|
+
variant: isSelected ? "default" : "outline",
|
|
7698
|
+
size: "sm",
|
|
7699
|
+
className: "w-full mt-2 text-xs h-7",
|
|
7700
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
7701
|
+
children: isSelected ? "Deselect" : "Select"
|
|
7702
|
+
}
|
|
7703
|
+
)
|
|
7704
|
+
]
|
|
7705
|
+
},
|
|
7706
|
+
epic.id
|
|
7707
|
+
);
|
|
7708
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "text-sm text-muted-foreground text-center py-8", children: "No epics yet. Add one to get started." }) }) })
|
|
7709
|
+
] })
|
|
7710
|
+
}
|
|
7711
|
+
)
|
|
7712
|
+
] }),
|
|
7713
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.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) => {
|
|
7714
|
+
const epicTasks = getTasksByEpic(epic.id.toString());
|
|
7715
|
+
const totalPoints = epicTasks.reduce(
|
|
7716
|
+
(sum, task) => sum + (task.storyPoints || 0),
|
|
7717
|
+
0
|
|
7718
|
+
);
|
|
7719
|
+
return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7720
|
+
Card,
|
|
7721
|
+
{
|
|
7722
|
+
className: "flex flex-col bg-card shadow-sm",
|
|
7723
|
+
style: { maxHeight: "420px" },
|
|
7724
|
+
onDragOver: handleDragOver,
|
|
7725
|
+
onDrop: (e) => handleDrop(e, epic.id.toString()),
|
|
7726
|
+
children: [
|
|
7727
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "p-3 border-b border-border flex-shrink-0", children: editingEpic === epic.id.toString() ? (
|
|
7728
|
+
/* Edit Mode */
|
|
7729
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "space-y-3", children: [
|
|
7730
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
7651
7731
|
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7652
|
-
|
|
7732
|
+
Input,
|
|
7653
7733
|
{
|
|
7654
|
-
|
|
7655
|
-
|
|
7656
|
-
|
|
7657
|
-
className: "
|
|
7658
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Edit2, { className: "h-3 w-3" })
|
|
7734
|
+
value: editForm.name || "",
|
|
7735
|
+
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
7736
|
+
placeholder: "Epic name",
|
|
7737
|
+
className: "font-semibold text-sm"
|
|
7659
7738
|
}
|
|
7660
7739
|
),
|
|
7661
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.
|
|
7662
|
-
|
|
7663
|
-
|
|
7664
|
-
|
|
7665
|
-
|
|
7666
|
-
|
|
7667
|
-
|
|
7668
|
-
|
|
7669
|
-
|
|
7670
|
-
|
|
7671
|
-
|
|
7672
|
-
|
|
7673
|
-
|
|
7674
|
-
|
|
7675
|
-
|
|
7676
|
-
|
|
7677
|
-
|
|
7678
|
-
|
|
7679
|
-
|
|
7680
|
-
|
|
7740
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex gap-1 ml-2", children: [
|
|
7741
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7742
|
+
Button,
|
|
7743
|
+
{
|
|
7744
|
+
size: "sm",
|
|
7745
|
+
variant: "ghost",
|
|
7746
|
+
onClick: handleSaveEdit,
|
|
7747
|
+
className: "p-1 h-7 w-7",
|
|
7748
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Check, { className: "h-3 w-3" })
|
|
7749
|
+
}
|
|
7750
|
+
),
|
|
7751
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7752
|
+
Button,
|
|
7753
|
+
{
|
|
7754
|
+
size: "sm",
|
|
7755
|
+
variant: "ghost",
|
|
7756
|
+
onClick: handleCancelEdit,
|
|
7757
|
+
className: "p-1 h-7 w-7",
|
|
7758
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.X, { className: "h-3 w-3" })
|
|
7759
|
+
}
|
|
7760
|
+
)
|
|
7761
|
+
] })
|
|
7681
7762
|
] }),
|
|
7682
|
-
/* @__PURE__ */ (0, import_jsx_runtime45.
|
|
7683
|
-
|
|
7763
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7764
|
+
Textarea,
|
|
7684
7765
|
{
|
|
7685
|
-
|
|
7686
|
-
|
|
7687
|
-
|
|
7688
|
-
|
|
7689
|
-
" tasks"
|
|
7690
|
-
]
|
|
7766
|
+
value: editForm.description || "",
|
|
7767
|
+
onChange: (e) => setEditForm({ ...editForm, description: e.target.value }),
|
|
7768
|
+
placeholder: "Epic description",
|
|
7769
|
+
className: "text-xs min-h-[50px]"
|
|
7691
7770
|
}
|
|
7692
7771
|
),
|
|
7772
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
7773
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { children: [
|
|
7774
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("label", { className: "text-xs text-muted-foreground", children: "Confidence" }),
|
|
7775
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7776
|
+
"select",
|
|
7777
|
+
{
|
|
7778
|
+
value: editForm.confidence || epic.confidence,
|
|
7779
|
+
onChange: (e) => setEditForm({
|
|
7780
|
+
...editForm,
|
|
7781
|
+
confidence: e.target.value
|
|
7782
|
+
}),
|
|
7783
|
+
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",
|
|
7784
|
+
children: [
|
|
7785
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("option", { value: "low", children: "Low" }),
|
|
7786
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("option", { value: "medium", children: "Medium" }),
|
|
7787
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("option", { value: "high", children: "High" })
|
|
7788
|
+
]
|
|
7789
|
+
}
|
|
7790
|
+
)
|
|
7791
|
+
] }),
|
|
7792
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { children: [
|
|
7793
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("label", { className: "text-xs text-muted-foreground", children: "Phase" }),
|
|
7794
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7795
|
+
"select",
|
|
7796
|
+
{
|
|
7797
|
+
value: editForm.phase?.toString() || epic.phase.toString(),
|
|
7798
|
+
onChange: (e) => setEditForm({ ...editForm, phase: parseInt(e.target.value) }),
|
|
7799
|
+
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",
|
|
7800
|
+
children: [1, 2, 3, 4, 5, 6, 7, 8, 9].map((phase) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("option", { value: phase.toString(), children: [
|
|
7801
|
+
"Phase ",
|
|
7802
|
+
phase
|
|
7803
|
+
] }, phase))
|
|
7804
|
+
}
|
|
7805
|
+
)
|
|
7806
|
+
] })
|
|
7807
|
+
] })
|
|
7808
|
+
] })
|
|
7809
|
+
) : (
|
|
7810
|
+
/* Display Mode */
|
|
7811
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
|
|
7812
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex items-center gap-1.5 mb-1.5", children: [
|
|
7813
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
7814
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("h3", { className: "font-semibold text-foreground text-sm select-none flex-1 truncate", children: epic.name }),
|
|
7815
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex gap-0.5", children: [
|
|
7816
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7817
|
+
Button,
|
|
7818
|
+
{
|
|
7819
|
+
size: "sm",
|
|
7820
|
+
variant: "ghost",
|
|
7821
|
+
onClick: () => handleEditEpic(epic),
|
|
7822
|
+
className: "p-1 h-6 w-6",
|
|
7823
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Edit2, { className: "h-3 w-3" })
|
|
7824
|
+
}
|
|
7825
|
+
),
|
|
7826
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7827
|
+
Button,
|
|
7828
|
+
{
|
|
7829
|
+
size: "sm",
|
|
7830
|
+
variant: "ghost",
|
|
7831
|
+
onClick: () => handleDeleteEpic(epic.id.toString()),
|
|
7832
|
+
className: "p-1 h-6 w-6 hover:bg-destructive/10 hover:text-destructive",
|
|
7833
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Trash2, { className: "h-3 w-3" })
|
|
7834
|
+
}
|
|
7835
|
+
)
|
|
7836
|
+
] })
|
|
7837
|
+
] }),
|
|
7838
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex flex-wrap gap-1 mb-2", children: [
|
|
7839
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Badge, { className: `text-xs px-1.5 py-0 ${getConfidenceColor(epic.confidence)}`, children: epic.confidence }),
|
|
7840
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(Badge, { variant: "outline", className: "text-xs px-1.5 py-0", children: getPhaseLabel(epic.phase) }),
|
|
7841
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(Badge, { variant: "secondary", className: "text-xs px-1.5 py-0 bg-muted text-muted-foreground", children: [
|
|
7842
|
+
epicTasks.length,
|
|
7843
|
+
"t \xB7 ",
|
|
7844
|
+
totalPoints,
|
|
7845
|
+
"pt"
|
|
7846
|
+
] })
|
|
7847
|
+
] }),
|
|
7848
|
+
epic.description && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)("p", { className: "text-xs text-muted-foreground mb-2 select-none line-clamp-2", children: epic.description }),
|
|
7693
7849
|
/* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(
|
|
7694
|
-
|
|
7850
|
+
Button,
|
|
7695
7851
|
{
|
|
7696
|
-
|
|
7697
|
-
|
|
7852
|
+
onClick: () => {
|
|
7853
|
+
setIsAddTaskModalOpen(true);
|
|
7854
|
+
setAddTaskEpic(epic);
|
|
7855
|
+
},
|
|
7856
|
+
variant: "outline",
|
|
7857
|
+
size: "sm",
|
|
7858
|
+
className: "w-full gap-1 h-7 text-xs",
|
|
7698
7859
|
children: [
|
|
7699
|
-
|
|
7700
|
-
"
|
|
7860
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Plus, { className: "h-3 w-3" }),
|
|
7861
|
+
"Add Task"
|
|
7701
7862
|
]
|
|
7702
7863
|
}
|
|
7703
7864
|
)
|
|
7704
|
-
] })
|
|
7705
|
-
|
|
7706
|
-
|
|
7707
|
-
|
|
7708
|
-
|
|
7709
|
-
|
|
7710
|
-
|
|
7711
|
-
|
|
7712
|
-
}
|
|
7713
|
-
|
|
7714
|
-
|
|
7715
|
-
|
|
7716
|
-
|
|
7717
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
|
|
7721
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
7725
|
-
|
|
7726
|
-
|
|
7727
|
-
|
|
7728
|
-
|
|
7729
|
-
|
|
7730
|
-
|
|
7731
|
-
|
|
7732
|
-
|
|
7733
|
-
|
|
7734
|
-
|
|
7735
|
-
|
|
7736
|
-
|
|
7737
|
-
|
|
7738
|
-
|
|
7739
|
-
|
|
7740
|
-
|
|
7741
|
-
|
|
7742
|
-
|
|
7743
|
-
|
|
7744
|
-
|
|
7745
|
-
},
|
|
7746
|
-
epic.id
|
|
7747
|
-
);
|
|
7748
|
-
}) })
|
|
7865
|
+
] })
|
|
7866
|
+
) }),
|
|
7867
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("div", { className: "flex-1 p-2 overflow-y-auto no-scrollbar min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7868
|
+
"div",
|
|
7869
|
+
{
|
|
7870
|
+
className: `space-y-2 min-h-[80px] border-2 border-dashed rounded p-2 transition-colors ${draggedTask ? "border-primary bg-primary/10" : "border-border"}`,
|
|
7871
|
+
children: epicTasks.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "flex flex-col items-center justify-center h-16 text-muted-foreground", children: [
|
|
7872
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.Move, { className: "h-5 w-5 mb-1" }),
|
|
7873
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)("span", { className: "text-xs select-none", children: "Drop tasks here" })
|
|
7874
|
+
] }) : epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("div", { className: "relative group", children: [
|
|
7875
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7876
|
+
TaskCard,
|
|
7877
|
+
{
|
|
7878
|
+
task,
|
|
7879
|
+
epic,
|
|
7880
|
+
onDragStart: handleDragStart,
|
|
7881
|
+
onTaskClick: handleTaskClick,
|
|
7882
|
+
isCompact: true
|
|
7883
|
+
}
|
|
7884
|
+
),
|
|
7885
|
+
/* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7886
|
+
"button",
|
|
7887
|
+
{
|
|
7888
|
+
onClick: (e) => {
|
|
7889
|
+
e.stopPropagation();
|
|
7890
|
+
handleRemoveFromEpic(task);
|
|
7891
|
+
},
|
|
7892
|
+
title: "Remove from epic",
|
|
7893
|
+
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",
|
|
7894
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_lucide_react16.X, { className: "h-3 w-3" })
|
|
7895
|
+
}
|
|
7896
|
+
)
|
|
7897
|
+
] }, task.id))
|
|
7898
|
+
}
|
|
7899
|
+
) })
|
|
7900
|
+
]
|
|
7901
|
+
},
|
|
7902
|
+
epic.id
|
|
7903
|
+
);
|
|
7904
|
+
}) })
|
|
7905
|
+
]
|
|
7749
7906
|
}
|
|
7750
7907
|
) })
|
|
7751
7908
|
] }),
|
|
@@ -7768,21 +7925,417 @@ var EpicsView = ({
|
|
|
7768
7925
|
defaultEpicId: addTaskEpic?.id.toString() || "",
|
|
7769
7926
|
sprints
|
|
7770
7927
|
}
|
|
7928
|
+
),
|
|
7929
|
+
selectedTask && /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
|
|
7930
|
+
TaskDetailsModal,
|
|
7931
|
+
{
|
|
7932
|
+
isOpen: !!selectedTask,
|
|
7933
|
+
onClose: () => setSelectedTask(null),
|
|
7934
|
+
initialTask: selectedTask,
|
|
7935
|
+
epics: availableEpics,
|
|
7936
|
+
sprints,
|
|
7937
|
+
onUpdateTask: handleUpdateTask,
|
|
7938
|
+
onDeleteTask: handleDeleteTask,
|
|
7939
|
+
onAddComment,
|
|
7940
|
+
colleagues,
|
|
7941
|
+
onUploadFile,
|
|
7942
|
+
onDeleteFile,
|
|
7943
|
+
onFileUpdate
|
|
7944
|
+
}
|
|
7771
7945
|
)
|
|
7772
7946
|
] });
|
|
7773
7947
|
};
|
|
7774
7948
|
|
|
7775
|
-
// src/components/Projects/
|
|
7776
|
-
var import_react24 = require("react");
|
|
7777
|
-
var import_lucide_react18 = require("lucide-react");
|
|
7778
|
-
|
|
7779
|
-
// src/components/Projects/AddSprintModal.tsx
|
|
7949
|
+
// src/components/Projects/GanttView.tsx
|
|
7780
7950
|
var import_react23 = require("react");
|
|
7781
|
-
var import_lucide_react17 = require("lucide-react");
|
|
7782
7951
|
var import_date_fns = require("date-fns");
|
|
7952
|
+
var import_lucide_react17 = require("lucide-react");
|
|
7783
7953
|
var import_jsx_runtime46 = require("react/jsx-runtime");
|
|
7954
|
+
var PHASE_LABELS = {
|
|
7955
|
+
1: "Plan",
|
|
7956
|
+
2: "Dev",
|
|
7957
|
+
3: "Test",
|
|
7958
|
+
4: "Deploy",
|
|
7959
|
+
5: "Review",
|
|
7960
|
+
6: "Maint.",
|
|
7961
|
+
7: "Complete",
|
|
7962
|
+
8: "Archive",
|
|
7963
|
+
9: "Legacy"
|
|
7964
|
+
};
|
|
7965
|
+
var ZOOM_LEVELS = [
|
|
7966
|
+
{ label: "Quarter", dayWidth: 3 },
|
|
7967
|
+
{ label: "Month", dayWidth: 7 },
|
|
7968
|
+
{ label: "Week", dayWidth: 14 },
|
|
7969
|
+
{ label: "Day", dayWidth: 40 }
|
|
7970
|
+
];
|
|
7971
|
+
var ROW_HEIGHT = 48;
|
|
7972
|
+
var TIME_HEADER_HEIGHT = 60;
|
|
7973
|
+
var GanttView = ({
|
|
7974
|
+
tasks,
|
|
7975
|
+
epics,
|
|
7976
|
+
sprints,
|
|
7977
|
+
onTaskClick
|
|
7978
|
+
}) => {
|
|
7979
|
+
const [dayWidth, setDayWidth] = (0, import_react23.useState)(7);
|
|
7980
|
+
const [isFullscreen, setIsFullscreen] = (0, import_react23.useState)(false);
|
|
7981
|
+
const scrollRef = (0, import_react23.useRef)(null);
|
|
7982
|
+
const heroRef = (0, import_react23.useRef)(null);
|
|
7983
|
+
const [heroHeight, setHeroHeight] = (0, import_react23.useState)(0);
|
|
7984
|
+
(0, import_react23.useEffect)(() => {
|
|
7985
|
+
const measure = () => {
|
|
7986
|
+
if (heroRef.current) setHeroHeight(heroRef.current.offsetHeight);
|
|
7987
|
+
};
|
|
7988
|
+
const observer = new ResizeObserver(measure);
|
|
7989
|
+
if (heroRef.current) observer.observe(heroRef.current);
|
|
7990
|
+
return () => observer.disconnect();
|
|
7991
|
+
}, []);
|
|
7992
|
+
const { timelineStart, timelineEnd, totalDays } = (0, import_react23.useMemo)(() => {
|
|
7993
|
+
if (epics.length === 0) {
|
|
7994
|
+
const today = /* @__PURE__ */ new Date();
|
|
7995
|
+
const start = (0, import_date_fns.addDays)(today, -14);
|
|
7996
|
+
const end = (0, import_date_fns.addDays)(today, 76);
|
|
7997
|
+
return { timelineStart: start, timelineEnd: end, totalDays: 90 };
|
|
7998
|
+
}
|
|
7999
|
+
const allDates = epics.flatMap((e) => [new Date(e.startDate), new Date(e.endDate)]);
|
|
8000
|
+
const minTime = Math.min(...allDates.map((d) => d.getTime()));
|
|
8001
|
+
const maxTime = Math.max(...allDates.map((d) => d.getTime()));
|
|
8002
|
+
const paddedStart = (0, import_date_fns.addDays)(new Date(minTime), -14);
|
|
8003
|
+
const paddedEnd = (0, import_date_fns.addDays)(new Date(maxTime), 14);
|
|
8004
|
+
return {
|
|
8005
|
+
timelineStart: paddedStart,
|
|
8006
|
+
timelineEnd: paddedEnd,
|
|
8007
|
+
totalDays: (0, import_date_fns.differenceInDays)(paddedEnd, paddedStart)
|
|
8008
|
+
};
|
|
8009
|
+
}, [epics]);
|
|
8010
|
+
const { groups, sortedKeys } = (0, import_react23.useMemo)(() => {
|
|
8011
|
+
const groups2 = {};
|
|
8012
|
+
epics.forEach((epic) => {
|
|
8013
|
+
if (!groups2[epic.name]) groups2[epic.name] = [];
|
|
8014
|
+
groups2[epic.name].push(epic);
|
|
8015
|
+
});
|
|
8016
|
+
Object.values(groups2).forEach((list) => list.sort((a, b) => a.phase - b.phase));
|
|
8017
|
+
const sortedKeys2 = Object.keys(groups2).sort((a, b) => {
|
|
8018
|
+
const aMin = Math.min(...groups2[a].map((e) => new Date(e.startDate).getTime()));
|
|
8019
|
+
const bMin = Math.min(...groups2[b].map((e) => new Date(e.startDate).getTime()));
|
|
8020
|
+
return aMin - bMin;
|
|
8021
|
+
});
|
|
8022
|
+
return { groups: groups2, sortedKeys: sortedKeys2 };
|
|
8023
|
+
}, [epics]);
|
|
8024
|
+
const realSprints = (0, import_react23.useMemo)(
|
|
8025
|
+
() => sprints.filter((s) => {
|
|
8026
|
+
const name = s.name.toLowerCase();
|
|
8027
|
+
return name !== "backlog" && name !== "all tasks";
|
|
8028
|
+
}),
|
|
8029
|
+
[sprints]
|
|
8030
|
+
);
|
|
8031
|
+
const monthHeaders = (0, import_react23.useMemo)(
|
|
8032
|
+
() => (0, import_date_fns.eachMonthOfInterval)({ start: timelineStart, end: timelineEnd }).map((month) => ({
|
|
8033
|
+
month,
|
|
8034
|
+
left: (0, import_date_fns.differenceInDays)(month, timelineStart) * dayWidth
|
|
8035
|
+
})),
|
|
8036
|
+
[timelineStart, timelineEnd, dayWidth]
|
|
8037
|
+
);
|
|
8038
|
+
const totalWidth = Math.max(totalDays * dayWidth, 600);
|
|
8039
|
+
const scrollToToday = (0, import_react23.useCallback)(() => {
|
|
8040
|
+
if (scrollRef.current) {
|
|
8041
|
+
const todayOffset = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
8042
|
+
scrollRef.current.scrollLeft = Math.max(0, todayOffset - 200);
|
|
8043
|
+
}
|
|
8044
|
+
}, [timelineStart, dayWidth]);
|
|
8045
|
+
const todayLeft = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
8046
|
+
const getEpicStats = (epic) => {
|
|
8047
|
+
const epicTasks = tasks.filter((t) => extractId(t.epic) === epic.id);
|
|
8048
|
+
const done = epicTasks.filter((t) => t.status === "done").length;
|
|
8049
|
+
const pct = epicTasks.length > 0 ? Math.round(done / epicTasks.length * 100) : 0;
|
|
8050
|
+
return { total: epicTasks.length, done, pct };
|
|
8051
|
+
};
|
|
8052
|
+
const getGroupStats = (epicList) => {
|
|
8053
|
+
const allTasks = epicList.flatMap(
|
|
8054
|
+
(e) => tasks.filter((t) => extractId(t.epic) === e.id)
|
|
8055
|
+
);
|
|
8056
|
+
const done = allTasks.filter((t) => t.status === "done").length;
|
|
8057
|
+
const pct = allTasks.length > 0 ? Math.round(done / allTasks.length * 100) : 0;
|
|
8058
|
+
return { total: allTasks.length, done, pct };
|
|
8059
|
+
};
|
|
8060
|
+
const isSprintActive = (sprint) => {
|
|
8061
|
+
const today = /* @__PURE__ */ new Date();
|
|
8062
|
+
try {
|
|
8063
|
+
return (0, import_date_fns.isWithinInterval)(today, {
|
|
8064
|
+
start: new Date(sprint.startDate),
|
|
8065
|
+
end: new Date(sprint.endDate)
|
|
8066
|
+
});
|
|
8067
|
+
} catch {
|
|
8068
|
+
return false;
|
|
8069
|
+
}
|
|
8070
|
+
};
|
|
8071
|
+
const chartContent = /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
|
|
8072
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "w-52 flex-shrink-0 border-r bg-background z-10 flex flex-col", children: [
|
|
8073
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8074
|
+
"div",
|
|
8075
|
+
{
|
|
8076
|
+
className: "border-b flex items-end pb-2 px-3 flex-shrink-0 bg-muted/20",
|
|
8077
|
+
style: { height: TIME_HEADER_HEIGHT },
|
|
8078
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-xs font-semibold text-muted-foreground tracking-wider uppercase", children: "Epic" })
|
|
8079
|
+
}
|
|
8080
|
+
),
|
|
8081
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "overflow-y-auto flex-1", children: [
|
|
8082
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex items-center justify-center h-24 text-sm text-muted-foreground", children: "No epics" }),
|
|
8083
|
+
sortedKeys.map((name) => {
|
|
8084
|
+
const stats = getGroupStats(groups[name]);
|
|
8085
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
8086
|
+
"div",
|
|
8087
|
+
{
|
|
8088
|
+
className: "flex flex-col justify-center px-3 border-b",
|
|
8089
|
+
style: { height: ROW_HEIGHT },
|
|
8090
|
+
children: [
|
|
8091
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-sm font-medium truncate", title: name, children: name }),
|
|
8092
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "text-xs text-muted-foreground", children: [
|
|
8093
|
+
stats.total,
|
|
8094
|
+
" task",
|
|
8095
|
+
stats.total !== 1 ? "s" : "",
|
|
8096
|
+
" \xB7 ",
|
|
8097
|
+
stats.pct,
|
|
8098
|
+
"%"
|
|
8099
|
+
] })
|
|
8100
|
+
]
|
|
8101
|
+
},
|
|
8102
|
+
name
|
|
8103
|
+
);
|
|
8104
|
+
})
|
|
8105
|
+
] })
|
|
8106
|
+
] }),
|
|
8107
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex-1 overflow-x-auto overflow-y-auto", ref: scrollRef, children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { style: { width: totalWidth, position: "relative" }, children: [
|
|
8108
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
8109
|
+
"div",
|
|
8110
|
+
{
|
|
8111
|
+
className: "sticky top-0 border-b bg-muted/20 z-20 flex-shrink-0",
|
|
8112
|
+
style: { height: TIME_HEADER_HEIGHT, width: totalWidth },
|
|
8113
|
+
children: [
|
|
8114
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8115
|
+
"div",
|
|
8116
|
+
{
|
|
8117
|
+
className: "absolute top-2 text-xs font-semibold text-muted-foreground select-none",
|
|
8118
|
+
style: { left: left + 4 },
|
|
8119
|
+
children: (0, import_date_fns.format)(month, "MMM yyyy")
|
|
8120
|
+
},
|
|
8121
|
+
month.toISOString()
|
|
8122
|
+
)),
|
|
8123
|
+
realSprints.map((sprint) => {
|
|
8124
|
+
const start = new Date(sprint.startDate);
|
|
8125
|
+
const end = new Date(sprint.endDate);
|
|
8126
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
8127
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
8128
|
+
const right = Math.min(
|
|
8129
|
+
totalWidth,
|
|
8130
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
8131
|
+
);
|
|
8132
|
+
const width = right - left;
|
|
8133
|
+
if (width <= 0) return null;
|
|
8134
|
+
const active = isSprintActive(sprint);
|
|
8135
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8136
|
+
"div",
|
|
8137
|
+
{
|
|
8138
|
+
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"}`,
|
|
8139
|
+
style: { left, width, height: 22 },
|
|
8140
|
+
title: sprint.name,
|
|
8141
|
+
children: sprint.name
|
|
8142
|
+
},
|
|
8143
|
+
`header-sprint-${sprint.id}`
|
|
8144
|
+
);
|
|
8145
|
+
})
|
|
8146
|
+
]
|
|
8147
|
+
}
|
|
8148
|
+
),
|
|
8149
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { style: { position: "relative", width: totalWidth }, children: [
|
|
8150
|
+
realSprints.map((sprint) => {
|
|
8151
|
+
const start = new Date(sprint.startDate);
|
|
8152
|
+
const end = new Date(sprint.endDate);
|
|
8153
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
8154
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
8155
|
+
const right = Math.min(
|
|
8156
|
+
totalWidth,
|
|
8157
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
8158
|
+
);
|
|
8159
|
+
const width = right - left;
|
|
8160
|
+
if (width <= 0 || !isSprintActive(sprint)) return null;
|
|
8161
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8162
|
+
"div",
|
|
8163
|
+
{
|
|
8164
|
+
className: "absolute inset-y-0 bg-primary/5 pointer-events-none",
|
|
8165
|
+
style: { left, width }
|
|
8166
|
+
},
|
|
8167
|
+
`bg-${sprint.id}`
|
|
8168
|
+
);
|
|
8169
|
+
}),
|
|
8170
|
+
realSprints.map((sprint) => {
|
|
8171
|
+
const left = (0, import_date_fns.differenceInDays)(new Date(sprint.startDate), timelineStart) * dayWidth;
|
|
8172
|
+
if (left < 0 || left > totalWidth) return null;
|
|
8173
|
+
const active = isSprintActive(sprint);
|
|
8174
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8175
|
+
"div",
|
|
8176
|
+
{
|
|
8177
|
+
className: `absolute inset-y-0 pointer-events-none ${active ? "border-l border-primary/40" : "border-l border-dashed border-border/60"}`,
|
|
8178
|
+
style: { left }
|
|
8179
|
+
},
|
|
8180
|
+
`line-${sprint.id}`
|
|
8181
|
+
);
|
|
8182
|
+
}),
|
|
8183
|
+
todayLeft >= 0 && todayLeft <= totalWidth && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
8184
|
+
"div",
|
|
8185
|
+
{
|
|
8186
|
+
className: "absolute inset-y-0 pointer-events-none z-10",
|
|
8187
|
+
style: { left: todayLeft },
|
|
8188
|
+
children: [
|
|
8189
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "absolute inset-y-0 w-0.5 bg-destructive/50" }),
|
|
8190
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "absolute top-1 -translate-x-1/2 w-2 h-2 rounded-full bg-destructive" })
|
|
8191
|
+
]
|
|
8192
|
+
}
|
|
8193
|
+
),
|
|
8194
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8195
|
+
"div",
|
|
8196
|
+
{
|
|
8197
|
+
className: "absolute inset-y-0 border-l border-border/30 pointer-events-none",
|
|
8198
|
+
style: { left }
|
|
8199
|
+
},
|
|
8200
|
+
`grid-${month.toISOString()}`
|
|
8201
|
+
)),
|
|
8202
|
+
sortedKeys.map((name) => {
|
|
8203
|
+
const epicList = groups[name];
|
|
8204
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8205
|
+
"div",
|
|
8206
|
+
{
|
|
8207
|
+
className: "border-b relative flex items-center",
|
|
8208
|
+
style: { height: ROW_HEIGHT },
|
|
8209
|
+
children: epicList.map((epic) => {
|
|
8210
|
+
const start = new Date(epic.startDate);
|
|
8211
|
+
const end = new Date(epic.endDate);
|
|
8212
|
+
const left = (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth;
|
|
8213
|
+
const width = Math.max(8, (0, import_date_fns.differenceInDays)(end, start) * dayWidth);
|
|
8214
|
+
const stats = getEpicStats(epic);
|
|
8215
|
+
const phaseLabel = PHASE_LABELS[epic.phase] ?? `Phase ${epic.phase}`;
|
|
8216
|
+
const showLabel = width >= 50;
|
|
8217
|
+
const tooltip = [
|
|
8218
|
+
`${epic.name} \xB7 ${phaseLabel}`,
|
|
8219
|
+
epic.description ? epic.description : null,
|
|
8220
|
+
`${(0, import_date_fns.format)(start, "dd MMM yyyy")} \u2192 ${(0, import_date_fns.format)(end, "dd MMM yyyy")}`,
|
|
8221
|
+
`${stats.total} tasks \xB7 ${stats.pct}% complete`
|
|
8222
|
+
].filter(Boolean).join("\n");
|
|
8223
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
8224
|
+
"div",
|
|
8225
|
+
{
|
|
8226
|
+
className: "absolute rounded overflow-hidden cursor-pointer hover:ring-2 hover:ring-white/40 transition-all",
|
|
8227
|
+
style: { left, width, height: 32, top: 8 },
|
|
8228
|
+
title: tooltip,
|
|
8229
|
+
children: [
|
|
8230
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8231
|
+
"div",
|
|
8232
|
+
{
|
|
8233
|
+
className: `absolute inset-0 ${epic.color}`,
|
|
8234
|
+
style: { opacity: 0.2 }
|
|
8235
|
+
}
|
|
8236
|
+
),
|
|
8237
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8238
|
+
"div",
|
|
8239
|
+
{
|
|
8240
|
+
className: `absolute inset-y-0 left-0 ${epic.color} transition-all`,
|
|
8241
|
+
style: { width: `${stats.pct}%`, opacity: 0.85 }
|
|
8242
|
+
}
|
|
8243
|
+
),
|
|
8244
|
+
showLabel && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "absolute inset-0 flex items-center px-2 gap-1.5 z-10", children: [
|
|
8245
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: "text-xs font-semibold text-white drop-shadow truncate", children: phaseLabel }),
|
|
8246
|
+
stats.total > 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: "text-xs text-white/80 drop-shadow shrink-0", children: [
|
|
8247
|
+
stats.pct,
|
|
8248
|
+
"%"
|
|
8249
|
+
] })
|
|
8250
|
+
] })
|
|
8251
|
+
]
|
|
8252
|
+
},
|
|
8253
|
+
epic.id
|
|
8254
|
+
);
|
|
8255
|
+
})
|
|
8256
|
+
},
|
|
8257
|
+
name
|
|
8258
|
+
);
|
|
8259
|
+
}),
|
|
8260
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8261
|
+
"div",
|
|
8262
|
+
{
|
|
8263
|
+
className: "flex items-center justify-center text-sm text-muted-foreground",
|
|
8264
|
+
style: { height: 200 },
|
|
8265
|
+
children: "No epics to display on the timeline"
|
|
8266
|
+
}
|
|
8267
|
+
)
|
|
8268
|
+
] })
|
|
8269
|
+
] }) })
|
|
8270
|
+
] });
|
|
8271
|
+
const inner = /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: `flex flex-col ${isFullscreen ? "h-screen" : "h-full"} overflow-hidden`, children: [
|
|
8272
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8273
|
+
DashboardHero,
|
|
8274
|
+
{
|
|
8275
|
+
title: "Gantt Chart",
|
|
8276
|
+
description: "Epic timeline with sprint alignment and phase-based grouping.",
|
|
8277
|
+
gradient: "bg-gradient-to-r from-indigo-600 via-blue-600 to-cyan-600",
|
|
8278
|
+
badge: `${sortedKeys.length} epic${sortedKeys.length !== 1 ? "s" : ""}`
|
|
8279
|
+
}
|
|
8280
|
+
) }),
|
|
8281
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("div", { className: "flex items-center gap-2 px-4 py-2 border-b bg-background flex-shrink-0", children: [
|
|
8282
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react17.BarChart2, { className: "h-4 w-4 text-muted-foreground" }),
|
|
8283
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex items-center gap-1", children: ZOOM_LEVELS.map((z) => /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8284
|
+
Button,
|
|
8285
|
+
{
|
|
8286
|
+
variant: dayWidth === z.dayWidth ? "default" : "outline",
|
|
8287
|
+
size: "sm",
|
|
8288
|
+
className: "h-7 px-2 text-xs",
|
|
8289
|
+
onClick: () => setDayWidth(z.dayWidth),
|
|
8290
|
+
children: z.label
|
|
8291
|
+
},
|
|
8292
|
+
z.label
|
|
8293
|
+
)) }),
|
|
8294
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "flex-1" }),
|
|
8295
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
|
|
8296
|
+
Button,
|
|
8297
|
+
{
|
|
8298
|
+
variant: "outline",
|
|
8299
|
+
size: "sm",
|
|
8300
|
+
className: "h-7 px-2 text-xs",
|
|
8301
|
+
onClick: scrollToToday,
|
|
8302
|
+
children: [
|
|
8303
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react17.Calendar, { className: "h-3 w-3 mr-1" }),
|
|
8304
|
+
"Today"
|
|
8305
|
+
]
|
|
8306
|
+
}
|
|
8307
|
+
),
|
|
8308
|
+
/* @__PURE__ */ (0, import_jsx_runtime46.jsx)(
|
|
8309
|
+
Button,
|
|
8310
|
+
{
|
|
8311
|
+
variant: "outline",
|
|
8312
|
+
size: "sm",
|
|
8313
|
+
className: "h-7 w-7 p-0",
|
|
8314
|
+
onClick: () => setIsFullscreen((v) => !v),
|
|
8315
|
+
title: isFullscreen ? "Exit fullscreen" : "Fullscreen",
|
|
8316
|
+
children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react17.Minimize2, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_lucide_react17.Maximize2, { className: "h-3.5 w-3.5" })
|
|
8317
|
+
}
|
|
8318
|
+
)
|
|
8319
|
+
] }),
|
|
8320
|
+
chartContent
|
|
8321
|
+
] });
|
|
8322
|
+
if (isFullscreen) {
|
|
8323
|
+
return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: "fixed inset-0 z-50 bg-background overflow-hidden", children: inner });
|
|
8324
|
+
}
|
|
8325
|
+
return inner;
|
|
8326
|
+
};
|
|
8327
|
+
|
|
8328
|
+
// src/components/Projects/PlanningView.tsx
|
|
8329
|
+
var import_react25 = require("react");
|
|
8330
|
+
var import_lucide_react19 = require("lucide-react");
|
|
8331
|
+
|
|
8332
|
+
// src/components/Projects/AddSprintModal.tsx
|
|
8333
|
+
var import_react24 = require("react");
|
|
8334
|
+
var import_lucide_react18 = require("lucide-react");
|
|
8335
|
+
var import_date_fns2 = require("date-fns");
|
|
8336
|
+
var import_jsx_runtime47 = require("react/jsx-runtime");
|
|
7784
8337
|
var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
7785
|
-
const [formData, setFormData] = (0,
|
|
8338
|
+
const [formData, setFormData] = (0, import_react24.useState)({
|
|
7786
8339
|
name: "",
|
|
7787
8340
|
description: "",
|
|
7788
8341
|
startDate: void 0,
|
|
@@ -7823,12 +8376,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7823
8376
|
});
|
|
7824
8377
|
onClose();
|
|
7825
8378
|
};
|
|
7826
|
-
return /* @__PURE__ */ (0,
|
|
7827
|
-
/* @__PURE__ */ (0,
|
|
7828
|
-
/* @__PURE__ */ (0,
|
|
7829
|
-
/* @__PURE__ */ (0,
|
|
7830
|
-
/* @__PURE__ */ (0,
|
|
7831
|
-
/* @__PURE__ */ (0,
|
|
8379
|
+
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Dialog, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(DialogContent, { className: "sm:max-w-md", children: [
|
|
8380
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(DialogTitle, { children: "Add New Sprint" }) }),
|
|
8381
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
8382
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "space-y-2", children: [
|
|
8383
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Label2, { htmlFor: "name", children: "Sprint Name *" }),
|
|
8384
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
7832
8385
|
Input,
|
|
7833
8386
|
{
|
|
7834
8387
|
id: "name",
|
|
@@ -7839,9 +8392,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7839
8392
|
}
|
|
7840
8393
|
)
|
|
7841
8394
|
] }),
|
|
7842
|
-
/* @__PURE__ */ (0,
|
|
7843
|
-
/* @__PURE__ */ (0,
|
|
7844
|
-
/* @__PURE__ */ (0,
|
|
8395
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "space-y-2", children: [
|
|
8396
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Label2, { htmlFor: "description", children: "Description" }),
|
|
8397
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
7845
8398
|
Textarea,
|
|
7846
8399
|
{
|
|
7847
8400
|
id: "description",
|
|
@@ -7852,11 +8405,11 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7852
8405
|
}
|
|
7853
8406
|
)
|
|
7854
8407
|
] }),
|
|
7855
|
-
/* @__PURE__ */ (0,
|
|
7856
|
-
/* @__PURE__ */ (0,
|
|
7857
|
-
/* @__PURE__ */ (0,
|
|
7858
|
-
/* @__PURE__ */ (0,
|
|
7859
|
-
/* @__PURE__ */ (0,
|
|
8408
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
8409
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "space-y-2", children: [
|
|
8410
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Label2, { children: "Start Date *" }),
|
|
8411
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(Popover, { children: [
|
|
8412
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(
|
|
7860
8413
|
Button,
|
|
7861
8414
|
{
|
|
7862
8415
|
variant: "outline",
|
|
@@ -7865,12 +8418,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7865
8418
|
!formData.startDate && "text-muted-foreground"
|
|
7866
8419
|
),
|
|
7867
8420
|
children: [
|
|
7868
|
-
/* @__PURE__ */ (0,
|
|
7869
|
-
formData.startDate ? (0,
|
|
8421
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_lucide_react18.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
8422
|
+
formData.startDate ? (0, import_date_fns2.format)(formData.startDate, "PPP") : "Pick a date"
|
|
7870
8423
|
]
|
|
7871
8424
|
}
|
|
7872
8425
|
) }),
|
|
7873
|
-
/* @__PURE__ */ (0,
|
|
8426
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
7874
8427
|
Calendar4,
|
|
7875
8428
|
{
|
|
7876
8429
|
mode: "single",
|
|
@@ -7881,10 +8434,10 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7881
8434
|
) })
|
|
7882
8435
|
] })
|
|
7883
8436
|
] }),
|
|
7884
|
-
/* @__PURE__ */ (0,
|
|
7885
|
-
/* @__PURE__ */ (0,
|
|
7886
|
-
/* @__PURE__ */ (0,
|
|
7887
|
-
/* @__PURE__ */ (0,
|
|
8437
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "space-y-2", children: [
|
|
8438
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Label2, { children: "End Date *" }),
|
|
8439
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(Popover, { children: [
|
|
8440
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsxs)(
|
|
7888
8441
|
Button,
|
|
7889
8442
|
{
|
|
7890
8443
|
variant: "outline",
|
|
@@ -7893,12 +8446,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7893
8446
|
!formData.endDate && "text-muted-foreground"
|
|
7894
8447
|
),
|
|
7895
8448
|
children: [
|
|
7896
|
-
/* @__PURE__ */ (0,
|
|
7897
|
-
formData.endDate ? (0,
|
|
8449
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_lucide_react18.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
8450
|
+
formData.endDate ? (0, import_date_fns2.format)(formData.endDate, "PPP") : "Pick a date"
|
|
7898
8451
|
]
|
|
7899
8452
|
}
|
|
7900
8453
|
) }),
|
|
7901
|
-
/* @__PURE__ */ (0,
|
|
8454
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
7902
8455
|
Calendar4,
|
|
7903
8456
|
{
|
|
7904
8457
|
mode: "single",
|
|
@@ -7911,9 +8464,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7911
8464
|
] })
|
|
7912
8465
|
] })
|
|
7913
8466
|
] }),
|
|
7914
|
-
/* @__PURE__ */ (0,
|
|
7915
|
-
/* @__PURE__ */ (0,
|
|
7916
|
-
/* @__PURE__ */ (0,
|
|
8467
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsxs)("div", { className: "flex justify-end gap-3 pt-4", children: [
|
|
8468
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(Button, { type: "button", variant: "outline", onClick: handleClose, children: "Cancel" }),
|
|
8469
|
+
/* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
|
|
7917
8470
|
Button,
|
|
7918
8471
|
{
|
|
7919
8472
|
type: "submit",
|
|
@@ -7927,7 +8480,7 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
7927
8480
|
};
|
|
7928
8481
|
|
|
7929
8482
|
// src/components/Projects/PlanningView.tsx
|
|
7930
|
-
var
|
|
8483
|
+
var import_jsx_runtime48 = require("react/jsx-runtime");
|
|
7931
8484
|
var PlanningView = ({
|
|
7932
8485
|
tasks,
|
|
7933
8486
|
epics,
|
|
@@ -7938,25 +8491,25 @@ var PlanningView = ({
|
|
|
7938
8491
|
onUpdateSprint,
|
|
7939
8492
|
onDeleteSprint
|
|
7940
8493
|
}) => {
|
|
7941
|
-
const [selectedSprintIds, setSelectedSprintIds] = (0,
|
|
7942
|
-
const [collapsedEpics, setCollapsedEpics] = (0,
|
|
7943
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
7944
|
-
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0,
|
|
7945
|
-
const [dragOverTarget, setDragOverTarget] = (0,
|
|
7946
|
-
const [editingSprintId, setEditingSprintId] = (0,
|
|
7947
|
-
const [sprintEditForm, setSprintEditForm] = (0,
|
|
8494
|
+
const [selectedSprintIds, setSelectedSprintIds] = (0, import_react25.useState)([]);
|
|
8495
|
+
const [collapsedEpics, setCollapsedEpics] = (0, import_react25.useState)(/* @__PURE__ */ new Set());
|
|
8496
|
+
const [draggedTask, setDraggedTask] = (0, import_react25.useState)(null);
|
|
8497
|
+
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0, import_react25.useState)(false);
|
|
8498
|
+
const [dragOverTarget, setDragOverTarget] = (0, import_react25.useState)(null);
|
|
8499
|
+
const [editingSprintId, setEditingSprintId] = (0, import_react25.useState)(null);
|
|
8500
|
+
const [sprintEditForm, setSprintEditForm] = (0, import_react25.useState)({
|
|
7948
8501
|
name: "",
|
|
7949
8502
|
description: "",
|
|
7950
8503
|
startDate: "",
|
|
7951
8504
|
endDate: ""
|
|
7952
8505
|
});
|
|
7953
|
-
const [availableSprints, setAvailableSprints] = (0,
|
|
7954
|
-
const [sprintFilter, setSprintFilter] = (0,
|
|
7955
|
-
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0,
|
|
7956
|
-
const [heroHeight, setHeroHeight] = (0,
|
|
7957
|
-
const heroRef = (0,
|
|
7958
|
-
const containerRef = (0,
|
|
7959
|
-
(0,
|
|
8506
|
+
const [availableSprints, setAvailableSprints] = (0, import_react25.useState)([]);
|
|
8507
|
+
const [sprintFilter, setSprintFilter] = (0, import_react25.useState)("upcoming");
|
|
8508
|
+
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0, import_react25.useState)(false);
|
|
8509
|
+
const [heroHeight, setHeroHeight] = (0, import_react25.useState)(0);
|
|
8510
|
+
const heroRef = (0, import_react25.useRef)(null);
|
|
8511
|
+
const containerRef = (0, import_react25.useRef)(null);
|
|
8512
|
+
(0, import_react25.useEffect)(() => {
|
|
7960
8513
|
const savedSprintIds = localStorage.getItem("planningView_selectedSprints");
|
|
7961
8514
|
if (savedSprintIds) {
|
|
7962
8515
|
try {
|
|
@@ -7969,10 +8522,10 @@ var PlanningView = ({
|
|
|
7969
8522
|
}
|
|
7970
8523
|
}
|
|
7971
8524
|
}, []);
|
|
7972
|
-
(0,
|
|
8525
|
+
(0, import_react25.useEffect)(() => {
|
|
7973
8526
|
localStorage.setItem("planningView_selectedSprints", JSON.stringify(selectedSprintIds));
|
|
7974
8527
|
}, [selectedSprintIds]);
|
|
7975
|
-
(0,
|
|
8528
|
+
(0, import_react25.useEffect)(() => {
|
|
7976
8529
|
const updateHeroHeight = () => {
|
|
7977
8530
|
if (heroRef.current) {
|
|
7978
8531
|
setHeroHeight(heroRef.current.offsetHeight);
|
|
@@ -8033,7 +8586,7 @@ var PlanningView = ({
|
|
|
8033
8586
|
});
|
|
8034
8587
|
return { tasksByEpic, unassignedTasks };
|
|
8035
8588
|
};
|
|
8036
|
-
(0,
|
|
8589
|
+
(0, import_react25.useEffect)(() => {
|
|
8037
8590
|
setAvailableSprints(sprints);
|
|
8038
8591
|
}, [sprints]);
|
|
8039
8592
|
const displayedSprints = availableSprints.filter((sprint) => {
|
|
@@ -8156,7 +8709,7 @@ var PlanningView = ({
|
|
|
8156
8709
|
e.dataTransfer.setData("text/plain", task.id.toString());
|
|
8157
8710
|
handleDragStart(e, task);
|
|
8158
8711
|
};
|
|
8159
|
-
return /* @__PURE__ */ (0,
|
|
8712
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8160
8713
|
Card,
|
|
8161
8714
|
{
|
|
8162
8715
|
className: "p-3 cursor-grab active:cursor-grabbing hover:shadow-md transition-all duration-200 border border-border bg-card hover:bg-accent/50",
|
|
@@ -8164,28 +8717,28 @@ var PlanningView = ({
|
|
|
8164
8717
|
onDragStart: handleCardDragStart,
|
|
8165
8718
|
onClick: handleCardClick,
|
|
8166
8719
|
style: { userSelect: "none" },
|
|
8167
|
-
children: /* @__PURE__ */ (0,
|
|
8168
|
-
/* @__PURE__ */ (0,
|
|
8169
|
-
/* @__PURE__ */ (0,
|
|
8170
|
-
/* @__PURE__ */ (0,
|
|
8720
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2 pointer-events-none", children: [
|
|
8721
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
8722
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h4", { className: "font-medium text-sm text-foreground line-clamp-1", children: task.name }),
|
|
8723
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Badge, { className: `text-xs ${getPriorityColor(task.priority || "medium")}`, children: task.priority?.[0]?.toUpperCase() })
|
|
8171
8724
|
] }),
|
|
8172
|
-
/* @__PURE__ */ (0,
|
|
8173
|
-
/* @__PURE__ */ (0,
|
|
8174
|
-
epic && /* @__PURE__ */ (0,
|
|
8175
|
-
/* @__PURE__ */ (0,
|
|
8725
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
|
|
8726
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-1", children: [
|
|
8727
|
+
epic && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
8728
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "text-muted-foreground truncate", children: epic?.name })
|
|
8176
8729
|
] }),
|
|
8177
|
-
/* @__PURE__ */ (0,
|
|
8730
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "text-muted-foreground", children: getDisplayName(task.assignee?.value?.name) })
|
|
8178
8731
|
] }),
|
|
8179
|
-
showSprint && sprint && /* @__PURE__ */ (0,
|
|
8180
|
-
/* @__PURE__ */ (0,
|
|
8181
|
-
/* @__PURE__ */ (0,
|
|
8732
|
+
showSprint && sprint && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
|
|
8733
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Calendar, { className: "h-3 w-3" }),
|
|
8734
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { children: sprint.name })
|
|
8182
8735
|
] })
|
|
8183
8736
|
] })
|
|
8184
8737
|
}
|
|
8185
8738
|
);
|
|
8186
8739
|
};
|
|
8187
|
-
return /* @__PURE__ */ (0,
|
|
8188
|
-
/* @__PURE__ */ (0,
|
|
8740
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { ref: containerRef, className: "h-full flex flex-col px-2 md:px-4 py-4", children: [
|
|
8741
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8189
8742
|
DashboardHero,
|
|
8190
8743
|
{
|
|
8191
8744
|
title: "Sprint Planning",
|
|
@@ -8197,7 +8750,7 @@ var PlanningView = ({
|
|
|
8197
8750
|
}
|
|
8198
8751
|
}
|
|
8199
8752
|
) }),
|
|
8200
|
-
/* @__PURE__ */ (0,
|
|
8753
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8201
8754
|
"div",
|
|
8202
8755
|
{
|
|
8203
8756
|
className: "h-full",
|
|
@@ -8205,30 +8758,30 @@ var PlanningView = ({
|
|
|
8205
8758
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
8206
8759
|
},
|
|
8207
8760
|
children: [
|
|
8208
|
-
/* @__PURE__ */ (0,
|
|
8209
|
-
/* @__PURE__ */ (0,
|
|
8210
|
-
/* @__PURE__ */ (0,
|
|
8211
|
-
/* @__PURE__ */ (0,
|
|
8212
|
-
/* @__PURE__ */ (0,
|
|
8213
|
-
/* @__PURE__ */ (0,
|
|
8761
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "mb-4", children: [
|
|
8762
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
8763
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
8764
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { children: [
|
|
8765
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Sprint Board" }),
|
|
8766
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
8214
8767
|
selectedSprintIds?.length,
|
|
8215
8768
|
"/3 selected"
|
|
8216
8769
|
] })
|
|
8217
8770
|
] }),
|
|
8218
|
-
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0,
|
|
8219
|
-
/* @__PURE__ */ (0,
|
|
8220
|
-
/* @__PURE__ */ (0,
|
|
8771
|
+
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8772
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
8773
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleSprints.map((sprint) => /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8221
8774
|
"div",
|
|
8222
8775
|
{
|
|
8223
8776
|
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
8224
8777
|
children: [
|
|
8225
|
-
/* @__PURE__ */ (0,
|
|
8226
|
-
/* @__PURE__ */ (0,
|
|
8778
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "max-w-[80px] truncate", children: sprint.name }),
|
|
8779
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8227
8780
|
"button",
|
|
8228
8781
|
{
|
|
8229
8782
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
8230
8783
|
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
8231
|
-
children: /* @__PURE__ */ (0,
|
|
8784
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.X, { className: "h-4 w-4" })
|
|
8232
8785
|
}
|
|
8233
8786
|
)
|
|
8234
8787
|
]
|
|
@@ -8237,20 +8790,20 @@ var PlanningView = ({
|
|
|
8237
8790
|
)) })
|
|
8238
8791
|
] })
|
|
8239
8792
|
] }),
|
|
8240
|
-
/* @__PURE__ */ (0,
|
|
8241
|
-
/* @__PURE__ */ (0,
|
|
8793
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
8794
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8242
8795
|
Button,
|
|
8243
8796
|
{
|
|
8244
8797
|
onClick: () => setIsAddSprintModalOpen(true),
|
|
8245
8798
|
className: "bg-primary hover:bg-primary/90 text-primary-foreground gap-1",
|
|
8246
8799
|
size: "sm",
|
|
8247
8800
|
children: [
|
|
8248
|
-
/* @__PURE__ */ (0,
|
|
8801
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Plus, { className: "h-3 w-3" }),
|
|
8249
8802
|
"Add"
|
|
8250
8803
|
]
|
|
8251
8804
|
}
|
|
8252
8805
|
),
|
|
8253
|
-
/* @__PURE__ */ (0,
|
|
8806
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8254
8807
|
Button,
|
|
8255
8808
|
{
|
|
8256
8809
|
onClick: () => setIsSprintSelectorOpen(!isSprintSelectorOpen),
|
|
@@ -8258,43 +8811,43 @@ var PlanningView = ({
|
|
|
8258
8811
|
size: "sm",
|
|
8259
8812
|
className: "gap-1",
|
|
8260
8813
|
children: [
|
|
8261
|
-
/* @__PURE__ */ (0,
|
|
8814
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Calendar, { className: "h-3 w-3" }),
|
|
8262
8815
|
isSprintSelectorOpen ? "Close" : "Select"
|
|
8263
8816
|
]
|
|
8264
8817
|
}
|
|
8265
8818
|
)
|
|
8266
8819
|
] })
|
|
8267
8820
|
] }) }),
|
|
8268
|
-
isSprintSelectorOpen && /* @__PURE__ */ (0,
|
|
8821
|
+
isSprintSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8269
8822
|
"div",
|
|
8270
8823
|
{
|
|
8271
8824
|
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
8272
8825
|
onClick: () => setIsSprintSelectorOpen(false)
|
|
8273
8826
|
}
|
|
8274
8827
|
),
|
|
8275
|
-
/* @__PURE__ */ (0,
|
|
8828
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8276
8829
|
"div",
|
|
8277
8830
|
{
|
|
8278
8831
|
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"}`,
|
|
8279
|
-
children: /* @__PURE__ */ (0,
|
|
8280
|
-
/* @__PURE__ */ (0,
|
|
8281
|
-
/* @__PURE__ */ (0,
|
|
8282
|
-
/* @__PURE__ */ (0,
|
|
8283
|
-
/* @__PURE__ */ (0,
|
|
8832
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
8833
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
8834
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
8835
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Sprints" }),
|
|
8836
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8284
8837
|
Button,
|
|
8285
8838
|
{
|
|
8286
8839
|
variant: "ghost",
|
|
8287
8840
|
size: "sm",
|
|
8288
8841
|
onClick: () => setIsSprintSelectorOpen(false),
|
|
8289
8842
|
className: "h-8 w-8 p-0",
|
|
8290
|
-
children: /* @__PURE__ */ (0,
|
|
8843
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.X, { className: "h-4 w-4" })
|
|
8291
8844
|
}
|
|
8292
8845
|
)
|
|
8293
8846
|
] }),
|
|
8294
|
-
/* @__PURE__ */ (0,
|
|
8847
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Choose up to 3 sprints to view in your planning board" })
|
|
8295
8848
|
] }),
|
|
8296
|
-
/* @__PURE__ */ (0,
|
|
8297
|
-
/* @__PURE__ */ (0,
|
|
8849
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: [
|
|
8850
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex gap-1 mb-4 bg-muted p-1 rounded-lg", children: [
|
|
8298
8851
|
{ key: "all", label: "All", count: sprints.length },
|
|
8299
8852
|
{
|
|
8300
8853
|
key: "active",
|
|
@@ -8306,7 +8859,7 @@ var PlanningView = ({
|
|
|
8306
8859
|
label: "Upcoming"
|
|
8307
8860
|
// count: sprints.filter((s) => !s.isActive).length,
|
|
8308
8861
|
}
|
|
8309
|
-
].map((filter) => /* @__PURE__ */ (0,
|
|
8862
|
+
].map((filter) => /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8310
8863
|
Button,
|
|
8311
8864
|
{
|
|
8312
8865
|
variant: sprintFilter === filter.key ? "default" : "outline",
|
|
@@ -8322,18 +8875,18 @@ var PlanningView = ({
|
|
|
8322
8875
|
},
|
|
8323
8876
|
filter.key
|
|
8324
8877
|
)) }),
|
|
8325
|
-
/* @__PURE__ */ (0,
|
|
8878
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto", children: displayedSprints.length > 0 ? displayedSprints.map((sprint) => {
|
|
8326
8879
|
const isSelected = selectedSprintIds.includes(sprint.id.toString());
|
|
8327
8880
|
const taskCount = tasks.filter(
|
|
8328
8881
|
(task) => extractId(task.sprint) === sprint.id
|
|
8329
8882
|
).length;
|
|
8330
8883
|
const canSelect = !isSelected && selectedSprintIds.length < 3;
|
|
8331
|
-
return /* @__PURE__ */ (0,
|
|
8884
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8332
8885
|
"div",
|
|
8333
8886
|
{
|
|
8334
8887
|
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"}`,
|
|
8335
|
-
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0,
|
|
8336
|
-
/* @__PURE__ */ (0,
|
|
8888
|
+
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-3", children: [
|
|
8889
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8337
8890
|
Input,
|
|
8338
8891
|
{
|
|
8339
8892
|
value: sprintEditForm.name,
|
|
@@ -8342,7 +8895,7 @@ var PlanningView = ({
|
|
|
8342
8895
|
placeholder: "Sprint name"
|
|
8343
8896
|
}
|
|
8344
8897
|
),
|
|
8345
|
-
/* @__PURE__ */ (0,
|
|
8898
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8346
8899
|
Textarea,
|
|
8347
8900
|
{
|
|
8348
8901
|
value: sprintEditForm.description,
|
|
@@ -8354,10 +8907,10 @@ var PlanningView = ({
|
|
|
8354
8907
|
placeholder: "Sprint description"
|
|
8355
8908
|
}
|
|
8356
8909
|
),
|
|
8357
|
-
/* @__PURE__ */ (0,
|
|
8358
|
-
/* @__PURE__ */ (0,
|
|
8359
|
-
/* @__PURE__ */ (0,
|
|
8360
|
-
/* @__PURE__ */ (0,
|
|
8910
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
8911
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { children: [
|
|
8912
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "Start Date" }),
|
|
8913
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8361
8914
|
Input,
|
|
8362
8915
|
{
|
|
8363
8916
|
type: "date",
|
|
@@ -8370,9 +8923,9 @@ var PlanningView = ({
|
|
|
8370
8923
|
}
|
|
8371
8924
|
)
|
|
8372
8925
|
] }),
|
|
8373
|
-
/* @__PURE__ */ (0,
|
|
8374
|
-
/* @__PURE__ */ (0,
|
|
8375
|
-
/* @__PURE__ */ (0,
|
|
8926
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { children: [
|
|
8927
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "End Date" }),
|
|
8928
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8376
8929
|
Input,
|
|
8377
8930
|
{
|
|
8378
8931
|
type: "date",
|
|
@@ -8386,20 +8939,20 @@ var PlanningView = ({
|
|
|
8386
8939
|
)
|
|
8387
8940
|
] })
|
|
8388
8941
|
] }),
|
|
8389
|
-
/* @__PURE__ */ (0,
|
|
8390
|
-
/* @__PURE__ */ (0,
|
|
8942
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex gap-2", children: [
|
|
8943
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8391
8944
|
Button,
|
|
8392
8945
|
{
|
|
8393
8946
|
size: "sm",
|
|
8394
8947
|
onClick: () => handleSprintEditSave(),
|
|
8395
8948
|
className: "flex-1",
|
|
8396
8949
|
children: [
|
|
8397
|
-
/* @__PURE__ */ (0,
|
|
8950
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Check, { className: "h-3 w-3 mr-1" }),
|
|
8398
8951
|
"Save"
|
|
8399
8952
|
]
|
|
8400
8953
|
}
|
|
8401
8954
|
),
|
|
8402
|
-
/* @__PURE__ */ (0,
|
|
8955
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8403
8956
|
Button,
|
|
8404
8957
|
{
|
|
8405
8958
|
size: "sm",
|
|
@@ -8407,18 +8960,18 @@ var PlanningView = ({
|
|
|
8407
8960
|
onClick: handleSprintEditCancel,
|
|
8408
8961
|
className: "flex-1",
|
|
8409
8962
|
children: [
|
|
8410
|
-
/* @__PURE__ */ (0,
|
|
8963
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.X, { className: "h-3 w-3 mr-1" }),
|
|
8411
8964
|
"Cancel"
|
|
8412
8965
|
]
|
|
8413
8966
|
}
|
|
8414
8967
|
)
|
|
8415
8968
|
] })
|
|
8416
|
-
] }) : /* @__PURE__ */ (0,
|
|
8417
|
-
/* @__PURE__ */ (0,
|
|
8418
|
-
/* @__PURE__ */ (0,
|
|
8419
|
-
/* @__PURE__ */ (0,
|
|
8420
|
-
/* @__PURE__ */ (0,
|
|
8421
|
-
isSprintActive(sprint) && /* @__PURE__ */ (0,
|
|
8969
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { children: [
|
|
8970
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
8971
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
8972
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
8973
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h4", { className: "font-medium text-sm text-foreground truncate", children: sprint.name }),
|
|
8974
|
+
isSprintActive(sprint) && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8422
8975
|
Badge,
|
|
8423
8976
|
{
|
|
8424
8977
|
variant: "default",
|
|
@@ -8427,43 +8980,43 @@ var PlanningView = ({
|
|
|
8427
8980
|
}
|
|
8428
8981
|
)
|
|
8429
8982
|
] }),
|
|
8430
|
-
/* @__PURE__ */ (0,
|
|
8431
|
-
/* @__PURE__ */ (0,
|
|
8432
|
-
/* @__PURE__ */ (0,
|
|
8433
|
-
/* @__PURE__ */ (0,
|
|
8983
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { className: "text-xs text-muted-foreground line-clamp-2 mb-2", children: sprint.description }),
|
|
8984
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
|
|
8985
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
8986
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.CalendarDays, { className: "h-3 w-3" }),
|
|
8434
8987
|
new Date(sprint.startDate).toLocaleDateString()
|
|
8435
8988
|
] }),
|
|
8436
|
-
/* @__PURE__ */ (0,
|
|
8437
|
-
/* @__PURE__ */ (0,
|
|
8989
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
8990
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.User, { className: "h-3 w-3" }),
|
|
8438
8991
|
taskCount,
|
|
8439
8992
|
" tasks"
|
|
8440
8993
|
] })
|
|
8441
8994
|
] })
|
|
8442
8995
|
] }),
|
|
8443
|
-
/* @__PURE__ */ (0,
|
|
8444
|
-
/* @__PURE__ */ (0,
|
|
8996
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-1 ml-2", children: [
|
|
8997
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8445
8998
|
Button,
|
|
8446
8999
|
{
|
|
8447
9000
|
size: "sm",
|
|
8448
9001
|
variant: "ghost",
|
|
8449
9002
|
onClick: () => handleSprintEditStart(sprint),
|
|
8450
9003
|
className: "h-6 w-6 p-0",
|
|
8451
|
-
children: /* @__PURE__ */ (0,
|
|
9004
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Edit2, { className: "h-3 w-3" })
|
|
8452
9005
|
}
|
|
8453
9006
|
),
|
|
8454
|
-
/* @__PURE__ */ (0,
|
|
9007
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8455
9008
|
Button,
|
|
8456
9009
|
{
|
|
8457
9010
|
size: "sm",
|
|
8458
9011
|
variant: "ghost",
|
|
8459
9012
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
8460
9013
|
className: "h-6 w-6 p-0 text-destructive hover:text-destructive",
|
|
8461
|
-
children: /* @__PURE__ */ (0,
|
|
9014
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Trash2, { className: "h-3 w-3" })
|
|
8462
9015
|
}
|
|
8463
9016
|
)
|
|
8464
9017
|
] })
|
|
8465
9018
|
] }),
|
|
8466
|
-
/* @__PURE__ */ (0,
|
|
9019
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex items-center justify-between mt-2", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8467
9020
|
Button,
|
|
8468
9021
|
{
|
|
8469
9022
|
variant: isSelected ? "default" : "outline",
|
|
@@ -8471,21 +9024,21 @@ var PlanningView = ({
|
|
|
8471
9024
|
className: "text-xs w-full h-8 flex items-center justify-center cursor-pointer",
|
|
8472
9025
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
8473
9026
|
disabled: !isSelected && selectedSprintIds?.length >= 3,
|
|
8474
|
-
children: /* @__PURE__ */ (0,
|
|
9027
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "pointer-events-none select-none", children: isSelected ? "Deselect" : selectedSprintIds?.length >= 3 ? "Limit Reached" : "Select" })
|
|
8475
9028
|
}
|
|
8476
9029
|
) })
|
|
8477
9030
|
] })
|
|
8478
9031
|
},
|
|
8479
9032
|
sprint.id
|
|
8480
9033
|
);
|
|
8481
|
-
}) : /* @__PURE__ */ (0,
|
|
8482
|
-
/* @__PURE__ */ (0,
|
|
8483
|
-
/* @__PURE__ */ (0,
|
|
9034
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "text-center py-8 text-muted-foreground", children: [
|
|
9035
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Calendar, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
|
|
9036
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("p", { className: "text-sm", children: [
|
|
8484
9037
|
'No sprints found for "',
|
|
8485
9038
|
sprintFilter,
|
|
8486
9039
|
'" filter'
|
|
8487
9040
|
] }),
|
|
8488
|
-
/* @__PURE__ */ (0,
|
|
9041
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8489
9042
|
Button,
|
|
8490
9043
|
{
|
|
8491
9044
|
variant: "link",
|
|
@@ -8496,18 +9049,18 @@ var PlanningView = ({
|
|
|
8496
9049
|
}
|
|
8497
9050
|
)
|
|
8498
9051
|
] }) }),
|
|
8499
|
-
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0,
|
|
8500
|
-
/* @__PURE__ */ (0,
|
|
8501
|
-
/* @__PURE__ */ (0,
|
|
8502
|
-
/* @__PURE__ */ (0,
|
|
9052
|
+
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "mt-4 p-4 bg-muted/50 rounded-lg border-2 border-dashed border-border", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "text-center", children: [
|
|
9053
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Calendar, { className: "h-6 w-6 mx-auto mb-2 text-muted-foreground" }),
|
|
9054
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { className: "text-sm text-muted-foreground font-medium", children: "Select sprints to start planning" }),
|
|
9055
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("p", { className: "text-xs text-muted-foreground mt-1", children: "Choose up to 3 sprints to view alongside your backlog" })
|
|
8503
9056
|
] }) })
|
|
8504
9057
|
] })
|
|
8505
9058
|
] })
|
|
8506
9059
|
}
|
|
8507
9060
|
)
|
|
8508
9061
|
] }),
|
|
8509
|
-
/* @__PURE__ */ (0,
|
|
8510
|
-
/* @__PURE__ */ (0,
|
|
9062
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-4 gap-6 h-full flex-1 min-h-0", children: [
|
|
9063
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "lg:col-span-1", children: /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8511
9064
|
Card,
|
|
8512
9065
|
{
|
|
8513
9066
|
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",
|
|
@@ -8519,78 +9072,78 @@ var PlanningView = ({
|
|
|
8519
9072
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
8520
9073
|
},
|
|
8521
9074
|
children: [
|
|
8522
|
-
/* @__PURE__ */ (0,
|
|
8523
|
-
/* @__PURE__ */ (0,
|
|
8524
|
-
/* @__PURE__ */ (0,
|
|
8525
|
-
/* @__PURE__ */ (0,
|
|
9075
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
9076
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: "Backlog" }),
|
|
9077
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9078
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Badge, { variant: "secondary", className: "bg-muted text-muted-foreground", children: [
|
|
8526
9079
|
backlogTasks?.length,
|
|
8527
9080
|
" tasks"
|
|
8528
9081
|
] }),
|
|
8529
|
-
/* @__PURE__ */ (0,
|
|
9082
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(Badge, { variant: "outline", className: "bg-gray-50 text-gray-700 border-gray-200", children: [
|
|
8530
9083
|
backlogStoryPoints,
|
|
8531
9084
|
" pts"
|
|
8532
9085
|
] })
|
|
8533
9086
|
] })
|
|
8534
9087
|
] }),
|
|
8535
|
-
/* @__PURE__ */ (0,
|
|
9088
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8536
9089
|
"div",
|
|
8537
9090
|
{
|
|
8538
9091
|
className: `flex-1 overflow-y-auto space-y-3 min-h-0 p-3 rounded transition-colors ${dragOverTarget === "backlog" ? "bg-primary/10" : ""}`,
|
|
8539
9092
|
children: (() => {
|
|
8540
9093
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(backlogTasks);
|
|
8541
|
-
return /* @__PURE__ */ (0,
|
|
9094
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
|
|
8542
9095
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
8543
9096
|
const epic = getEpicById(epicId);
|
|
8544
9097
|
if (!epic) return null;
|
|
8545
9098
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
8546
|
-
return /* @__PURE__ */ (0,
|
|
8547
|
-
/* @__PURE__ */ (0,
|
|
9099
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2", children: [
|
|
9100
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8548
9101
|
"div",
|
|
8549
9102
|
{
|
|
8550
9103
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
8551
9104
|
onClick: () => toggleEpicCollapse(epicId),
|
|
8552
9105
|
children: [
|
|
8553
|
-
/* @__PURE__ */ (0,
|
|
8554
|
-
/* @__PURE__ */ (0,
|
|
8555
|
-
/* @__PURE__ */ (0,
|
|
9106
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
9107
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
9108
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
8556
9109
|
"(",
|
|
8557
9110
|
epicTasks?.length,
|
|
8558
9111
|
")"
|
|
8559
9112
|
] }),
|
|
8560
|
-
/* @__PURE__ */ (0,
|
|
9113
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
8561
9114
|
]
|
|
8562
9115
|
}
|
|
8563
9116
|
),
|
|
8564
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
9117
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
8565
9118
|
] }, epicId);
|
|
8566
9119
|
}),
|
|
8567
9120
|
unassignedTasks?.length > 0 && (() => {
|
|
8568
9121
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
8569
|
-
return /* @__PURE__ */ (0,
|
|
8570
|
-
/* @__PURE__ */ (0,
|
|
9122
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2", children: [
|
|
9123
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8571
9124
|
"div",
|
|
8572
9125
|
{
|
|
8573
9126
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
8574
9127
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
8575
9128
|
children: [
|
|
8576
|
-
/* @__PURE__ */ (0,
|
|
8577
|
-
/* @__PURE__ */ (0,
|
|
8578
|
-
/* @__PURE__ */ (0,
|
|
9129
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
9130
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
9131
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
8579
9132
|
"(",
|
|
8580
9133
|
unassignedTasks?.length,
|
|
8581
9134
|
")"
|
|
8582
9135
|
] }),
|
|
8583
|
-
/* @__PURE__ */ (0,
|
|
9136
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
8584
9137
|
]
|
|
8585
9138
|
}
|
|
8586
9139
|
),
|
|
8587
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
9140
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
8588
9141
|
] });
|
|
8589
9142
|
})(),
|
|
8590
|
-
backlogTasks?.length === 0 && /* @__PURE__ */ (0,
|
|
8591
|
-
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0,
|
|
8592
|
-
/* @__PURE__ */ (0,
|
|
8593
|
-
backlogTasks?.map((task) => /* @__PURE__ */ (0,
|
|
9143
|
+
backlogTasks?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime48.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" }),
|
|
9144
|
+
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2", children: [
|
|
9145
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "text-xs text-muted-foreground mb-2", children: "Direct backlog tasks:" }),
|
|
9146
|
+
backlogTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompactTaskCard, { task }, task.id))
|
|
8594
9147
|
] })
|
|
8595
9148
|
] });
|
|
8596
9149
|
})()
|
|
@@ -8607,7 +9160,7 @@ var PlanningView = ({
|
|
|
8607
9160
|
(sum, task) => sum + (task?.storyPoints || 0),
|
|
8608
9161
|
0
|
|
8609
9162
|
);
|
|
8610
|
-
return /* @__PURE__ */ (0,
|
|
9163
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8611
9164
|
Card,
|
|
8612
9165
|
{
|
|
8613
9166
|
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",
|
|
@@ -8619,10 +9172,10 @@ var PlanningView = ({
|
|
|
8619
9172
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
8620
9173
|
},
|
|
8621
9174
|
children: [
|
|
8622
|
-
/* @__PURE__ */ (0,
|
|
8623
|
-
/* @__PURE__ */ (0,
|
|
8624
|
-
/* @__PURE__ */ (0,
|
|
8625
|
-
/* @__PURE__ */ (0,
|
|
9175
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
9176
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: sprint.name }) }),
|
|
9177
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9178
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8626
9179
|
Badge,
|
|
8627
9180
|
{
|
|
8628
9181
|
variant: "secondary",
|
|
@@ -8633,7 +9186,7 @@ var PlanningView = ({
|
|
|
8633
9186
|
]
|
|
8634
9187
|
}
|
|
8635
9188
|
),
|
|
8636
|
-
/* @__PURE__ */ (0,
|
|
9189
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8637
9190
|
Badge,
|
|
8638
9191
|
{
|
|
8639
9192
|
variant: "outline",
|
|
@@ -8644,7 +9197,7 @@ var PlanningView = ({
|
|
|
8644
9197
|
]
|
|
8645
9198
|
}
|
|
8646
9199
|
),
|
|
8647
|
-
/* @__PURE__ */ (0,
|
|
9200
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8648
9201
|
Button,
|
|
8649
9202
|
{
|
|
8650
9203
|
size: "sm",
|
|
@@ -8654,73 +9207,73 @@ var PlanningView = ({
|
|
|
8654
9207
|
handleSprintEditStart(sprint);
|
|
8655
9208
|
},
|
|
8656
9209
|
className: "h-6 px-2",
|
|
8657
|
-
children: /* @__PURE__ */ (0,
|
|
9210
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Edit2, { className: "h-3 w-3" })
|
|
8658
9211
|
}
|
|
8659
9212
|
),
|
|
8660
|
-
/* @__PURE__ */ (0,
|
|
9213
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8661
9214
|
Button,
|
|
8662
9215
|
{
|
|
8663
9216
|
size: "sm",
|
|
8664
9217
|
variant: "ghost",
|
|
8665
9218
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
8666
9219
|
className: "h-6 px-2 text-destructive hover:text-destructive",
|
|
8667
|
-
children: /* @__PURE__ */ (0,
|
|
9220
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.Trash2, { className: "h-3 w-3" })
|
|
8668
9221
|
}
|
|
8669
9222
|
)
|
|
8670
9223
|
] })
|
|
8671
9224
|
] }),
|
|
8672
|
-
/* @__PURE__ */ (0,
|
|
9225
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex-1 overflow-y-auto space-y-3 min-h-0", children: (() => {
|
|
8673
9226
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(sprintTasksFiltered);
|
|
8674
|
-
return /* @__PURE__ */ (0,
|
|
9227
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(import_jsx_runtime48.Fragment, { children: [
|
|
8675
9228
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
8676
9229
|
const epic = getEpicById(epicId);
|
|
8677
9230
|
if (!epic) return null;
|
|
8678
9231
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
8679
|
-
return /* @__PURE__ */ (0,
|
|
8680
|
-
/* @__PURE__ */ (0,
|
|
9232
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2", children: [
|
|
9233
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8681
9234
|
"div",
|
|
8682
9235
|
{
|
|
8683
9236
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
8684
9237
|
onClick: () => toggleEpicCollapse(epicId),
|
|
8685
9238
|
children: [
|
|
8686
|
-
/* @__PURE__ */ (0,
|
|
8687
|
-
/* @__PURE__ */ (0,
|
|
8688
|
-
/* @__PURE__ */ (0,
|
|
9239
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
9240
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
9241
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
8689
9242
|
"(",
|
|
8690
9243
|
epicTasks?.length,
|
|
8691
9244
|
")"
|
|
8692
9245
|
] }),
|
|
8693
|
-
/* @__PURE__ */ (0,
|
|
9246
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
8694
9247
|
]
|
|
8695
9248
|
}
|
|
8696
9249
|
),
|
|
8697
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
9250
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
8698
9251
|
] }, epicId);
|
|
8699
9252
|
}),
|
|
8700
9253
|
unassignedTasks?.length > 0 && (() => {
|
|
8701
9254
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
8702
|
-
return /* @__PURE__ */ (0,
|
|
8703
|
-
/* @__PURE__ */ (0,
|
|
9255
|
+
return /* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("div", { className: "space-y-2", children: [
|
|
9256
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)(
|
|
8704
9257
|
"div",
|
|
8705
9258
|
{
|
|
8706
9259
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
8707
9260
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
8708
9261
|
children: [
|
|
8709
|
-
/* @__PURE__ */ (0,
|
|
8710
|
-
/* @__PURE__ */ (0,
|
|
8711
|
-
/* @__PURE__ */ (0,
|
|
9262
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
9263
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
9264
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
8712
9265
|
"(",
|
|
8713
9266
|
unassignedTasks?.length,
|
|
8714
9267
|
")"
|
|
8715
9268
|
] }),
|
|
8716
|
-
/* @__PURE__ */ (0,
|
|
9269
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(import_lucide_react19.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
8717
9270
|
]
|
|
8718
9271
|
}
|
|
8719
9272
|
),
|
|
8720
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
9273
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime48.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
8721
9274
|
] });
|
|
8722
9275
|
})(),
|
|
8723
|
-
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0,
|
|
9276
|
+
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime48.jsx)("div", { className: "flex items-center justify-center h-32 text-muted-foreground text-sm select-none", children: "Drop tasks here" })
|
|
8724
9277
|
] });
|
|
8725
9278
|
})() })
|
|
8726
9279
|
]
|
|
@@ -8729,7 +9282,7 @@ var PlanningView = ({
|
|
|
8729
9282
|
);
|
|
8730
9283
|
})
|
|
8731
9284
|
] }),
|
|
8732
|
-
/* @__PURE__ */ (0,
|
|
9285
|
+
/* @__PURE__ */ (0, import_jsx_runtime48.jsx)(
|
|
8733
9286
|
AddSprintModal,
|
|
8734
9287
|
{
|
|
8735
9288
|
isOpen: isAddSprintModalOpen,
|
|
@@ -8744,9 +9297,9 @@ var PlanningView = ({
|
|
|
8744
9297
|
};
|
|
8745
9298
|
|
|
8746
9299
|
// src/components/Projects/TasksView.tsx
|
|
8747
|
-
var
|
|
8748
|
-
var
|
|
8749
|
-
var
|
|
9300
|
+
var import_react26 = require("react");
|
|
9301
|
+
var import_lucide_react20 = require("lucide-react");
|
|
9302
|
+
var import_jsx_runtime49 = require("react/jsx-runtime");
|
|
8750
9303
|
var formatDate = (date) => {
|
|
8751
9304
|
return date.toLocaleDateString("en-US", {
|
|
8752
9305
|
weekday: "short",
|
|
@@ -8784,7 +9337,7 @@ var isTomorrow = (date) => {
|
|
|
8784
9337
|
return date.toDateString() === tomorrow.toDateString();
|
|
8785
9338
|
};
|
|
8786
9339
|
var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
8787
|
-
const [formData, setFormData] = (0,
|
|
9340
|
+
const [formData, setFormData] = (0, import_react26.useState)({
|
|
8788
9341
|
title: "",
|
|
8789
9342
|
description: "",
|
|
8790
9343
|
dueDate: "",
|
|
@@ -8798,7 +9351,7 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8798
9351
|
reminderMinutes: 15,
|
|
8799
9352
|
tags: ""
|
|
8800
9353
|
});
|
|
8801
|
-
const [isColleagueError, setIsColleagueError] = (0,
|
|
9354
|
+
const [isColleagueError, setIsColleagueError] = (0, import_react26.useState)(false);
|
|
8802
9355
|
const handleSubmit = (e) => {
|
|
8803
9356
|
e.preventDefault();
|
|
8804
9357
|
const colleague = colleagues.find((c) => c?.id.toString() === formData.colleagueId.toString());
|
|
@@ -8843,18 +9396,18 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8843
9396
|
tags: ""
|
|
8844
9397
|
});
|
|
8845
9398
|
};
|
|
8846
|
-
(0,
|
|
9399
|
+
(0, import_react26.useEffect)(() => {
|
|
8847
9400
|
if (formData.colleagueId) {
|
|
8848
9401
|
setIsColleagueError(false);
|
|
8849
9402
|
}
|
|
8850
9403
|
}, [formData.colleagueId]);
|
|
8851
9404
|
const validColleagues = colleagues.filter(Boolean);
|
|
8852
|
-
return /* @__PURE__ */ (0,
|
|
8853
|
-
/* @__PURE__ */ (0,
|
|
8854
|
-
/* @__PURE__ */ (0,
|
|
8855
|
-
/* @__PURE__ */ (0,
|
|
8856
|
-
/* @__PURE__ */ (0,
|
|
8857
|
-
/* @__PURE__ */ (0,
|
|
9405
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
9406
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DialogTitle, { children: "Add New Reminder" }) }),
|
|
9407
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
9408
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9409
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "title", children: "Title" }),
|
|
9410
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8858
9411
|
Input,
|
|
8859
9412
|
{
|
|
8860
9413
|
id: "title",
|
|
@@ -8865,9 +9418,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8865
9418
|
}
|
|
8866
9419
|
)
|
|
8867
9420
|
] }) }),
|
|
8868
|
-
/* @__PURE__ */ (0,
|
|
8869
|
-
/* @__PURE__ */ (0,
|
|
8870
|
-
/* @__PURE__ */ (0,
|
|
9421
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9422
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "description", children: "Description" }),
|
|
9423
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8871
9424
|
Textarea,
|
|
8872
9425
|
{
|
|
8873
9426
|
id: "description",
|
|
@@ -8878,10 +9431,10 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8878
9431
|
}
|
|
8879
9432
|
)
|
|
8880
9433
|
] }),
|
|
8881
|
-
/* @__PURE__ */ (0,
|
|
8882
|
-
/* @__PURE__ */ (0,
|
|
8883
|
-
/* @__PURE__ */ (0,
|
|
8884
|
-
/* @__PURE__ */ (0,
|
|
9434
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
9435
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9436
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "dueDate", children: "Due Date" }),
|
|
9437
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8885
9438
|
Input,
|
|
8886
9439
|
{
|
|
8887
9440
|
id: "dueDate",
|
|
@@ -8892,9 +9445,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8892
9445
|
}
|
|
8893
9446
|
)
|
|
8894
9447
|
] }),
|
|
8895
|
-
/* @__PURE__ */ (0,
|
|
8896
|
-
/* @__PURE__ */ (0,
|
|
8897
|
-
/* @__PURE__ */ (0,
|
|
9448
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9449
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "dueTime", children: "Due Time (optional)" }),
|
|
9450
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8898
9451
|
Input,
|
|
8899
9452
|
{
|
|
8900
9453
|
id: "dueTime",
|
|
@@ -8905,9 +9458,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8905
9458
|
)
|
|
8906
9459
|
] })
|
|
8907
9460
|
] }),
|
|
8908
|
-
/* @__PURE__ */ (0,
|
|
8909
|
-
/* @__PURE__ */ (0,
|
|
8910
|
-
/* @__PURE__ */ (0,
|
|
9461
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9462
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { className: `${isColleagueError ? "text-destructive" : ""}`, htmlFor: "colleague", children: "Assigned Colleague" }),
|
|
9463
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
8911
9464
|
Select,
|
|
8912
9465
|
{
|
|
8913
9466
|
value: formData.colleagueId,
|
|
@@ -8916,11 +9469,11 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8916
9469
|
},
|
|
8917
9470
|
required: true,
|
|
8918
9471
|
children: [
|
|
8919
|
-
/* @__PURE__ */ (0,
|
|
9472
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8920
9473
|
SelectTrigger,
|
|
8921
9474
|
{
|
|
8922
9475
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
8923
|
-
children: /* @__PURE__ */ (0,
|
|
9476
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8924
9477
|
SelectValue,
|
|
8925
9478
|
{
|
|
8926
9479
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
@@ -8930,15 +9483,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8930
9483
|
)
|
|
8931
9484
|
}
|
|
8932
9485
|
),
|
|
8933
|
-
/* @__PURE__ */ (0,
|
|
9486
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectContent, { children: validColleagues.map((colleague) => /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectItem, { value: colleague.id.toString(), children: colleague.name }, colleague.id)) })
|
|
8934
9487
|
]
|
|
8935
9488
|
}
|
|
8936
9489
|
),
|
|
8937
|
-
isColleagueError && /* @__PURE__ */ (0,
|
|
9490
|
+
isColleagueError && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("p", { className: "text-destructive text-sm", children: "Please select a digital colleague" })
|
|
8938
9491
|
] }),
|
|
8939
|
-
/* @__PURE__ */ (0,
|
|
8940
|
-
/* @__PURE__ */ (0,
|
|
8941
|
-
/* @__PURE__ */ (0,
|
|
9492
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "space-y-2", children: [
|
|
9493
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
9494
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8942
9495
|
"input",
|
|
8943
9496
|
{
|
|
8944
9497
|
type: "checkbox",
|
|
@@ -8948,12 +9501,12 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8948
9501
|
className: "rounded border-border"
|
|
8949
9502
|
}
|
|
8950
9503
|
),
|
|
8951
|
-
/* @__PURE__ */ (0,
|
|
9504
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "isRecurring", children: "Make this a recurring reminder" })
|
|
8952
9505
|
] }),
|
|
8953
|
-
formData.isRecurring && /* @__PURE__ */ (0,
|
|
8954
|
-
/* @__PURE__ */ (0,
|
|
8955
|
-
/* @__PURE__ */ (0,
|
|
8956
|
-
/* @__PURE__ */ (0,
|
|
9506
|
+
formData.isRecurring && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "grid grid-cols-2 gap-4 pl-6", children: [
|
|
9507
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9508
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "recurrencePattern", children: "Frequency" }),
|
|
9509
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
8957
9510
|
Select,
|
|
8958
9511
|
{
|
|
8959
9512
|
value: formData.recurrencePattern,
|
|
@@ -8962,20 +9515,20 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8962
9515
|
recurrencePattern: value
|
|
8963
9516
|
}),
|
|
8964
9517
|
children: [
|
|
8965
|
-
/* @__PURE__ */ (0,
|
|
8966
|
-
/* @__PURE__ */ (0,
|
|
8967
|
-
/* @__PURE__ */ (0,
|
|
8968
|
-
/* @__PURE__ */ (0,
|
|
8969
|
-
/* @__PURE__ */ (0,
|
|
8970
|
-
/* @__PURE__ */ (0,
|
|
9518
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectTrigger, { children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectValue, {}) }),
|
|
9519
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectContent, { children: [
|
|
9520
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectItem, { value: "daily", children: "Daily" }),
|
|
9521
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectItem, { value: "weekly", children: "Weekly" }),
|
|
9522
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectItem, { value: "monthly", children: "Monthly" }),
|
|
9523
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectItem, { value: "yearly", children: "Yearly" })
|
|
8971
9524
|
] })
|
|
8972
9525
|
]
|
|
8973
9526
|
}
|
|
8974
9527
|
)
|
|
8975
9528
|
] }),
|
|
8976
|
-
/* @__PURE__ */ (0,
|
|
8977
|
-
/* @__PURE__ */ (0,
|
|
8978
|
-
/* @__PURE__ */ (0,
|
|
9529
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9530
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "recurrenceInterval", children: "Every" }),
|
|
9531
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
8979
9532
|
Input,
|
|
8980
9533
|
{
|
|
8981
9534
|
id: "recurrenceInterval",
|
|
@@ -8988,15 +9541,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
8988
9541
|
] })
|
|
8989
9542
|
] })
|
|
8990
9543
|
] }),
|
|
8991
|
-
/* @__PURE__ */ (0,
|
|
8992
|
-
/* @__PURE__ */ (0,
|
|
8993
|
-
/* @__PURE__ */ (0,
|
|
9544
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
9545
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Button, { type: "button", variant: "outline", onClick: () => setOpen(false), children: "Cancel" }),
|
|
9546
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Button, { type: "submit", children: "Add Reminder" })
|
|
8994
9547
|
] })
|
|
8995
9548
|
] })
|
|
8996
9549
|
] }) });
|
|
8997
9550
|
};
|
|
8998
9551
|
var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose }) => {
|
|
8999
|
-
const [formData, setFormData] = (0,
|
|
9552
|
+
const [formData, setFormData] = (0, import_react26.useState)({
|
|
9000
9553
|
title: reminder.title,
|
|
9001
9554
|
description: reminder.description,
|
|
9002
9555
|
dueDate: reminder.dueDate?.toString().split("T")[0],
|
|
@@ -9030,12 +9583,12 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9030
9583
|
onClose();
|
|
9031
9584
|
};
|
|
9032
9585
|
const validColleagues = colleagues.filter(Boolean);
|
|
9033
|
-
return /* @__PURE__ */ (0,
|
|
9034
|
-
/* @__PURE__ */ (0,
|
|
9035
|
-
/* @__PURE__ */ (0,
|
|
9036
|
-
/* @__PURE__ */ (0,
|
|
9037
|
-
/* @__PURE__ */ (0,
|
|
9038
|
-
/* @__PURE__ */ (0,
|
|
9586
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Dialog, { open, onOpenChange: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
9587
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(DialogTitle, { children: "Edit Reminder" }) }),
|
|
9588
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
9589
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9590
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "edit-title", children: "Title" }),
|
|
9591
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9039
9592
|
Input,
|
|
9040
9593
|
{
|
|
9041
9594
|
id: "edit-title",
|
|
@@ -9046,9 +9599,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9046
9599
|
}
|
|
9047
9600
|
)
|
|
9048
9601
|
] }) }),
|
|
9049
|
-
/* @__PURE__ */ (0,
|
|
9050
|
-
/* @__PURE__ */ (0,
|
|
9051
|
-
/* @__PURE__ */ (0,
|
|
9602
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9603
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "edit-description", children: "Description" }),
|
|
9604
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9052
9605
|
Textarea,
|
|
9053
9606
|
{
|
|
9054
9607
|
id: "edit-description",
|
|
@@ -9059,10 +9612,10 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9059
9612
|
}
|
|
9060
9613
|
)
|
|
9061
9614
|
] }),
|
|
9062
|
-
/* @__PURE__ */ (0,
|
|
9063
|
-
/* @__PURE__ */ (0,
|
|
9064
|
-
/* @__PURE__ */ (0,
|
|
9065
|
-
/* @__PURE__ */ (0,
|
|
9615
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
9616
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9617
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "edit-dueDate", children: "Due Date" }),
|
|
9618
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9066
9619
|
Input,
|
|
9067
9620
|
{
|
|
9068
9621
|
id: "edit-dueDate",
|
|
@@ -9073,9 +9626,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9073
9626
|
}
|
|
9074
9627
|
)
|
|
9075
9628
|
] }),
|
|
9076
|
-
/* @__PURE__ */ (0,
|
|
9077
|
-
/* @__PURE__ */ (0,
|
|
9078
|
-
/* @__PURE__ */ (0,
|
|
9629
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9630
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "edit-dueTime", children: "Due Time (optional)" }),
|
|
9631
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9079
9632
|
Input,
|
|
9080
9633
|
{
|
|
9081
9634
|
id: "edit-dueTime",
|
|
@@ -9086,8 +9639,8 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9086
9639
|
)
|
|
9087
9640
|
] })
|
|
9088
9641
|
] }),
|
|
9089
|
-
/* @__PURE__ */ (0,
|
|
9090
|
-
/* @__PURE__ */ (0,
|
|
9642
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "space-y-2", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
9643
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9091
9644
|
"input",
|
|
9092
9645
|
{
|
|
9093
9646
|
type: "checkbox",
|
|
@@ -9097,17 +9650,17 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
9097
9650
|
className: "rounded border-border"
|
|
9098
9651
|
}
|
|
9099
9652
|
),
|
|
9100
|
-
/* @__PURE__ */ (0,
|
|
9653
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Label2, { htmlFor: "edit-isRecurring", children: "Make this a recurring reminder" })
|
|
9101
9654
|
] }) }),
|
|
9102
|
-
/* @__PURE__ */ (0,
|
|
9103
|
-
/* @__PURE__ */ (0,
|
|
9104
|
-
/* @__PURE__ */ (0,
|
|
9655
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
9656
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Button, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }),
|
|
9657
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(Button, { type: "submit", children: "Save Changes" })
|
|
9105
9658
|
] })
|
|
9106
9659
|
] })
|
|
9107
9660
|
] }) });
|
|
9108
9661
|
};
|
|
9109
9662
|
var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }) => {
|
|
9110
|
-
const [isEditing, setIsEditing] = (0,
|
|
9663
|
+
const [isEditing, setIsEditing] = (0, import_react26.useState)(false);
|
|
9111
9664
|
if (!reminder || !reminder.id) {
|
|
9112
9665
|
return null;
|
|
9113
9666
|
}
|
|
@@ -9125,8 +9678,8 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
9125
9678
|
if (tomorrow) return "Tomorrow";
|
|
9126
9679
|
return formatDate(new Date(reminder.dueDate || ""));
|
|
9127
9680
|
};
|
|
9128
|
-
return /* @__PURE__ */ (0,
|
|
9129
|
-
/* @__PURE__ */ (0,
|
|
9681
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(import_jsx_runtime49.Fragment, { children: [
|
|
9682
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9130
9683
|
EditReminderModal,
|
|
9131
9684
|
{
|
|
9132
9685
|
reminder,
|
|
@@ -9136,61 +9689,61 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
9136
9689
|
onClose: () => setIsEditing(false)
|
|
9137
9690
|
}
|
|
9138
9691
|
),
|
|
9139
|
-
/* @__PURE__ */ (0,
|
|
9692
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9140
9693
|
Card,
|
|
9141
9694
|
{
|
|
9142
|
-
children: /* @__PURE__ */ (0,
|
|
9143
|
-
/* @__PURE__ */ (0,
|
|
9144
|
-
/* @__PURE__ */ (0,
|
|
9695
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(CardContent, { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
9696
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-start space-x-3 flex-1", children: [
|
|
9697
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9145
9698
|
"button",
|
|
9146
9699
|
{
|
|
9147
9700
|
onClick: handleToggleComplete,
|
|
9148
9701
|
className: "mt-1 text-primary hover:text-primary/80"
|
|
9149
9702
|
}
|
|
9150
9703
|
),
|
|
9151
|
-
/* @__PURE__ */ (0,
|
|
9152
|
-
/* @__PURE__ */ (0,
|
|
9704
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex-1", children: [
|
|
9705
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "flex items-center space-x-2 mb-1", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9153
9706
|
"h3",
|
|
9154
9707
|
{
|
|
9155
9708
|
children: reminder.title
|
|
9156
9709
|
}
|
|
9157
9710
|
) }),
|
|
9158
|
-
/* @__PURE__ */ (0,
|
|
9159
|
-
/* @__PURE__ */ (0,
|
|
9160
|
-
/* @__PURE__ */ (0,
|
|
9161
|
-
/* @__PURE__ */ (0,
|
|
9162
|
-
/* @__PURE__ */ (0,
|
|
9711
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("p", { className: "text-sm text-muted-foreground mb-2", children: reminder.description }),
|
|
9712
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-4 text-sm text-muted-foreground", children: [
|
|
9713
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
9714
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.Calendar, { className: "h-4 w-4" }),
|
|
9715
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { className: overdue ? "text-destructive font-medium" : "", children: getDateLabel() })
|
|
9163
9716
|
] }),
|
|
9164
|
-
reminder.dueTime && /* @__PURE__ */ (0,
|
|
9165
|
-
/* @__PURE__ */ (0,
|
|
9166
|
-
/* @__PURE__ */ (0,
|
|
9717
|
+
reminder.dueTime && /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
9718
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.Clock, { className: "h-4 w-4" }),
|
|
9719
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { children: formatTime(reminder.dueTime) })
|
|
9167
9720
|
] }),
|
|
9168
|
-
/* @__PURE__ */ (0,
|
|
9169
|
-
/* @__PURE__ */ (0,
|
|
9170
|
-
/* @__PURE__ */ (0,
|
|
9721
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
9722
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.User, { className: "h-4 w-4" }),
|
|
9723
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { children: typeof reminder.assignedColleague !== "number" ? reminder.assignedColleague.name : "Unknown Colleague" })
|
|
9171
9724
|
] })
|
|
9172
9725
|
] })
|
|
9173
9726
|
] })
|
|
9174
9727
|
] }),
|
|
9175
|
-
/* @__PURE__ */ (0,
|
|
9176
|
-
/* @__PURE__ */ (0,
|
|
9728
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
9729
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9177
9730
|
Button,
|
|
9178
9731
|
{
|
|
9179
9732
|
variant: "ghost",
|
|
9180
9733
|
size: "sm",
|
|
9181
9734
|
onClick: () => setIsEditing(true),
|
|
9182
9735
|
className: "h-8 w-8 p-0",
|
|
9183
|
-
children: /* @__PURE__ */ (0,
|
|
9736
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.Edit2, { className: "h-4 w-4" })
|
|
9184
9737
|
}
|
|
9185
9738
|
),
|
|
9186
|
-
/* @__PURE__ */ (0,
|
|
9739
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9187
9740
|
Button,
|
|
9188
9741
|
{
|
|
9189
9742
|
variant: "ghost",
|
|
9190
9743
|
size: "sm",
|
|
9191
9744
|
onClick: () => onDeleteReminder(reminder.id.toString()),
|
|
9192
9745
|
className: "h-8 w-8 p-0 text-destructive hover:text-destructive/80",
|
|
9193
|
-
children: /* @__PURE__ */ (0,
|
|
9746
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.Trash2, { className: "h-4 w-4" })
|
|
9194
9747
|
}
|
|
9195
9748
|
)
|
|
9196
9749
|
] })
|
|
@@ -9206,15 +9759,15 @@ var TasksView = ({
|
|
|
9206
9759
|
onUpdateReminder,
|
|
9207
9760
|
onDeleteReminder
|
|
9208
9761
|
}) => {
|
|
9209
|
-
const [reminders, setReminders] = (0,
|
|
9210
|
-
const [colleagues, setColleagues] = (0,
|
|
9211
|
-
const [filter, setFilter] = (0,
|
|
9212
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
9213
|
-
const [openAddReminderModal, setOpenAddReminderModal] = (0,
|
|
9214
|
-
(0,
|
|
9762
|
+
const [reminders, setReminders] = (0, import_react26.useState)(initialReminders.filter(Boolean));
|
|
9763
|
+
const [colleagues, setColleagues] = (0, import_react26.useState)(initialColleagues.filter(Boolean));
|
|
9764
|
+
const [filter, setFilter] = (0, import_react26.useState)("all");
|
|
9765
|
+
const [searchTerm, setSearchTerm] = (0, import_react26.useState)("");
|
|
9766
|
+
const [openAddReminderModal, setOpenAddReminderModal] = (0, import_react26.useState)(false);
|
|
9767
|
+
(0, import_react26.useEffect)(() => {
|
|
9215
9768
|
setReminders(initialReminders.filter(Boolean));
|
|
9216
9769
|
}, [initialReminders]);
|
|
9217
|
-
(0,
|
|
9770
|
+
(0, import_react26.useEffect)(() => {
|
|
9218
9771
|
setColleagues(initialColleagues.filter(Boolean));
|
|
9219
9772
|
}, [initialColleagues]);
|
|
9220
9773
|
const handleAddReminder = (newReminder) => {
|
|
@@ -9302,8 +9855,8 @@ var TasksView = ({
|
|
|
9302
9855
|
// lastUpdated: new Date(),
|
|
9303
9856
|
// isActive: true,
|
|
9304
9857
|
};
|
|
9305
|
-
return /* @__PURE__ */ (0,
|
|
9306
|
-
/* @__PURE__ */ (0,
|
|
9858
|
+
return /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
9859
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9307
9860
|
DashboardHero,
|
|
9308
9861
|
{
|
|
9309
9862
|
title: "Task Reminders",
|
|
@@ -9317,8 +9870,8 @@ var TasksView = ({
|
|
|
9317
9870
|
}
|
|
9318
9871
|
}
|
|
9319
9872
|
),
|
|
9320
|
-
/* @__PURE__ */ (0,
|
|
9321
|
-
/* @__PURE__ */ (0,
|
|
9873
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "h-full bg-background", children: [
|
|
9874
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9322
9875
|
AddReminderModal,
|
|
9323
9876
|
{
|
|
9324
9877
|
colleagues,
|
|
@@ -9327,48 +9880,48 @@ var TasksView = ({
|
|
|
9327
9880
|
setOpen: setOpenAddReminderModal
|
|
9328
9881
|
}
|
|
9329
9882
|
),
|
|
9330
|
-
/* @__PURE__ */ (0,
|
|
9331
|
-
/* @__PURE__ */ (0,
|
|
9332
|
-
/* @__PURE__ */ (0,
|
|
9333
|
-
/* @__PURE__ */ (0,
|
|
9334
|
-
/* @__PURE__ */ (0,
|
|
9883
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "p-6", children: [
|
|
9884
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [
|
|
9885
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { children: [
|
|
9886
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Task Reminders" }),
|
|
9887
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("p", { className: "text-muted-foreground", children: "Manage your digital colleague task reminders" })
|
|
9335
9888
|
] }),
|
|
9336
|
-
/* @__PURE__ */ (0,
|
|
9889
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(
|
|
9337
9890
|
Button,
|
|
9338
9891
|
{
|
|
9339
9892
|
className: "flex items-center space-x-2",
|
|
9340
9893
|
onClick: () => setOpenAddReminderModal(true),
|
|
9341
9894
|
children: [
|
|
9342
|
-
/* @__PURE__ */ (0,
|
|
9343
|
-
/* @__PURE__ */ (0,
|
|
9895
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(import_lucide_react20.Plus, { className: "h-4 w-4" }),
|
|
9896
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("span", { children: "Add Reminder" })
|
|
9344
9897
|
]
|
|
9345
9898
|
}
|
|
9346
9899
|
)
|
|
9347
9900
|
] }),
|
|
9348
|
-
/* @__PURE__ */ (0,
|
|
9349
|
-
/* @__PURE__ */ (0,
|
|
9350
|
-
/* @__PURE__ */ (0,
|
|
9351
|
-
/* @__PURE__ */ (0,
|
|
9901
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "grid grid-cols-5 gap-4 mb-6", children: [
|
|
9902
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-4", children: [
|
|
9903
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-2xl font-bold text-foreground", children: stats.total }),
|
|
9904
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-sm text-muted-foreground", children: "Total" })
|
|
9352
9905
|
] }),
|
|
9353
|
-
/* @__PURE__ */ (0,
|
|
9354
|
-
/* @__PURE__ */ (0,
|
|
9355
|
-
/* @__PURE__ */ (0,
|
|
9906
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-4", children: [
|
|
9907
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-2xl font-bold text-primary", children: stats.overdue }),
|
|
9908
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-sm text-muted-foreground", children: "Pending" })
|
|
9356
9909
|
] }),
|
|
9357
|
-
/* @__PURE__ */ (0,
|
|
9358
|
-
/* @__PURE__ */ (0,
|
|
9359
|
-
/* @__PURE__ */ (0,
|
|
9910
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-4", children: [
|
|
9911
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-2xl font-bold text-success", children: stats.today }),
|
|
9912
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-sm text-muted-foreground", children: "Completed" })
|
|
9360
9913
|
] }),
|
|
9361
|
-
/* @__PURE__ */ (0,
|
|
9362
|
-
/* @__PURE__ */ (0,
|
|
9363
|
-
/* @__PURE__ */ (0,
|
|
9914
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-4", children: [
|
|
9915
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-2xl font-bold text-destructive", children: stats.overdue }),
|
|
9916
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-sm text-muted-foreground", children: "Overdue" })
|
|
9364
9917
|
] }),
|
|
9365
|
-
/* @__PURE__ */ (0,
|
|
9366
|
-
/* @__PURE__ */ (0,
|
|
9367
|
-
/* @__PURE__ */ (0,
|
|
9918
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-4", children: [
|
|
9919
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-2xl font-bold text-warning", children: stats.today }),
|
|
9920
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-sm text-muted-foreground", children: "Today" })
|
|
9368
9921
|
] })
|
|
9369
9922
|
] }),
|
|
9370
|
-
/* @__PURE__ */ (0,
|
|
9371
|
-
/* @__PURE__ */ (0,
|
|
9923
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)("div", { className: "flex items-center space-x-4 mb-6", children: [
|
|
9924
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9372
9925
|
Input,
|
|
9373
9926
|
{
|
|
9374
9927
|
placeholder: "Search reminders...",
|
|
@@ -9377,25 +9930,25 @@ var TasksView = ({
|
|
|
9377
9930
|
className: "max-w-md"
|
|
9378
9931
|
}
|
|
9379
9932
|
) }),
|
|
9380
|
-
/* @__PURE__ */ (0,
|
|
9381
|
-
/* @__PURE__ */ (0,
|
|
9382
|
-
/* @__PURE__ */ (0,
|
|
9383
|
-
/* @__PURE__ */ (0,
|
|
9933
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Select, { value: filter, onValueChange: (value) => setFilter(value), children: [
|
|
9934
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(SelectValue, {}) }),
|
|
9935
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectContent, { children: [
|
|
9936
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectItem, { value: "all", children: [
|
|
9384
9937
|
"All (",
|
|
9385
9938
|
stats.total,
|
|
9386
9939
|
")"
|
|
9387
9940
|
] }),
|
|
9388
|
-
/* @__PURE__ */ (0,
|
|
9941
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectItem, { value: "overdue", children: [
|
|
9389
9942
|
"Overdue (",
|
|
9390
9943
|
stats.overdue,
|
|
9391
9944
|
")"
|
|
9392
9945
|
] }),
|
|
9393
|
-
/* @__PURE__ */ (0,
|
|
9946
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectItem, { value: "overdue", children: [
|
|
9394
9947
|
"Overdue (",
|
|
9395
9948
|
stats.overdue,
|
|
9396
9949
|
")"
|
|
9397
9950
|
] }),
|
|
9398
|
-
/* @__PURE__ */ (0,
|
|
9951
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(SelectItem, { value: "today", children: [
|
|
9399
9952
|
"Today (",
|
|
9400
9953
|
stats.today,
|
|
9401
9954
|
")"
|
|
@@ -9403,11 +9956,11 @@ var TasksView = ({
|
|
|
9403
9956
|
] })
|
|
9404
9957
|
] })
|
|
9405
9958
|
] }),
|
|
9406
|
-
/* @__PURE__ */ (0,
|
|
9407
|
-
/* @__PURE__ */ (0,
|
|
9408
|
-
!searchTerm && filter === "all" && /* @__PURE__ */ (0,
|
|
9959
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "space-y-4", children: sortedReminders.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime49.jsxs)(Card, { className: "p-8 text-center", children: [
|
|
9960
|
+
/* @__PURE__ */ (0, import_jsx_runtime49.jsx)("div", { className: "text-muted-foreground", children: searchTerm || filter !== "all" ? "No reminders match your filters" : "No reminders yet" }),
|
|
9961
|
+
!searchTerm && filter === "all" && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)("p", { className: "text-sm text-muted-foreground/60 mt-2", children: "Create your first reminder to get started" })
|
|
9409
9962
|
] }) : sortedReminders.map(
|
|
9410
|
-
(reminder) => reminder && /* @__PURE__ */ (0,
|
|
9963
|
+
(reminder) => reminder && /* @__PURE__ */ (0, import_jsx_runtime49.jsx)(
|
|
9411
9964
|
ReminderCard,
|
|
9412
9965
|
{
|
|
9413
9966
|
reminder,
|
|
@@ -9424,13 +9977,13 @@ var TasksView = ({
|
|
|
9424
9977
|
};
|
|
9425
9978
|
|
|
9426
9979
|
// src/components/Projects/FileView.tsx
|
|
9427
|
-
var
|
|
9428
|
-
var
|
|
9980
|
+
var import_react28 = require("react");
|
|
9981
|
+
var import_lucide_react22 = require("lucide-react");
|
|
9429
9982
|
|
|
9430
9983
|
// src/components/AdvancedComponents/navigation-tabs.tsx
|
|
9431
|
-
var
|
|
9432
|
-
var
|
|
9433
|
-
var
|
|
9984
|
+
var import_react27 = require("motion/react");
|
|
9985
|
+
var import_lucide_react21 = require("lucide-react");
|
|
9986
|
+
var import_jsx_runtime50 = require("react/jsx-runtime");
|
|
9434
9987
|
function NavigationTabs({
|
|
9435
9988
|
activeTab,
|
|
9436
9989
|
onTabChange,
|
|
@@ -9440,15 +9993,15 @@ function NavigationTabs({
|
|
|
9440
9993
|
gridCols = 6
|
|
9441
9994
|
}) {
|
|
9442
9995
|
const currentTab = tabOptions.find((tab) => tab.value === activeTab);
|
|
9443
|
-
return /* @__PURE__ */ (0,
|
|
9444
|
-
|
|
9996
|
+
return /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(
|
|
9997
|
+
import_react27.motion.div,
|
|
9445
9998
|
{
|
|
9446
9999
|
className: `flex-1 flex justify-center ${className}`,
|
|
9447
10000
|
initial: { opacity: 0, y: -20 },
|
|
9448
10001
|
animate: { opacity: 1, y: 0 },
|
|
9449
10002
|
transition: { duration: 0.3, ease: "easeOut" },
|
|
9450
10003
|
children: [
|
|
9451
|
-
/* @__PURE__ */ (0,
|
|
10004
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "hidden lg:block", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(Tabs, { value: activeTab, onValueChange: onTabChange, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
9452
10005
|
TabsList,
|
|
9453
10006
|
{
|
|
9454
10007
|
className: "grid w-full rounded-2xl p-0 h-10",
|
|
@@ -9459,14 +10012,14 @@ function NavigationTabs({
|
|
|
9459
10012
|
tabOptions.length
|
|
9460
10013
|
)}, minmax(0, 1fr))`
|
|
9461
10014
|
},
|
|
9462
|
-
children: tabOptions.map((tab) => /* @__PURE__ */ (0,
|
|
9463
|
-
|
|
10015
|
+
children: tabOptions.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
10016
|
+
import_react27.motion.div,
|
|
9464
10017
|
{
|
|
9465
10018
|
whileHover: { scale: 1.1 },
|
|
9466
10019
|
whileTap: { scale: 0.98 },
|
|
9467
10020
|
transition: { type: "spring", stiffness: 400, damping: 17 },
|
|
9468
10021
|
className: "flex-1 px-2",
|
|
9469
|
-
children: /* @__PURE__ */ (0,
|
|
10022
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
9470
10023
|
TabsTrigger,
|
|
9471
10024
|
{
|
|
9472
10025
|
value: tab.value,
|
|
@@ -9480,12 +10033,12 @@ function NavigationTabs({
|
|
|
9480
10033
|
))
|
|
9481
10034
|
}
|
|
9482
10035
|
) }) }),
|
|
9483
|
-
/* @__PURE__ */ (0,
|
|
9484
|
-
/* @__PURE__ */ (0,
|
|
10036
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)("div", { className: "lg:hidden", children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(DropdownMenu, { children: [
|
|
10037
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime50.jsxs)(Button, { variant: "outline", className: "rounded-2xl min-w-[140px] justify-between", children: [
|
|
9485
10038
|
currentTab?.label || "Select",
|
|
9486
|
-
/* @__PURE__ */ (0,
|
|
10039
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(import_lucide_react21.ChevronDown, { className: "h-4 w-4 ml-2" })
|
|
9487
10040
|
] }) }),
|
|
9488
|
-
/* @__PURE__ */ (0,
|
|
10041
|
+
/* @__PURE__ */ (0, import_jsx_runtime50.jsx)(DropdownMenuContent, { align: "center", className: "w-[180px]", children: tabOptions.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime50.jsx)(
|
|
9489
10042
|
DropdownMenuItem,
|
|
9490
10043
|
{
|
|
9491
10044
|
onClick: () => onTabChange?.(tab.value),
|
|
@@ -9501,8 +10054,8 @@ function NavigationTabs({
|
|
|
9501
10054
|
}
|
|
9502
10055
|
|
|
9503
10056
|
// src/components/Projects/FileView.tsx
|
|
9504
|
-
var
|
|
9505
|
-
var
|
|
10057
|
+
var import_react29 = require("motion/react");
|
|
10058
|
+
var import_jsx_runtime51 = require("react/jsx-runtime");
|
|
9506
10059
|
function FileView({
|
|
9507
10060
|
initialFiles = [],
|
|
9508
10061
|
onFileAdd,
|
|
@@ -9513,18 +10066,18 @@ function FileView({
|
|
|
9513
10066
|
compactView = false,
|
|
9514
10067
|
className
|
|
9515
10068
|
}) {
|
|
9516
|
-
const [files, setFiles] = (0,
|
|
9517
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
9518
|
-
const [appFilter, setAppFilter] = (0,
|
|
9519
|
-
const [activeTab, setActiveTab] = (0,
|
|
9520
|
-
const [isAddFileModalOpen, setIsAddFileModalOpen] = (0,
|
|
9521
|
-
const prevFilesHash = (0,
|
|
10069
|
+
const [files, setFiles] = (0, import_react28.useState)(initialFiles);
|
|
10070
|
+
const [searchTerm, setSearchTerm] = (0, import_react28.useState)("");
|
|
10071
|
+
const [appFilter, setAppFilter] = (0, import_react28.useState)("all");
|
|
10072
|
+
const [activeTab, setActiveTab] = (0, import_react28.useState)("all");
|
|
10073
|
+
const [isAddFileModalOpen, setIsAddFileModalOpen] = (0, import_react28.useState)(false);
|
|
10074
|
+
const prevFilesHash = (0, import_react28.useRef)("");
|
|
9522
10075
|
const getHash = (list) => {
|
|
9523
10076
|
return list.map(
|
|
9524
10077
|
(item) => `${item.id}-${new Date(item.createdAt).getTime()}-${new Date(item.updatedAt).getTime()}`
|
|
9525
10078
|
).join("-");
|
|
9526
10079
|
};
|
|
9527
|
-
(0,
|
|
10080
|
+
(0, import_react28.useEffect)(() => {
|
|
9528
10081
|
const next = getHash(
|
|
9529
10082
|
initialFiles.map((el) => ({
|
|
9530
10083
|
...el,
|
|
@@ -9561,16 +10114,16 @@ function FileView({
|
|
|
9561
10114
|
setSearchTerm("");
|
|
9562
10115
|
setAppFilter("all");
|
|
9563
10116
|
};
|
|
9564
|
-
return /* @__PURE__ */ (0,
|
|
9565
|
-
/* @__PURE__ */ (0,
|
|
9566
|
-
|
|
10117
|
+
return /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
10118
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_react29.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
10119
|
+
import_react29.motion.div,
|
|
9567
10120
|
{
|
|
9568
10121
|
initial: { opacity: 0, y: 10 },
|
|
9569
10122
|
animate: { opacity: 1, y: 0 },
|
|
9570
10123
|
exit: { opacity: 0, y: -10 },
|
|
9571
10124
|
transition: { duration: 0.2 },
|
|
9572
|
-
children: /* @__PURE__ */ (0,
|
|
9573
|
-
/* @__PURE__ */ (0,
|
|
10125
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: `space-y-6 ${className || ""}`, children: [
|
|
10126
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9574
10127
|
DashboardHero,
|
|
9575
10128
|
{
|
|
9576
10129
|
title: "Files",
|
|
@@ -9586,10 +10139,10 @@ function FileView({
|
|
|
9586
10139
|
}
|
|
9587
10140
|
}
|
|
9588
10141
|
),
|
|
9589
|
-
/* @__PURE__ */ (0,
|
|
9590
|
-
/* @__PURE__ */ (0,
|
|
9591
|
-
/* @__PURE__ */ (0,
|
|
9592
|
-
/* @__PURE__ */ (0,
|
|
10142
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(CardContent, { className: "pt-6", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "flex flex-col md:flex-row gap-4", children: [
|
|
10143
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "relative", children: [
|
|
10144
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react22.Search, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground" }),
|
|
10145
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9593
10146
|
Input,
|
|
9594
10147
|
{
|
|
9595
10148
|
placeholder: "Search files...",
|
|
@@ -9599,13 +10152,13 @@ function FileView({
|
|
|
9599
10152
|
}
|
|
9600
10153
|
)
|
|
9601
10154
|
] }) }),
|
|
9602
|
-
(searchTerm || appFilter !== "all") && /* @__PURE__ */ (0,
|
|
9603
|
-
/* @__PURE__ */ (0,
|
|
10155
|
+
(searchTerm || appFilter !== "all") && /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(Button, { variant: "outline", onClick: clearFilters, className: "gap-2", children: [
|
|
10156
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react22.Filter, { className: "h-4 w-4" }),
|
|
9604
10157
|
"Clear"
|
|
9605
10158
|
] })
|
|
9606
10159
|
] }) }) }),
|
|
9607
|
-
/* @__PURE__ */ (0,
|
|
9608
|
-
/* @__PURE__ */ (0,
|
|
10160
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "space-y-4", children: [
|
|
10161
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9609
10162
|
NavigationTabs,
|
|
9610
10163
|
{
|
|
9611
10164
|
activeTab,
|
|
@@ -9619,7 +10172,7 @@ function FileView({
|
|
|
9619
10172
|
gridCols: 3
|
|
9620
10173
|
}
|
|
9621
10174
|
),
|
|
9622
|
-
activeTab === "all" && /* @__PURE__ */ (0,
|
|
10175
|
+
activeTab === "all" && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9623
10176
|
FileList,
|
|
9624
10177
|
{
|
|
9625
10178
|
files: filteredFiles,
|
|
@@ -9629,7 +10182,7 @@ function FileView({
|
|
|
9629
10182
|
showHeader: !compactView
|
|
9630
10183
|
}
|
|
9631
10184
|
),
|
|
9632
|
-
activeTab === "recent" && /* @__PURE__ */ (0,
|
|
10185
|
+
activeTab === "recent" && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9633
10186
|
FileList,
|
|
9634
10187
|
{
|
|
9635
10188
|
files: recentFiles,
|
|
@@ -9639,7 +10192,7 @@ function FileView({
|
|
|
9639
10192
|
showHeader: !compactView
|
|
9640
10193
|
}
|
|
9641
10194
|
),
|
|
9642
|
-
activeTab === "shared" && /* @__PURE__ */ (0,
|
|
10195
|
+
activeTab === "shared" && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9643
10196
|
FileList,
|
|
9644
10197
|
{
|
|
9645
10198
|
files: sharedFiles,
|
|
@@ -9650,12 +10203,12 @@ function FileView({
|
|
|
9650
10203
|
}
|
|
9651
10204
|
)
|
|
9652
10205
|
] }),
|
|
9653
|
-
filteredFiles.length === 0 && /* @__PURE__ */ (0,
|
|
9654
|
-
/* @__PURE__ */ (0,
|
|
9655
|
-
/* @__PURE__ */ (0,
|
|
9656
|
-
/* @__PURE__ */ (0,
|
|
9657
|
-
/* @__PURE__ */ (0,
|
|
9658
|
-
/* @__PURE__ */ (0,
|
|
10206
|
+
filteredFiles.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime51.jsx)(CardContent, { className: "pt-6", children: /* @__PURE__ */ (0, import_jsx_runtime51.jsxs)("div", { className: "text-center py-8", children: [
|
|
10207
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react22.File, { className: "h-12 w-12 text-muted-foreground mx-auto mb-4" }),
|
|
10208
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("h3", { className: "text-lg font-semibold mb-2", children: "No files found" }),
|
|
10209
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)("p", { className: "text-muted-foreground mb-4", children: searchTerm || appFilter !== "all" ? "Try adjusting your filters to see more results." : "Get started by uploading your first file." }),
|
|
10210
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsxs)(Button, { onClick: handleAddFile, className: "gap-2", children: [
|
|
10211
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(import_lucide_react22.Plus, { className: "h-4 w-4" }),
|
|
9659
10212
|
"Upload File"
|
|
9660
10213
|
] })
|
|
9661
10214
|
] }) }) })
|
|
@@ -9663,7 +10216,7 @@ function FileView({
|
|
|
9663
10216
|
},
|
|
9664
10217
|
"files-view"
|
|
9665
10218
|
) }),
|
|
9666
|
-
/* @__PURE__ */ (0,
|
|
10219
|
+
/* @__PURE__ */ (0, import_jsx_runtime51.jsx)(
|
|
9667
10220
|
AddFileModal,
|
|
9668
10221
|
{
|
|
9669
10222
|
isOpen: isAddFileModalOpen,
|
|
@@ -9676,7 +10229,7 @@ function FileView({
|
|
|
9676
10229
|
|
|
9677
10230
|
// src/components/Projects/ProjectView.tsx
|
|
9678
10231
|
var import_navigation = require("next/navigation");
|
|
9679
|
-
var
|
|
10232
|
+
var import_jsx_runtime52 = require("react/jsx-runtime");
|
|
9680
10233
|
function ProjectView({
|
|
9681
10234
|
title = "",
|
|
9682
10235
|
initialTasks = [],
|
|
@@ -9724,47 +10277,47 @@ function ProjectView({
|
|
|
9724
10277
|
onCopilotClick,
|
|
9725
10278
|
handleAddComment
|
|
9726
10279
|
}) {
|
|
9727
|
-
const [tasks, setTasks] = (0,
|
|
9728
|
-
const [epics, setEpics] = (0,
|
|
9729
|
-
const [sprints, setSprints] = (0,
|
|
9730
|
-
const [projects, setProjects] = (0,
|
|
9731
|
-
const [reminders, setReminders] = (0,
|
|
9732
|
-
const [colleagues, setColleagues] = (0,
|
|
9733
|
-
const [users, setUsers] = (0,
|
|
9734
|
-
const [files, setFiles] = (0,
|
|
9735
|
-
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0,
|
|
9736
|
-
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0,
|
|
9737
|
-
const [selectedTask, setSelectedTask] = (0,
|
|
9738
|
-
const [selectedEpicForTask, setSelectedEpicForTask] = (0,
|
|
9739
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
9740
|
-
const [currentView, setCurrentView] = (0,
|
|
9741
|
-
const [mobileMenuOpen, setMobileMenuOpen] = (0,
|
|
10280
|
+
const [tasks, setTasks] = (0, import_react30.useState)(initialTasks);
|
|
10281
|
+
const [epics, setEpics] = (0, import_react30.useState)(initialEpics);
|
|
10282
|
+
const [sprints, setSprints] = (0, import_react30.useState)(initialSprints);
|
|
10283
|
+
const [projects, setProjects] = (0, import_react30.useState)(initialProjects);
|
|
10284
|
+
const [reminders, setReminders] = (0, import_react30.useState)(initialReminders);
|
|
10285
|
+
const [colleagues, setColleagues] = (0, import_react30.useState)(initialColleagues);
|
|
10286
|
+
const [users, setUsers] = (0, import_react30.useState)(initialUsers);
|
|
10287
|
+
const [files, setFiles] = (0, import_react30.useState)(initialFiles);
|
|
10288
|
+
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react30.useState)(false);
|
|
10289
|
+
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react30.useState)(false);
|
|
10290
|
+
const [selectedTask, setSelectedTask] = (0, import_react30.useState)(null);
|
|
10291
|
+
const [selectedEpicForTask, setSelectedEpicForTask] = (0, import_react30.useState)(null);
|
|
10292
|
+
const [draggedTask, setDraggedTask] = (0, import_react30.useState)(null);
|
|
10293
|
+
const [currentView, setCurrentView] = (0, import_react30.useState)(initialView || "kanban");
|
|
10294
|
+
const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react30.useState)(false);
|
|
9742
10295
|
const router = (0, import_navigation.useRouter)();
|
|
9743
|
-
(0,
|
|
10296
|
+
(0, import_react30.useEffect)(() => {
|
|
9744
10297
|
setTasks(initialTasks);
|
|
9745
10298
|
}, [initialTasks]);
|
|
9746
|
-
(0,
|
|
10299
|
+
(0, import_react30.useEffect)(() => {
|
|
9747
10300
|
setSprints(initialSprints);
|
|
9748
10301
|
}, [initialSprints]);
|
|
9749
|
-
(0,
|
|
10302
|
+
(0, import_react30.useEffect)(() => {
|
|
9750
10303
|
setEpics(initialEpics);
|
|
9751
10304
|
}, [initialEpics]);
|
|
9752
|
-
(0,
|
|
10305
|
+
(0, import_react30.useEffect)(() => {
|
|
9753
10306
|
setProjects(initialProjects);
|
|
9754
10307
|
}, [initialProjects]);
|
|
9755
|
-
(0,
|
|
10308
|
+
(0, import_react30.useEffect)(() => {
|
|
9756
10309
|
setFiles(initialFiles);
|
|
9757
10310
|
}, [initialFiles]);
|
|
9758
|
-
(0,
|
|
10311
|
+
(0, import_react30.useEffect)(() => {
|
|
9759
10312
|
setUsers(initialUsers);
|
|
9760
10313
|
}, [initialUsers]);
|
|
9761
|
-
(0,
|
|
10314
|
+
(0, import_react30.useEffect)(() => {
|
|
9762
10315
|
setColleagues(initialColleagues);
|
|
9763
10316
|
}, [initialColleagues]);
|
|
9764
|
-
(0,
|
|
10317
|
+
(0, import_react30.useEffect)(() => {
|
|
9765
10318
|
setReminders(initialReminders);
|
|
9766
10319
|
}, [initialReminders]);
|
|
9767
|
-
(0,
|
|
10320
|
+
(0, import_react30.useEffect)(() => {
|
|
9768
10321
|
setCurrentView(initialView);
|
|
9769
10322
|
}, [initialView]);
|
|
9770
10323
|
const filteredTasks = tasks.filter((task) => {
|
|
@@ -9970,6 +10523,8 @@ function ProjectView({
|
|
|
9970
10523
|
return "Documentation";
|
|
9971
10524
|
case "epics":
|
|
9972
10525
|
return "Epic Planning";
|
|
10526
|
+
case "gantt":
|
|
10527
|
+
return "Gantt Chart";
|
|
9973
10528
|
default:
|
|
9974
10529
|
return "Project Board";
|
|
9975
10530
|
}
|
|
@@ -9985,8 +10540,8 @@ function ProjectView({
|
|
|
9985
10540
|
const recentTeams = mockTeams.sort((a, b) => b.lastUsed.getTime() - a.lastUsed.getTime()).slice(0, 3);
|
|
9986
10541
|
const hasMoreTeams = mockTeams.length > 3;
|
|
9987
10542
|
const additionalTeams = mockTeams.slice(3);
|
|
9988
|
-
return /* @__PURE__ */ (0,
|
|
9989
|
-
currentView === "kanban" && /* @__PURE__ */ (0,
|
|
10543
|
+
return /* @__PURE__ */ (0, import_jsx_runtime52.jsxs)(ManagementSidebar, { currentView, onViewChange: handleViewChange, children: [
|
|
10544
|
+
currentView === "kanban" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "h-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
9990
10545
|
KanbanBoardView,
|
|
9991
10546
|
{
|
|
9992
10547
|
initialProjects: projects,
|
|
@@ -10003,7 +10558,7 @@ function ProjectView({
|
|
|
10003
10558
|
onAddComment: handleAddComment
|
|
10004
10559
|
}
|
|
10005
10560
|
) }),
|
|
10006
|
-
currentView === "planning" && /* @__PURE__ */ (0,
|
|
10561
|
+
currentView === "planning" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10007
10562
|
PlanningView,
|
|
10008
10563
|
{
|
|
10009
10564
|
tasks,
|
|
@@ -10016,7 +10571,7 @@ function ProjectView({
|
|
|
10016
10571
|
onDeleteSprint: handleDeleteSprint
|
|
10017
10572
|
}
|
|
10018
10573
|
) }),
|
|
10019
|
-
currentView === "tasks" && /* @__PURE__ */ (0,
|
|
10574
|
+
currentView === "tasks" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10020
10575
|
TasksView,
|
|
10021
10576
|
{
|
|
10022
10577
|
initialReminders: reminders,
|
|
@@ -10026,7 +10581,7 @@ function ProjectView({
|
|
|
10026
10581
|
onDeleteReminder: handleDeleteReminder
|
|
10027
10582
|
}
|
|
10028
10583
|
) }),
|
|
10029
|
-
currentView === "files" && /* @__PURE__ */ (0,
|
|
10584
|
+
currentView === "files" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10030
10585
|
FileView,
|
|
10031
10586
|
{
|
|
10032
10587
|
initialFiles: files,
|
|
@@ -10037,7 +10592,7 @@ function ProjectView({
|
|
|
10037
10592
|
compactView: false
|
|
10038
10593
|
}
|
|
10039
10594
|
) }),
|
|
10040
|
-
currentView === "epics" && /* @__PURE__ */ (0,
|
|
10595
|
+
currentView === "epics" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10041
10596
|
EpicsView,
|
|
10042
10597
|
{
|
|
10043
10598
|
tasks,
|
|
@@ -10051,7 +10606,17 @@ function ProjectView({
|
|
|
10051
10606
|
onDeleteEpic: handleDeleteEpic
|
|
10052
10607
|
}
|
|
10053
10608
|
) }),
|
|
10054
|
-
/* @__PURE__ */ (0,
|
|
10609
|
+
currentView === "gantt" && /* @__PURE__ */ (0, import_jsx_runtime52.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10610
|
+
GanttView,
|
|
10611
|
+
{
|
|
10612
|
+
tasks,
|
|
10613
|
+
epics,
|
|
10614
|
+
sprints,
|
|
10615
|
+
onUpdateEpic: handleUpdateEpic,
|
|
10616
|
+
onTaskClick: handleTaskClick
|
|
10617
|
+
}
|
|
10618
|
+
) }),
|
|
10619
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10055
10620
|
AddTaskModal,
|
|
10056
10621
|
{
|
|
10057
10622
|
isOpen: isAddTaskModalOpen,
|
|
@@ -10063,7 +10628,7 @@ function ProjectView({
|
|
|
10063
10628
|
defaultEpicId: selectedEpicForTask || void 0
|
|
10064
10629
|
}
|
|
10065
10630
|
),
|
|
10066
|
-
/* @__PURE__ */ (0,
|
|
10631
|
+
/* @__PURE__ */ (0, import_jsx_runtime52.jsx)(
|
|
10067
10632
|
AddEpicModal,
|
|
10068
10633
|
{
|
|
10069
10634
|
isOpen: isAddEpicModalOpen,
|