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,10 +38,10 @@ __export(ProjectPage_exports, {
|
|
|
38
38
|
default: () => ProjectPage
|
|
39
39
|
});
|
|
40
40
|
module.exports = __toCommonJS(ProjectPage_exports);
|
|
41
|
-
var
|
|
42
|
-
var
|
|
41
|
+
var import_react35 = require("react");
|
|
42
|
+
var import_react36 = require("motion/react");
|
|
43
43
|
|
|
44
|
-
// src/components/
|
|
44
|
+
// src/components/Foundry/foundary-layout.tsx
|
|
45
45
|
var import_react6 = require("react");
|
|
46
46
|
|
|
47
47
|
// src/utils/cn.ts
|
|
@@ -2724,15 +2724,9 @@ var Checkbox = React5.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
2724
2724
|
));
|
|
2725
2725
|
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
|
2726
2726
|
|
|
2727
|
-
// src/components/
|
|
2727
|
+
// src/components/Foundry/test-data.tsx
|
|
2728
2728
|
var import_lucide_react3 = require("lucide-react");
|
|
2729
2729
|
var import_jsx_runtime7 = require("react/jsx-runtime");
|
|
2730
|
-
var createKnowledgeDocument = (title) => ({
|
|
2731
|
-
id: Math.random().toString(36).substr(2, 9),
|
|
2732
|
-
title,
|
|
2733
|
-
format: "markdown",
|
|
2734
|
-
createdAt: /* @__PURE__ */ new Date()
|
|
2735
|
-
});
|
|
2736
2730
|
var mockSidebarItems = [
|
|
2737
2731
|
{
|
|
2738
2732
|
id: "home",
|
|
@@ -2987,289 +2981,392 @@ var businessUnits = [
|
|
|
2987
2981
|
];
|
|
2988
2982
|
var mockProjects = [
|
|
2989
2983
|
{
|
|
2990
|
-
id:
|
|
2984
|
+
id: 1,
|
|
2991
2985
|
name: "E-commerce Platform",
|
|
2992
2986
|
description: "Main customer-facing e-commerce application",
|
|
2993
|
-
|
|
2987
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
2988
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
2989
|
+
team: 1
|
|
2990
|
+
// isSelected: true,
|
|
2994
2991
|
},
|
|
2995
2992
|
{
|
|
2996
|
-
id:
|
|
2993
|
+
id: 2,
|
|
2997
2994
|
name: "Admin Dashboard",
|
|
2998
2995
|
description: "Internal administration and analytics dashboard",
|
|
2999
|
-
|
|
2996
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
2997
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
2998
|
+
team: 1
|
|
2999
|
+
// isSelected: false,
|
|
3000
3000
|
},
|
|
3001
3001
|
{
|
|
3002
|
-
id:
|
|
3002
|
+
id: 3,
|
|
3003
3003
|
name: "Mobile App",
|
|
3004
3004
|
description: "Native mobile application for iOS and Android",
|
|
3005
|
-
|
|
3005
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3006
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3007
|
+
team: 1
|
|
3008
|
+
// isSelected: false,
|
|
3006
3009
|
}
|
|
3007
3010
|
];
|
|
3008
3011
|
var mockEpics = [
|
|
3009
3012
|
{
|
|
3010
|
-
id:
|
|
3013
|
+
id: 1,
|
|
3011
3014
|
name: "User Authentication",
|
|
3012
3015
|
color: "bg-blue-500",
|
|
3013
3016
|
description: "Implement secure user authentication system",
|
|
3014
3017
|
confidence: "high",
|
|
3015
3018
|
phase: 2,
|
|
3016
3019
|
// development
|
|
3017
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3018
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3019
|
-
|
|
3020
|
-
|
|
3020
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3021
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3022
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3023
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3024
|
+
// progress: 75,
|
|
3025
|
+
// isSelected: true,
|
|
3021
3026
|
},
|
|
3022
3027
|
{
|
|
3023
|
-
id:
|
|
3028
|
+
id: 2,
|
|
3024
3029
|
name: "Dashboard Features",
|
|
3025
3030
|
color: "bg-green-500",
|
|
3026
3031
|
description: "Build comprehensive dashboard functionality",
|
|
3027
3032
|
confidence: "medium",
|
|
3028
3033
|
phase: 1,
|
|
3029
3034
|
// planning
|
|
3030
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3031
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3032
|
-
|
|
3033
|
-
|
|
3035
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3036
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3037
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3038
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3039
|
+
// progress: 30,
|
|
3040
|
+
// isSelected: true,
|
|
3034
3041
|
},
|
|
3035
3042
|
{
|
|
3036
|
-
id:
|
|
3043
|
+
id: 3,
|
|
3037
3044
|
name: "Mobile Optimization",
|
|
3038
3045
|
color: "bg-purple-500",
|
|
3039
3046
|
description: "Optimize application for mobile devices",
|
|
3040
3047
|
confidence: "low",
|
|
3041
3048
|
phase: 1,
|
|
3042
3049
|
// planning
|
|
3043
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3044
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3045
|
-
|
|
3046
|
-
|
|
3050
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3051
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3052
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3053
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3054
|
+
// progress: 10,
|
|
3055
|
+
// isSelected: true,
|
|
3047
3056
|
},
|
|
3048
3057
|
{
|
|
3049
|
-
id:
|
|
3058
|
+
id: 4,
|
|
3050
3059
|
name: "Performance Improvements",
|
|
3051
3060
|
color: "bg-orange-500",
|
|
3052
3061
|
description: "Enhance application performance and speed",
|
|
3053
3062
|
confidence: "high",
|
|
3054
3063
|
phase: 3,
|
|
3055
3064
|
// testing
|
|
3056
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3057
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3058
|
-
|
|
3059
|
-
|
|
3065
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3066
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3067
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3068
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3069
|
+
// progress: 90,
|
|
3070
|
+
// isSelected: true,
|
|
3060
3071
|
}
|
|
3061
3072
|
];
|
|
3062
3073
|
var mockSprints = [
|
|
3063
3074
|
{
|
|
3064
|
-
id:
|
|
3075
|
+
id: 1,
|
|
3065
3076
|
name: "Backlog",
|
|
3066
3077
|
description: "Tasks not yet assigned to a sprint",
|
|
3067
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3068
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3069
|
-
|
|
3070
|
-
|
|
3078
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3079
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3080
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3081
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3082
|
+
// isActive: false,
|
|
3083
|
+
// isSelected: false,
|
|
3071
3084
|
},
|
|
3072
3085
|
{
|
|
3073
|
-
id:
|
|
3086
|
+
id: 2,
|
|
3074
3087
|
name: "All Tasks",
|
|
3075
3088
|
description: "View all tasks across all sprints",
|
|
3076
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3077
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3078
|
-
|
|
3079
|
-
|
|
3089
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3090
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3091
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3092
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3093
|
+
// isActive: false,
|
|
3094
|
+
// isSelected: true,
|
|
3080
3095
|
},
|
|
3081
3096
|
{
|
|
3082
|
-
id:
|
|
3097
|
+
id: 3,
|
|
3083
3098
|
name: "Sprint 1",
|
|
3084
3099
|
description: "Initial development phase",
|
|
3085
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3086
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3087
|
-
|
|
3088
|
-
|
|
3100
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3101
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3102
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3103
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3104
|
+
// isActive: false,
|
|
3105
|
+
// isSelected: false,
|
|
3089
3106
|
},
|
|
3090
3107
|
{
|
|
3091
|
-
id:
|
|
3108
|
+
id: 4,
|
|
3092
3109
|
name: "Sprint 2",
|
|
3093
3110
|
description: "Feature development",
|
|
3094
|
-
startDate: /* @__PURE__ */ new Date(
|
|
3095
|
-
endDate: /* @__PURE__ */ new Date(
|
|
3096
|
-
|
|
3097
|
-
|
|
3111
|
+
startDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3112
|
+
endDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3113
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3114
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3115
|
+
// isActive: true,
|
|
3116
|
+
// isSelected: false,
|
|
3098
3117
|
}
|
|
3099
3118
|
];
|
|
3100
3119
|
var mockTasks = [
|
|
3101
3120
|
{
|
|
3102
|
-
id:
|
|
3121
|
+
id: 1,
|
|
3103
3122
|
name: "Design login page",
|
|
3104
3123
|
description: "Create wireframes and mockups for the login interface",
|
|
3105
3124
|
status: "todo",
|
|
3106
3125
|
priority: "high",
|
|
3107
3126
|
type: "story",
|
|
3108
|
-
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3127
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3128
|
+
index: 1,
|
|
3129
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3130
|
+
// points: 5,
|
|
3131
|
+
// epicId: '1',
|
|
3132
|
+
// sprintId: '2',
|
|
3133
|
+
assignee: {
|
|
3134
|
+
relationTo: "users",
|
|
3135
|
+
value: "John Doe"
|
|
3136
|
+
},
|
|
3137
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3113
3138
|
},
|
|
3114
3139
|
{
|
|
3115
|
-
id:
|
|
3140
|
+
id: 2,
|
|
3116
3141
|
name: "Implement OAuth integration",
|
|
3117
3142
|
description: "Add Google and GitHub OAuth authentication",
|
|
3118
3143
|
status: "review",
|
|
3119
3144
|
priority: "high",
|
|
3120
3145
|
type: "task",
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3146
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3147
|
+
index: 2,
|
|
3148
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3149
|
+
// points: 8,
|
|
3150
|
+
// epicId: '1',
|
|
3151
|
+
// sprintId: '2',
|
|
3152
|
+
assignee: {
|
|
3153
|
+
relationTo: "users",
|
|
3154
|
+
value: "Jane Smith"
|
|
3155
|
+
},
|
|
3156
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3126
3157
|
},
|
|
3127
3158
|
{
|
|
3128
|
-
id:
|
|
3159
|
+
id: 3,
|
|
3129
3160
|
name: "Create dashboard widgets",
|
|
3130
3161
|
description: "Build analytics and metrics widgets for the main dashboard",
|
|
3131
3162
|
status: "todo",
|
|
3132
3163
|
priority: "medium",
|
|
3133
3164
|
type: "story",
|
|
3134
|
-
|
|
3135
|
-
|
|
3136
|
-
|
|
3137
|
-
|
|
3138
|
-
|
|
3165
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3166
|
+
index: 3,
|
|
3167
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3168
|
+
// points: 13,
|
|
3169
|
+
// epicId: '2',
|
|
3170
|
+
// sprintId: '2',
|
|
3171
|
+
assignee: {
|
|
3172
|
+
relationTo: "users",
|
|
3173
|
+
value: "Mike Johnson"
|
|
3174
|
+
},
|
|
3175
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3139
3176
|
},
|
|
3140
3177
|
{
|
|
3141
|
-
id:
|
|
3178
|
+
id: 4,
|
|
3142
3179
|
name: "Fix login redirect bug",
|
|
3143
3180
|
description: "Resolve issue where users are not redirected after login",
|
|
3144
3181
|
status: "done",
|
|
3145
3182
|
priority: "high",
|
|
3146
3183
|
type: "bug",
|
|
3147
|
-
|
|
3148
|
-
|
|
3149
|
-
|
|
3150
|
-
|
|
3151
|
-
|
|
3184
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3185
|
+
index: 4,
|
|
3186
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3187
|
+
// points: 3,
|
|
3188
|
+
// epicId: '1',
|
|
3189
|
+
// sprintId: '1',
|
|
3190
|
+
assignee: {
|
|
3191
|
+
relationTo: "users",
|
|
3192
|
+
value: "Sarah Wilson"
|
|
3193
|
+
},
|
|
3194
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3152
3195
|
},
|
|
3153
3196
|
{
|
|
3154
|
-
id:
|
|
3197
|
+
id: 5,
|
|
3155
3198
|
name: "Research mobile frameworks",
|
|
3156
3199
|
description: "Investigate best practices for mobile responsive design",
|
|
3157
3200
|
status: "in-progress",
|
|
3158
3201
|
priority: "medium",
|
|
3159
3202
|
type: "spike",
|
|
3160
|
-
|
|
3161
|
-
|
|
3162
|
-
|
|
3163
|
-
|
|
3203
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3204
|
+
index: 5,
|
|
3205
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3206
|
+
// points: 5,
|
|
3207
|
+
// epicId: '3',
|
|
3208
|
+
assignee: {
|
|
3209
|
+
relationTo: "users",
|
|
3210
|
+
value: "Alex Brown"
|
|
3211
|
+
},
|
|
3212
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3164
3213
|
},
|
|
3165
3214
|
{
|
|
3166
|
-
id:
|
|
3215
|
+
id: 6,
|
|
3167
3216
|
name: "Update user profile page",
|
|
3168
3217
|
description: "Enhance user profile with new settings and preferences",
|
|
3169
3218
|
status: "review",
|
|
3170
3219
|
priority: "medium",
|
|
3171
3220
|
type: "story",
|
|
3172
|
-
|
|
3173
|
-
|
|
3174
|
-
|
|
3175
|
-
|
|
3176
|
-
|
|
3221
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3222
|
+
index: 6,
|
|
3223
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3224
|
+
// points: 8,
|
|
3225
|
+
// epicId: '2',
|
|
3226
|
+
// sprintId: '2',
|
|
3227
|
+
assignee: {
|
|
3228
|
+
relationTo: "users",
|
|
3229
|
+
value: "Emma Davis"
|
|
3230
|
+
},
|
|
3231
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3177
3232
|
},
|
|
3178
3233
|
{
|
|
3179
|
-
id:
|
|
3234
|
+
id: 7,
|
|
3180
3235
|
name: "Performance optimization",
|
|
3181
3236
|
description: "Optimize database queries and improve page load times",
|
|
3182
3237
|
status: "done",
|
|
3183
3238
|
priority: "high",
|
|
3184
3239
|
type: "task",
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3240
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3241
|
+
index: 7,
|
|
3242
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3243
|
+
// points: 13,
|
|
3244
|
+
// epicId: '4',
|
|
3245
|
+
// sprintId: '1',
|
|
3246
|
+
assignee: {
|
|
3247
|
+
relationTo: "users",
|
|
3248
|
+
value: "Tom Wilson"
|
|
3249
|
+
},
|
|
3250
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3190
3251
|
}
|
|
3191
3252
|
];
|
|
3192
3253
|
var highDensityTasks = [
|
|
3193
3254
|
...mockTasks,
|
|
3194
3255
|
{
|
|
3195
|
-
id:
|
|
3256
|
+
id: 8,
|
|
3196
3257
|
name: "Add search functionality",
|
|
3197
3258
|
description: "Implement search across all dashboard widgets",
|
|
3198
3259
|
status: "todo",
|
|
3199
3260
|
priority: "medium",
|
|
3200
3261
|
type: "story",
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3262
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3263
|
+
index: 8,
|
|
3264
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3265
|
+
// points: 8,
|
|
3266
|
+
// epicId: '2',
|
|
3267
|
+
// sprintId: '2',
|
|
3268
|
+
assignee: {
|
|
3269
|
+
relationTo: "users",
|
|
3270
|
+
value: "1"
|
|
3271
|
+
},
|
|
3272
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3206
3273
|
},
|
|
3207
3274
|
{
|
|
3208
|
-
id:
|
|
3275
|
+
id: 9,
|
|
3209
3276
|
name: "Fix mobile responsive issues",
|
|
3210
3277
|
description: "Resolve layout problems on mobile devices",
|
|
3211
3278
|
status: "in-progress",
|
|
3212
3279
|
priority: "high",
|
|
3213
3280
|
type: "bug",
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3281
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3282
|
+
index: 9,
|
|
3283
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3284
|
+
// points: 5,
|
|
3285
|
+
// epicId: '3',
|
|
3286
|
+
// sprintId: '2',
|
|
3287
|
+
assignee: {
|
|
3288
|
+
relationTo: "users",
|
|
3289
|
+
value: "Taylor Swift"
|
|
3290
|
+
},
|
|
3291
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3219
3292
|
},
|
|
3220
3293
|
{
|
|
3221
|
-
id:
|
|
3294
|
+
id: 10,
|
|
3222
3295
|
name: "Implement dark mode",
|
|
3223
3296
|
description: "Add dark theme support across the application",
|
|
3224
3297
|
status: "review",
|
|
3225
3298
|
priority: "low",
|
|
3226
3299
|
type: "story",
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
|
|
3300
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3301
|
+
index: 10,
|
|
3302
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3303
|
+
// points: 13,
|
|
3304
|
+
// epicId: '2',
|
|
3305
|
+
// sprintId: '2',
|
|
3306
|
+
assignee: {
|
|
3307
|
+
relationTo: "users",
|
|
3308
|
+
value: "Jordan Smith"
|
|
3309
|
+
},
|
|
3310
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3232
3311
|
},
|
|
3233
3312
|
{
|
|
3234
|
-
id:
|
|
3313
|
+
id: 11,
|
|
3235
3314
|
name: "API rate limiting",
|
|
3236
3315
|
description: "Implement rate limiting for API endpoints",
|
|
3237
3316
|
status: "done",
|
|
3238
3317
|
priority: "high",
|
|
3239
3318
|
type: "task",
|
|
3240
|
-
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3319
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3320
|
+
index: 11,
|
|
3321
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3322
|
+
// points: 8,
|
|
3323
|
+
// epicId: '4',
|
|
3324
|
+
// sprintId: '1',
|
|
3325
|
+
assignee: {
|
|
3326
|
+
relationTo: "users",
|
|
3327
|
+
value: "Morgan Davis"
|
|
3328
|
+
},
|
|
3329
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3245
3330
|
},
|
|
3246
3331
|
{
|
|
3247
|
-
id:
|
|
3332
|
+
id: 12,
|
|
3248
3333
|
name: "User onboarding flow",
|
|
3249
3334
|
description: "Create guided tour for new users",
|
|
3250
3335
|
status: "todo",
|
|
3251
3336
|
priority: "medium",
|
|
3252
3337
|
type: "story",
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3338
|
+
dateLogged: (/* @__PURE__ */ new Date()).toString(),
|
|
3339
|
+
index: 12,
|
|
3340
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3341
|
+
// points: 21,
|
|
3342
|
+
// epicId: '1',
|
|
3343
|
+
// sprintId: '2',
|
|
3344
|
+
assignee: {
|
|
3345
|
+
relationTo: "users",
|
|
3346
|
+
value: "Casey Johnson"
|
|
3347
|
+
},
|
|
3348
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3258
3349
|
}
|
|
3259
3350
|
];
|
|
3260
3351
|
var extendedProjects = [
|
|
3261
|
-
...mockProjects,
|
|
3352
|
+
// ...mockProjects,
|
|
3262
3353
|
{
|
|
3263
|
-
id:
|
|
3354
|
+
id: 4,
|
|
3264
3355
|
name: "Analytics Platform",
|
|
3265
3356
|
description: "Business intelligence and reporting system",
|
|
3266
|
-
|
|
3357
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3358
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3359
|
+
team: 1
|
|
3360
|
+
// isSelected: false,
|
|
3267
3361
|
},
|
|
3268
3362
|
{
|
|
3269
|
-
id:
|
|
3363
|
+
id: 5,
|
|
3270
3364
|
name: "API Gateway",
|
|
3271
3365
|
description: "Microservices API management layer",
|
|
3272
|
-
|
|
3366
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3367
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3368
|
+
// isSelected: false,
|
|
3369
|
+
team: 1
|
|
3273
3370
|
}
|
|
3274
3371
|
];
|
|
3275
3372
|
var emptyStateData = {
|
|
@@ -3310,7 +3407,9 @@ var singleEpicData = {
|
|
|
3310
3407
|
isSelected: true
|
|
3311
3408
|
}
|
|
3312
3409
|
],
|
|
3313
|
-
tasks: mockTasks.filter(
|
|
3410
|
+
tasks: mockTasks.filter(
|
|
3411
|
+
(task) => typeof task.epic === "object" ? task.epic?.id === 1 : task.epic === 1
|
|
3412
|
+
)
|
|
3314
3413
|
};
|
|
3315
3414
|
var testScenarios = {
|
|
3316
3415
|
empty: {
|
|
@@ -3350,243 +3449,322 @@ var mockColleagues = [
|
|
|
3350
3449
|
type: "human",
|
|
3351
3450
|
name: "Sarah Johnson",
|
|
3352
3451
|
email: "sarah.johnson@company.com",
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
|
|
3356
|
-
|
|
3357
|
-
|
|
3358
|
-
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3452
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3453
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3454
|
+
// role: 'Senior Designer',
|
|
3455
|
+
// department: 'Design',
|
|
3456
|
+
// status: 'active',
|
|
3457
|
+
// joinedDate: new Date('2023-01-15'),
|
|
3458
|
+
// lastActive: new Date(),
|
|
3459
|
+
// phone: '+1 (555) 123-4567',
|
|
3460
|
+
// location: 'San Francisco, CA',
|
|
3461
|
+
// timezone: 'PST',
|
|
3462
|
+
// skills: ['UI/UX Design', 'Figma', 'Adobe Creative Suite', 'Prototyping', 'User Research'],
|
|
3463
|
+
// bio: 'Passionate designer with 8+ years of experience creating user-centered digital experiences.',
|
|
3363
3464
|
},
|
|
3364
3465
|
{
|
|
3365
|
-
id:
|
|
3466
|
+
id: 2,
|
|
3366
3467
|
type: "digital",
|
|
3367
3468
|
name: "CodeAssist Pro",
|
|
3368
|
-
|
|
3369
|
-
|
|
3370
|
-
lastActive: /* @__PURE__ */ new Date(),
|
|
3469
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3470
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3371
3471
|
jobDescription: "AI-powered coding assistant that helps with code review, debugging, and documentation generation.",
|
|
3372
3472
|
workInstructions: "Review pull requests for code quality and best practices. Generate comprehensive documentation for new features. Assist with debugging complex issues. Provide code suggestions and optimizations.",
|
|
3373
3473
|
capabilities: [
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3474
|
+
{
|
|
3475
|
+
relationTo: "mcpTools",
|
|
3476
|
+
value: 1
|
|
3477
|
+
},
|
|
3478
|
+
{
|
|
3479
|
+
relationTo: "mcpTools",
|
|
3480
|
+
value: 2
|
|
3481
|
+
}
|
|
3379
3482
|
],
|
|
3380
|
-
knowledge:
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
|
|
3384
|
-
|
|
3385
|
-
|
|
3386
|
-
|
|
3387
|
-
|
|
3388
|
-
|
|
3483
|
+
knowledge: 1,
|
|
3484
|
+
coreKnowledge: 1,
|
|
3485
|
+
capabilityLevel: 1,
|
|
3486
|
+
// version: '2',
|
|
3487
|
+
// lastUpdated: new Date('2024-01-15').toString(),
|
|
3488
|
+
// isActive: true,
|
|
3489
|
+
identity: {
|
|
3490
|
+
id: 1,
|
|
3491
|
+
keycloakClientId: "123",
|
|
3492
|
+
keycloakUserId: "456",
|
|
3493
|
+
secretManagementMode: "manual",
|
|
3494
|
+
keycloakClientSecret: "new-secret",
|
|
3495
|
+
keycloakSecretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret",
|
|
3496
|
+
keycloakSecretLocation: "us-east-1",
|
|
3497
|
+
keycloakSecretLastUpdated: (/* @__PURE__ */ new Date()).toString(),
|
|
3498
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3499
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3500
|
+
}
|
|
3389
3501
|
},
|
|
3390
3502
|
{
|
|
3391
3503
|
id: "3",
|
|
3392
3504
|
type: "human",
|
|
3393
3505
|
name: "Michael Chen",
|
|
3394
3506
|
email: "michael.chen@company.com",
|
|
3395
|
-
|
|
3396
|
-
|
|
3397
|
-
|
|
3398
|
-
|
|
3399
|
-
|
|
3400
|
-
//
|
|
3401
|
-
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
|
|
3507
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3508
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3509
|
+
// role: 'Product Manager',
|
|
3510
|
+
// department: 'Product',
|
|
3511
|
+
// status: 'inactive',
|
|
3512
|
+
// joinedDate: new Date('2022-08-20'),
|
|
3513
|
+
// lastActive: new Date(Date.now() - 2 * 60 * 60 * 1000), // 2 hours ago
|
|
3514
|
+
// phone: '+1 (555) 987-6543',
|
|
3515
|
+
// location: 'New York, NY',
|
|
3516
|
+
// timezone: 'EST',
|
|
3517
|
+
// skills: ['Product Strategy', 'Agile', 'Data Analysis', 'User Stories', 'Roadmapping'],
|
|
3518
|
+
// bio: 'Strategic product manager focused on driving user engagement and business growth.',
|
|
3406
3519
|
},
|
|
3407
3520
|
{
|
|
3408
|
-
id:
|
|
3521
|
+
id: 4,
|
|
3409
3522
|
type: "digital",
|
|
3410
3523
|
name: "MarketingBot",
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
lastActive: /* @__PURE__ */ new Date(),
|
|
3524
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3525
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3414
3526
|
jobDescription: "Specialized AI assistant for marketing campaigns, content creation, and social media management.",
|
|
3415
3527
|
workInstructions: "Create engaging social media content. Analyze campaign performance metrics. Generate marketing copy and headlines. Schedule and manage social media posts.",
|
|
3416
3528
|
capabilities: [
|
|
3417
|
-
|
|
3418
|
-
|
|
3419
|
-
|
|
3420
|
-
|
|
3421
|
-
|
|
3529
|
+
{
|
|
3530
|
+
relationTo: "mcpTools",
|
|
3531
|
+
value: 1
|
|
3532
|
+
},
|
|
3533
|
+
{
|
|
3534
|
+
relationTo: "mcpTools",
|
|
3535
|
+
value: 2
|
|
3536
|
+
}
|
|
3422
3537
|
],
|
|
3423
|
-
knowledge:
|
|
3424
|
-
|
|
3425
|
-
|
|
3426
|
-
|
|
3427
|
-
|
|
3428
|
-
|
|
3429
|
-
|
|
3430
|
-
|
|
3431
|
-
|
|
3432
|
-
|
|
3433
|
-
|
|
3434
|
-
|
|
3538
|
+
knowledge: 1,
|
|
3539
|
+
coreKnowledge: 1,
|
|
3540
|
+
capabilityLevel: 1,
|
|
3541
|
+
// version: '52',
|
|
3542
|
+
// lastUpdated: new Date('2024-02-10'),
|
|
3543
|
+
// isActive: true,
|
|
3544
|
+
identity: {
|
|
3545
|
+
id: 1,
|
|
3546
|
+
keycloakClientId: "123",
|
|
3547
|
+
keycloakUserId: "456",
|
|
3548
|
+
secretManagementMode: "manual",
|
|
3549
|
+
keycloakClientSecret: "new-secret",
|
|
3550
|
+
keycloakSecretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret",
|
|
3551
|
+
keycloakSecretLocation: "us-east-1",
|
|
3552
|
+
keycloakSecretLastUpdated: (/* @__PURE__ */ new Date()).toString(),
|
|
3553
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3554
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3555
|
+
}
|
|
3435
3556
|
},
|
|
3436
3557
|
{
|
|
3437
3558
|
id: "5",
|
|
3438
3559
|
type: "human",
|
|
3439
3560
|
name: "Emily Rodriguez",
|
|
3440
3561
|
email: "emily.rodriguez@company.com",
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
-
|
|
3446
|
-
//
|
|
3447
|
-
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
|
|
3453
|
-
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3562
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3563
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString()
|
|
3564
|
+
// role: 'UX Researcher',
|
|
3565
|
+
// department: 'Design',
|
|
3566
|
+
// status: 'inactive',
|
|
3567
|
+
// joinedDate: new Date('2023-06-10'),
|
|
3568
|
+
// lastActive: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000), // 7 days ago
|
|
3569
|
+
// phone: '+1 (555) 456-7890',
|
|
3570
|
+
// location: 'Austin, TX',
|
|
3571
|
+
// timezone: 'CST',
|
|
3572
|
+
// skills: [
|
|
3573
|
+
// 'User Research',
|
|
3574
|
+
// 'Usability Testing',
|
|
3575
|
+
// 'Data Analysis',
|
|
3576
|
+
// 'Survey Design',
|
|
3577
|
+
// 'Interview Techniques',
|
|
3578
|
+
// ],
|
|
3579
|
+
// bio: 'User researcher dedicated to understanding user needs and improving product experiences.',
|
|
3458
3580
|
},
|
|
3459
3581
|
{
|
|
3460
|
-
id:
|
|
3582
|
+
id: 6,
|
|
3461
3583
|
type: "digital",
|
|
3462
3584
|
name: "DataAnalyzer Pro",
|
|
3463
|
-
|
|
3464
|
-
|
|
3465
|
-
lastActive: /* @__PURE__ */ new Date(),
|
|
3585
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3586
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3466
3587
|
jobDescription: "Advanced AI assistant specializing in data analysis, reporting, and business intelligence.",
|
|
3467
3588
|
workInstructions: "Analyze complex datasets, generate insightful reports, create data visualizations, and provide actionable business recommendations.",
|
|
3468
3589
|
capabilities: [
|
|
3469
|
-
|
|
3470
|
-
|
|
3471
|
-
|
|
3472
|
-
|
|
3473
|
-
|
|
3590
|
+
{
|
|
3591
|
+
relationTo: "mcpTools",
|
|
3592
|
+
value: 1
|
|
3593
|
+
},
|
|
3594
|
+
{
|
|
3595
|
+
relationTo: "mcpTools",
|
|
3596
|
+
value: 2
|
|
3597
|
+
},
|
|
3598
|
+
{
|
|
3599
|
+
relationTo: "mcpTools",
|
|
3600
|
+
value: 3
|
|
3601
|
+
}
|
|
3474
3602
|
],
|
|
3475
|
-
knowledge:
|
|
3476
|
-
|
|
3477
|
-
|
|
3478
|
-
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3603
|
+
knowledge: 1,
|
|
3604
|
+
coreKnowledge: 1,
|
|
3605
|
+
capabilityLevel: 1,
|
|
3606
|
+
// version: '3.1',
|
|
3607
|
+
// lastUpdated: new Date('2024-02-20'),
|
|
3608
|
+
// isActive: true,
|
|
3609
|
+
identity: {
|
|
3610
|
+
id: 1,
|
|
3611
|
+
keycloakClientId: "123",
|
|
3612
|
+
keycloakUserId: "456",
|
|
3613
|
+
secretManagementMode: "manual",
|
|
3614
|
+
keycloakClientSecret: "new-secret",
|
|
3615
|
+
keycloakSecretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret",
|
|
3616
|
+
keycloakSecretLocation: "us-east-1",
|
|
3617
|
+
keycloakSecretLastUpdated: (/* @__PURE__ */ new Date()).toString(),
|
|
3618
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3619
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3620
|
+
}
|
|
3484
3621
|
},
|
|
3485
3622
|
{
|
|
3486
|
-
id:
|
|
3623
|
+
id: 7,
|
|
3487
3624
|
type: "digital",
|
|
3488
3625
|
name: "ProjectManager AI",
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
lastActive: /* @__PURE__ */ new Date(),
|
|
3626
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3627
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3492
3628
|
jobDescription: "Intelligent project management assistant that helps coordinate tasks, track progress, and manage timelines.",
|
|
3493
3629
|
workInstructions: "Coordinate project activities, track milestones, manage resource allocation, and provide project status updates.",
|
|
3494
3630
|
capabilities: [
|
|
3495
|
-
|
|
3496
|
-
|
|
3497
|
-
|
|
3498
|
-
|
|
3499
|
-
|
|
3631
|
+
{
|
|
3632
|
+
relationTo: "mcpTools",
|
|
3633
|
+
value: 1
|
|
3634
|
+
},
|
|
3635
|
+
{
|
|
3636
|
+
relationTo: "mcpTools",
|
|
3637
|
+
value: 2
|
|
3638
|
+
},
|
|
3639
|
+
{
|
|
3640
|
+
relationTo: "mcpTools",
|
|
3641
|
+
value: 4
|
|
3642
|
+
},
|
|
3643
|
+
{
|
|
3644
|
+
relationTo: "mcpTools",
|
|
3645
|
+
value: 5
|
|
3646
|
+
}
|
|
3500
3647
|
],
|
|
3501
|
-
knowledge:
|
|
3502
|
-
|
|
3503
|
-
|
|
3504
|
-
|
|
3505
|
-
|
|
3506
|
-
|
|
3507
|
-
|
|
3508
|
-
|
|
3509
|
-
|
|
3510
|
-
|
|
3511
|
-
|
|
3648
|
+
knowledge: 1,
|
|
3649
|
+
coreKnowledge: 1,
|
|
3650
|
+
capabilityLevel: 1,
|
|
3651
|
+
// version: '2.5',
|
|
3652
|
+
// lastUpdated: new Date('2024-02-15'),
|
|
3653
|
+
// isActive: true,
|
|
3654
|
+
identity: {
|
|
3655
|
+
id: 1,
|
|
3656
|
+
keycloakClientId: "123",
|
|
3657
|
+
keycloakUserId: "456",
|
|
3658
|
+
secretManagementMode: "manual",
|
|
3659
|
+
keycloakClientSecret: "new-secret",
|
|
3660
|
+
keycloakSecretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret",
|
|
3661
|
+
keycloakSecretLocation: "us-east-1",
|
|
3662
|
+
keycloakSecretLastUpdated: (/* @__PURE__ */ new Date()).toString(),
|
|
3663
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3664
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3665
|
+
}
|
|
3512
3666
|
},
|
|
3513
3667
|
{
|
|
3514
|
-
id:
|
|
3668
|
+
id: 8,
|
|
3515
3669
|
type: "digital",
|
|
3516
3670
|
name: "CustomerSupport Bot",
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
lastActive: /* @__PURE__ */ new Date(),
|
|
3671
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3672
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3520
3673
|
jobDescription: "AI-powered customer support assistant that handles inquiries, resolves issues, and escalates complex problems.",
|
|
3521
3674
|
workInstructions: "Respond to customer inquiries, troubleshoot common issues, provide product information, and escalate complex cases to human agents.",
|
|
3522
3675
|
capabilities: [
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3676
|
+
{
|
|
3677
|
+
relationTo: "mcpTools",
|
|
3678
|
+
value: 1
|
|
3679
|
+
},
|
|
3680
|
+
{
|
|
3681
|
+
relationTo: "mcpTools",
|
|
3682
|
+
value: 2
|
|
3683
|
+
},
|
|
3684
|
+
{
|
|
3685
|
+
relationTo: "mcpTools",
|
|
3686
|
+
value: 5
|
|
3687
|
+
}
|
|
3528
3688
|
],
|
|
3529
|
-
knowledge:
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3689
|
+
knowledge: 1,
|
|
3690
|
+
coreKnowledge: 1,
|
|
3691
|
+
capabilityLevel: 1,
|
|
3692
|
+
// version: '1.8',
|
|
3693
|
+
// lastUpdated: new Date('2024-02-25'),
|
|
3694
|
+
// isActive: true,
|
|
3695
|
+
identity: {
|
|
3696
|
+
id: 1,
|
|
3697
|
+
keycloakClientId: "123",
|
|
3698
|
+
keycloakUserId: "456",
|
|
3699
|
+
secretManagementMode: "manual",
|
|
3700
|
+
keycloakClientSecret: "new-secret",
|
|
3701
|
+
keycloakSecretArn: "arn:aws:secretsmanager:us-east-1:123456789012:secret:mysecret",
|
|
3702
|
+
keycloakSecretLocation: "us-east-1",
|
|
3703
|
+
keycloakSecretLastUpdated: (/* @__PURE__ */ new Date()).toString(),
|
|
3704
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3705
|
+
createdAt: (/* @__PURE__ */ new Date()).toString()
|
|
3706
|
+
}
|
|
3541
3707
|
}
|
|
3542
3708
|
];
|
|
3543
3709
|
var mockReminders = [
|
|
3544
3710
|
{
|
|
3545
|
-
id:
|
|
3711
|
+
id: 1,
|
|
3546
3712
|
title: "Review quarterly report",
|
|
3547
3713
|
description: "Go through Q4 performance metrics and prepare summary for the team meeting",
|
|
3548
|
-
dueDate: new Date(2024, 2, 15),
|
|
3714
|
+
dueDate: new Date(2024, 2, 15).toString(),
|
|
3549
3715
|
dueTime: "14:30",
|
|
3550
|
-
|
|
3551
|
-
|
|
3716
|
+
assignedColleague: mockColleagues.find(
|
|
3717
|
+
(c) => c.id === "2" && c.type === "digital"
|
|
3718
|
+
),
|
|
3719
|
+
// isCompleted: false,
|
|
3552
3720
|
isRecurring: false,
|
|
3553
|
-
priority:
|
|
3554
|
-
reminderEnabled: true,
|
|
3555
|
-
reminderMinutes: 30,
|
|
3556
|
-
createdAt: new Date(2024, 2, 10),
|
|
3557
|
-
|
|
3721
|
+
// priority: 'high',
|
|
3722
|
+
// reminderEnabled: true,
|
|
3723
|
+
// reminderMinutes: 30,
|
|
3724
|
+
createdAt: new Date(2024, 2, 10).toString(),
|
|
3725
|
+
updatedAt: new Date(2024, 2, 10).toString(),
|
|
3726
|
+
project: mockProjects[0]
|
|
3727
|
+
// tags: ['quarterly', 'review', 'urgent'],
|
|
3558
3728
|
},
|
|
3559
3729
|
{
|
|
3560
|
-
id:
|
|
3730
|
+
id: 2,
|
|
3561
3731
|
title: "Weekly team standup",
|
|
3562
3732
|
description: "Join the weekly team synchronization meeting",
|
|
3563
|
-
dueDate: new Date(2024, 2, 18),
|
|
3733
|
+
dueDate: new Date(2024, 2, 18).toString(),
|
|
3564
3734
|
dueTime: "10:00",
|
|
3565
|
-
|
|
3566
|
-
|
|
3567
|
-
|
|
3568
|
-
|
|
3569
|
-
|
|
3570
|
-
|
|
3571
|
-
|
|
3572
|
-
|
|
3573
|
-
|
|
3574
|
-
|
|
3735
|
+
assignedColleague: mockColleagues.find(
|
|
3736
|
+
(c) => c.id === "4" && c.type === "digital"
|
|
3737
|
+
),
|
|
3738
|
+
// isCompleted: false,
|
|
3739
|
+
// isRecurring: true,
|
|
3740
|
+
// recurrencePattern: 'weekly',
|
|
3741
|
+
// recurrenceInterval: 1,
|
|
3742
|
+
// priority: 'medium',
|
|
3743
|
+
// reminderEnabled: true,
|
|
3744
|
+
// reminderMinutes: 15,
|
|
3745
|
+
createdAt: new Date(2024, 2, 11).toString(),
|
|
3746
|
+
updatedAt: new Date(2024, 2, 11).toString(),
|
|
3747
|
+
project: mockProjects[0]
|
|
3748
|
+
// tags: ['meeting', 'standup', 'weekly'],
|
|
3575
3749
|
},
|
|
3576
3750
|
{
|
|
3577
|
-
id:
|
|
3751
|
+
id: 3,
|
|
3578
3752
|
title: "Deploy to production",
|
|
3579
3753
|
description: "Deploy the latest version to production environment",
|
|
3580
|
-
dueDate: /* @__PURE__ */ new Date(),
|
|
3754
|
+
dueDate: (/* @__PURE__ */ new Date()).toString(),
|
|
3581
3755
|
dueTime: "16:00",
|
|
3582
|
-
|
|
3583
|
-
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3756
|
+
assignedColleague: mockColleagues.find(
|
|
3757
|
+
(c) => c.id === "2" && c.type === "digital"
|
|
3758
|
+
),
|
|
3759
|
+
// isCompleted: false,
|
|
3760
|
+
// isRecurring: false,
|
|
3761
|
+
// priority: 'high',
|
|
3762
|
+
// reminderEnabled: true,
|
|
3763
|
+
// reminderMinutes: 60,
|
|
3764
|
+
createdAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3765
|
+
updatedAt: (/* @__PURE__ */ new Date()).toString(),
|
|
3766
|
+
project: mockProjects[0]
|
|
3767
|
+
// tags: ['deploy', 'production', 'urgent'],
|
|
3590
3768
|
}
|
|
3591
3769
|
];
|
|
3592
3770
|
var mockDigitalColleagues = mockColleagues.filter(
|
|
@@ -3605,15 +3783,16 @@ function useLocalStorage(key, initialValue) {
|
|
|
3605
3783
|
return initialValue;
|
|
3606
3784
|
}
|
|
3607
3785
|
});
|
|
3608
|
-
const setValue = (value) => {
|
|
3786
|
+
const setValue = (0, import_react.useCallback)((value) => {
|
|
3609
3787
|
try {
|
|
3610
|
-
|
|
3788
|
+
const valueToStore = value instanceof Function ? value(storedValue) : value;
|
|
3789
|
+
setStoredValue(valueToStore);
|
|
3611
3790
|
if (typeof window !== "undefined") {
|
|
3612
|
-
window.localStorage.setItem(key, JSON.stringify(
|
|
3791
|
+
window.localStorage.setItem(key, JSON.stringify(valueToStore));
|
|
3613
3792
|
}
|
|
3614
3793
|
} catch (error) {
|
|
3615
3794
|
}
|
|
3616
|
-
};
|
|
3795
|
+
}, [key, storedValue]);
|
|
3617
3796
|
(0, import_react.useEffect)(() => {
|
|
3618
3797
|
setValue(storedValue);
|
|
3619
3798
|
}, []);
|
|
@@ -4485,7 +4664,7 @@ function AppHeader({
|
|
|
4485
4664
|
] });
|
|
4486
4665
|
}
|
|
4487
4666
|
|
|
4488
|
-
// src/components/
|
|
4667
|
+
// src/components/Foundry/foundary-layout.tsx
|
|
4489
4668
|
var import_lucide_react9 = require("lucide-react");
|
|
4490
4669
|
var import_jsx_runtime17 = require("react/jsx-runtime");
|
|
4491
4670
|
var businessUnits2 = [
|
|
@@ -4498,7 +4677,7 @@ var businessUnits2 = [
|
|
|
4498
4677
|
accentColor: "text-orange-600"
|
|
4499
4678
|
}
|
|
4500
4679
|
];
|
|
4501
|
-
function
|
|
4680
|
+
function FoundryLayout({
|
|
4502
4681
|
sidebarItems,
|
|
4503
4682
|
children,
|
|
4504
4683
|
title = "Digital Colleagues",
|
|
@@ -4517,6 +4696,7 @@ function DigitalColleageusLayout({
|
|
|
4517
4696
|
onNotificationRemove,
|
|
4518
4697
|
onRemoveAll,
|
|
4519
4698
|
logo = "/headerlogo.png",
|
|
4699
|
+
logoLink = "/teams",
|
|
4520
4700
|
appName = "Nuvia",
|
|
4521
4701
|
tagline = "Collaboration Platform",
|
|
4522
4702
|
sidebarInitiallyClosed = false
|
|
@@ -4529,7 +4709,13 @@ function DigitalColleageusLayout({
|
|
|
4529
4709
|
onBusinessUnitChange?.(unit);
|
|
4530
4710
|
};
|
|
4531
4711
|
return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "flex h-full flex-col overflow-hidden rounded-xl bg-background w-[]", children: [
|
|
4532
|
-
mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4712
|
+
mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4713
|
+
"div",
|
|
4714
|
+
{
|
|
4715
|
+
className: "fixed inset-0 z-40 bg-black/50 md:hidden",
|
|
4716
|
+
onClick: () => setMobileMenuOpen(false)
|
|
4717
|
+
}
|
|
4718
|
+
),
|
|
4533
4719
|
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "md:hidden", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4534
4720
|
AppSidebar,
|
|
4535
4721
|
{
|
|
@@ -4541,6 +4727,7 @@ function DigitalColleageusLayout({
|
|
|
4541
4727
|
onBusinessUnitChange: handleBusinessUnitChange,
|
|
4542
4728
|
onSearch,
|
|
4543
4729
|
logo,
|
|
4730
|
+
logoLink,
|
|
4544
4731
|
appName,
|
|
4545
4732
|
tagline
|
|
4546
4733
|
}
|
|
@@ -4555,41 +4742,51 @@ function DigitalColleageusLayout({
|
|
|
4555
4742
|
onBusinessUnitChange: handleBusinessUnitChange,
|
|
4556
4743
|
onSearch,
|
|
4557
4744
|
logo,
|
|
4745
|
+
logoLink,
|
|
4558
4746
|
appName,
|
|
4559
4747
|
tagline
|
|
4560
4748
|
}
|
|
4561
4749
|
) }),
|
|
4562
|
-
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
4563
|
-
|
|
4564
|
-
|
|
4565
|
-
|
|
4566
|
-
|
|
4567
|
-
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
|
|
4575
|
-
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
|
|
4580
|
-
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4750
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
|
|
4751
|
+
"div",
|
|
4752
|
+
{
|
|
4753
|
+
className: cn(
|
|
4754
|
+
"min-h-screen fixed w-full transition-all duration-300 ease-in-out",
|
|
4755
|
+
sidebarOpen ? "md:pl-64" : "md:pl-0"
|
|
4756
|
+
),
|
|
4757
|
+
children: [
|
|
4758
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
|
|
4759
|
+
AppHeader,
|
|
4760
|
+
{
|
|
4761
|
+
title,
|
|
4762
|
+
notifications,
|
|
4763
|
+
onToggleSidebar: () => setSidebarOpen(!sidebarOpen),
|
|
4764
|
+
onToggleMobileMenu: () => setMobileMenuOpen(true),
|
|
4765
|
+
sidebarOpen,
|
|
4766
|
+
activeTab,
|
|
4767
|
+
onTabChange,
|
|
4768
|
+
showTabs,
|
|
4769
|
+
onActionClick,
|
|
4770
|
+
actionIcon,
|
|
4771
|
+
actionText,
|
|
4772
|
+
onNotificationRemove,
|
|
4773
|
+
onRemoveAll,
|
|
4774
|
+
logo,
|
|
4775
|
+
appName,
|
|
4776
|
+
tagline
|
|
4777
|
+
}
|
|
4778
|
+
),
|
|
4779
|
+
/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("main", { className: "flex-1 p-0 flex flex-col h-[calc(100vh-4rem)] overflow-y-scroll", children })
|
|
4780
|
+
]
|
|
4781
|
+
}
|
|
4782
|
+
)
|
|
4586
4783
|
] });
|
|
4587
4784
|
}
|
|
4588
4785
|
|
|
4589
4786
|
// src/components/Projects/ProjectView.tsx
|
|
4590
|
-
var
|
|
4787
|
+
var import_react34 = require("react");
|
|
4591
4788
|
|
|
4592
|
-
// src/components/
|
|
4789
|
+
// src/components/Foundry/ManagementSidebar.tsx
|
|
4593
4790
|
var import_lucide_react10 = require("lucide-react");
|
|
4594
4791
|
var import_jsx_runtime18 = require("react/jsx-runtime");
|
|
4595
4792
|
var viewConfig = [
|
|
@@ -4628,6 +4825,14 @@ var viewConfig = [
|
|
|
4628
4825
|
label: "Tasks",
|
|
4629
4826
|
color: "bg-brand-cyan",
|
|
4630
4827
|
title: "Tasks"
|
|
4828
|
+
},
|
|
4829
|
+
{
|
|
4830
|
+
key: "gantt",
|
|
4831
|
+
icon: import_lucide_react10.BarChart2,
|
|
4832
|
+
label: "Gantt",
|
|
4833
|
+
color: "bg-brand-blue",
|
|
4834
|
+
title: "Gantt Chart",
|
|
4835
|
+
hiddenOnMobile: true
|
|
4631
4836
|
}
|
|
4632
4837
|
];
|
|
4633
4838
|
var ManagementSidebar = ({
|
|
@@ -4636,14 +4841,14 @@ var ManagementSidebar = ({
|
|
|
4636
4841
|
children
|
|
4637
4842
|
}) => {
|
|
4638
4843
|
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex w-full h-screen", children: [
|
|
4639
|
-
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "w-12 h-full bg-sidebar-background flex flex-col flex-shrink-0", children: viewConfig.map((view) => {
|
|
4844
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.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) => {
|
|
4640
4845
|
const Icon2 = view.icon;
|
|
4641
4846
|
const isActive = currentView === view.key;
|
|
4642
4847
|
return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
|
|
4643
4848
|
"button",
|
|
4644
4849
|
{
|
|
4645
4850
|
onClick: () => onViewChange(view.key),
|
|
4646
|
-
className: `flex-1 w-12 flex items-center justify-center text-sidebar-foreground transition-all duration-200 relative
|
|
4851
|
+
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" : ""}`,
|
|
4647
4852
|
title: view.title,
|
|
4648
4853
|
children: [
|
|
4649
4854
|
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon2, { className: "h-4 w-4 flex-shrink-0" }),
|
|
@@ -4653,7 +4858,7 @@ var ManagementSidebar = ({
|
|
|
4653
4858
|
view.key
|
|
4654
4859
|
);
|
|
4655
4860
|
}) }),
|
|
4656
|
-
/* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "flex-1 min-w-0 px-4 md:px-6 h-full overflow-auto", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "w-full h-full", children }) })
|
|
4861
|
+
/* @__PURE__ */ (0, import_jsx_runtime18.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_runtime18.jsx)("div", { className: "w-full h-full", children }) })
|
|
4657
4862
|
] });
|
|
4658
4863
|
};
|
|
4659
4864
|
|
|
@@ -6687,8 +6892,8 @@ function ToolbarPlugin() {
|
|
|
6687
6892
|
blockNode = curr;
|
|
6688
6893
|
}
|
|
6689
6894
|
if (blockNode) {
|
|
6690
|
-
const
|
|
6691
|
-
setAlignment(
|
|
6895
|
+
const format3 = blockNode.getFormatType();
|
|
6896
|
+
setAlignment(format3 || "left");
|
|
6692
6897
|
}
|
|
6693
6898
|
const tag = anchorNode.getTopLevelElement()?.__tag;
|
|
6694
6899
|
setBlockType(tag || "p");
|
|
@@ -7688,7 +7893,7 @@ var markdownToLexical = (markdown) => {
|
|
|
7688
7893
|
var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
7689
7894
|
let content = "";
|
|
7690
7895
|
let richTextContent = void 0;
|
|
7691
|
-
let
|
|
7896
|
+
let format3 = "text";
|
|
7692
7897
|
if (file.url) {
|
|
7693
7898
|
try {
|
|
7694
7899
|
let url = file.url;
|
|
@@ -7709,18 +7914,18 @@ var convertFileTypeToKnowledgeDocument = async (file) => {
|
|
|
7709
7914
|
console.warn("No URL provided for file:", file.name);
|
|
7710
7915
|
}
|
|
7711
7916
|
if (file.mimeType === "text/markdown") {
|
|
7712
|
-
|
|
7917
|
+
format3 = "richText";
|
|
7713
7918
|
richTextContent = markdownToLexical(content);
|
|
7714
7919
|
} else if (file.mimeType?.startsWith("text/")) {
|
|
7715
|
-
|
|
7920
|
+
format3 = "text";
|
|
7716
7921
|
}
|
|
7717
7922
|
return {
|
|
7718
7923
|
id: file.id.toString(),
|
|
7719
7924
|
title: file.name,
|
|
7720
7925
|
description: void 0,
|
|
7721
|
-
content:
|
|
7722
|
-
richTextContent:
|
|
7723
|
-
format:
|
|
7926
|
+
content: format3 === "richText" ? void 0 : content,
|
|
7927
|
+
richTextContent: format3 === "richText" ? richTextContent : void 0,
|
|
7928
|
+
format: format3,
|
|
7724
7929
|
metadata: {},
|
|
7725
7930
|
createdAt: typeof file.createdAt === "string" ? new Date(file.createdAt) : file.createdAt,
|
|
7726
7931
|
updatedAt: /* @__PURE__ */ new Date()
|
|
@@ -7770,8 +7975,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
7770
7975
|
setRichTextContent(document2.richTextContent);
|
|
7771
7976
|
}
|
|
7772
7977
|
}, [document2]);
|
|
7773
|
-
const formatIcon = (
|
|
7774
|
-
switch (
|
|
7978
|
+
const formatIcon = (format3) => {
|
|
7979
|
+
switch (format3) {
|
|
7775
7980
|
case "markdown":
|
|
7776
7981
|
case "mdx":
|
|
7777
7982
|
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_lucide_react19.FileText, { className: "h-6 w-6 text-primary" });
|
|
@@ -7783,8 +7988,8 @@ function FileEdit({ document: document2, onCancel, onSave, onFileUpdate }) {
|
|
|
7783
7988
|
return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_lucide_react19.File, { className: "h-6 w-6 text-muted-foreground" });
|
|
7784
7989
|
}
|
|
7785
7990
|
};
|
|
7786
|
-
const formatBadgeColor = (
|
|
7787
|
-
switch (
|
|
7991
|
+
const formatBadgeColor = (format3) => {
|
|
7992
|
+
switch (format3) {
|
|
7788
7993
|
case "markdown":
|
|
7789
7994
|
return "bg-primary/10 text-primary border-primary/20";
|
|
7790
7995
|
case "mdx":
|
|
@@ -9056,17 +9261,25 @@ var import_react27 = require("react");
|
|
|
9056
9261
|
var import_lucide_react24 = require("lucide-react");
|
|
9057
9262
|
var import_jsx_runtime54 = require("react/jsx-runtime");
|
|
9058
9263
|
var EpicsView = ({
|
|
9264
|
+
projectId,
|
|
9059
9265
|
tasks,
|
|
9060
9266
|
epics,
|
|
9061
9267
|
sprints,
|
|
9268
|
+
colleagues = [],
|
|
9062
9269
|
onUpdateTask,
|
|
9063
9270
|
onTaskClick,
|
|
9064
9271
|
onAddTaskToEpic,
|
|
9065
9272
|
onAddEpic,
|
|
9066
9273
|
onUpdateEpic,
|
|
9067
|
-
onDeleteEpic
|
|
9274
|
+
onDeleteEpic,
|
|
9275
|
+
onDeleteTask,
|
|
9276
|
+
onAddComment,
|
|
9277
|
+
onUploadFile,
|
|
9278
|
+
onDeleteFile,
|
|
9279
|
+
onFileUpdate
|
|
9068
9280
|
}) => {
|
|
9069
9281
|
const [availableEpics, setAvailableEpics] = (0, import_react27.useState)(epics);
|
|
9282
|
+
const [availableTasks, setAvailableTasks] = (0, import_react27.useState)(tasks);
|
|
9070
9283
|
const [draggedTask, setDraggedTask] = (0, import_react27.useState)(null);
|
|
9071
9284
|
const [editingEpic, setEditingEpic] = (0, import_react27.useState)(null);
|
|
9072
9285
|
const [editForm, setEditForm] = (0, import_react27.useState)({});
|
|
@@ -9074,16 +9287,29 @@ var EpicsView = ({
|
|
|
9074
9287
|
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react27.useState)(false);
|
|
9075
9288
|
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react27.useState)(false);
|
|
9076
9289
|
const [addTaskEpic, setAddTaskEpic] = (0, import_react27.useState)(null);
|
|
9290
|
+
const [selectedTask, setSelectedTask] = (0, import_react27.useState)(null);
|
|
9291
|
+
const [selectedEpicIds, setSelectedEpicIds] = useLocalStorage(
|
|
9292
|
+
`epicsView_selectedEpics${projectId ? `_${projectId}` : ""}`,
|
|
9293
|
+
[]
|
|
9294
|
+
);
|
|
9295
|
+
const [isEpicSelectorOpen, setIsEpicSelectorOpen] = (0, import_react27.useState)(false);
|
|
9077
9296
|
const heroRef = (0, import_react27.useRef)(null);
|
|
9078
9297
|
const containerRef = (0, import_react27.useRef)(null);
|
|
9079
9298
|
(0, import_react27.useEffect)(() => {
|
|
9080
9299
|
setAvailableEpics(epics);
|
|
9300
|
+
const validIds = new Set(epics.map((e) => e.id.toString()));
|
|
9301
|
+
setSelectedEpicIds((prev) => prev.filter((id) => validIds.has(id)));
|
|
9081
9302
|
}, [epics]);
|
|
9303
|
+
(0, import_react27.useEffect)(() => {
|
|
9304
|
+
setAvailableTasks(tasks);
|
|
9305
|
+
if (selectedTask) {
|
|
9306
|
+
setSelectedTask(tasks.find((t) => t.id === selectedTask.id) || null);
|
|
9307
|
+
}
|
|
9308
|
+
}, [tasks]);
|
|
9082
9309
|
(0, import_react27.useEffect)(() => {
|
|
9083
9310
|
const measureHeroHeight = () => {
|
|
9084
9311
|
if (heroRef.current) {
|
|
9085
|
-
|
|
9086
|
-
setHeroHeight(height);
|
|
9312
|
+
setHeroHeight(heroRef.current.offsetHeight);
|
|
9087
9313
|
}
|
|
9088
9314
|
};
|
|
9089
9315
|
measureHeroHeight();
|
|
@@ -9108,6 +9334,12 @@ var EpicsView = ({
|
|
|
9108
9334
|
}, 300);
|
|
9109
9335
|
return () => clearTimeout(timer);
|
|
9110
9336
|
}, [editingEpic]);
|
|
9337
|
+
const visibleEpics = selectedEpicIds.length === 0 ? availableEpics : availableEpics.filter((e) => selectedEpicIds.includes(e.id.toString()));
|
|
9338
|
+
const toggleEpicView = (epicId) => {
|
|
9339
|
+
setSelectedEpicIds(
|
|
9340
|
+
(prev) => prev.includes(epicId) ? prev.filter((id) => id !== epicId) : [...prev, epicId]
|
|
9341
|
+
);
|
|
9342
|
+
};
|
|
9111
9343
|
const handleDragStart = (task) => {
|
|
9112
9344
|
setDraggedTask(task);
|
|
9113
9345
|
};
|
|
@@ -9117,14 +9349,41 @@ var EpicsView = ({
|
|
|
9117
9349
|
const handleDrop = (e, epicId) => {
|
|
9118
9350
|
e.preventDefault();
|
|
9119
9351
|
if (draggedTask && extractId(draggedTask.epic).toString() !== epicId) {
|
|
9120
|
-
onUpdateTask(draggedTask.id.toString(), {
|
|
9121
|
-
|
|
9122
|
-
|
|
9352
|
+
onUpdateTask(draggedTask.id.toString(), { epic: Number(epicId) });
|
|
9353
|
+
setAvailableTasks(
|
|
9354
|
+
(prev) => prev.map((t) => t.id === draggedTask.id ? { ...t, epic: Number(epicId) } : t)
|
|
9355
|
+
);
|
|
9123
9356
|
setDraggedTask(null);
|
|
9124
9357
|
}
|
|
9125
9358
|
};
|
|
9126
9359
|
const getTasksByEpic = (epicId) => {
|
|
9127
|
-
return
|
|
9360
|
+
return availableTasks.filter((task) => extractId(task.epic).toString() === epicId);
|
|
9361
|
+
};
|
|
9362
|
+
const handleTaskClick = (task) => {
|
|
9363
|
+
setSelectedTask(task);
|
|
9364
|
+
onTaskClick?.(task);
|
|
9365
|
+
};
|
|
9366
|
+
const handleUpdateTask = async (taskId, updates) => {
|
|
9367
|
+
setAvailableTasks(
|
|
9368
|
+
(prev) => prev.map((t) => t.id === Number(taskId) ? { ...t, ...updates } : t)
|
|
9369
|
+
);
|
|
9370
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
9371
|
+
setSelectedTask((prev) => prev ? { ...prev, ...updates } : null);
|
|
9372
|
+
}
|
|
9373
|
+
await onUpdateTask(taskId, updates);
|
|
9374
|
+
};
|
|
9375
|
+
const handleDeleteTask = async (taskId) => {
|
|
9376
|
+
setAvailableTasks((prev) => prev.filter((t) => t.id !== Number(taskId)));
|
|
9377
|
+
if (selectedTask?.id === Number(taskId)) {
|
|
9378
|
+
setSelectedTask(null);
|
|
9379
|
+
}
|
|
9380
|
+
await onDeleteTask?.(taskId);
|
|
9381
|
+
};
|
|
9382
|
+
const handleRemoveFromEpic = (task) => {
|
|
9383
|
+
onUpdateTask(task.id.toString(), { epic: null });
|
|
9384
|
+
setAvailableTasks(
|
|
9385
|
+
(prev) => prev.map((t) => t.id === task.id ? { ...t, epic: null } : t)
|
|
9386
|
+
);
|
|
9128
9387
|
};
|
|
9129
9388
|
const handleEditEpic = (epic) => {
|
|
9130
9389
|
setEditingEpic(epic.id.toString());
|
|
@@ -9133,19 +9392,15 @@ var EpicsView = ({
|
|
|
9133
9392
|
description: epic.description,
|
|
9134
9393
|
confidence: epic.confidence,
|
|
9135
9394
|
phase: epic.phase
|
|
9136
|
-
// progress: epic.progress || 0, // This is a number, not a string
|
|
9137
9395
|
});
|
|
9138
9396
|
};
|
|
9139
9397
|
const handleSaveEdit = async () => {
|
|
9140
9398
|
if (editingEpic && editForm.name) {
|
|
9141
9399
|
await onUpdateEpic(editingEpic.toString(), editForm);
|
|
9142
9400
|
setAvailableEpics(
|
|
9143
|
-
(prev) => prev.map(
|
|
9144
|
-
|
|
9145
|
-
|
|
9146
|
-
}
|
|
9147
|
-
return epic;
|
|
9148
|
-
})
|
|
9401
|
+
(prev) => prev.map(
|
|
9402
|
+
(epic) => epic.id.toString() === editingEpic ? { ...epic, ...editForm } : epic
|
|
9403
|
+
)
|
|
9149
9404
|
);
|
|
9150
9405
|
setEditingEpic(null);
|
|
9151
9406
|
setEditForm({});
|
|
@@ -9161,6 +9416,7 @@ var EpicsView = ({
|
|
|
9161
9416
|
)) {
|
|
9162
9417
|
await onDeleteEpic(epicId);
|
|
9163
9418
|
setAvailableEpics((prev) => prev.filter((epic) => epic.id.toString() !== epicId));
|
|
9419
|
+
setSelectedEpicIds((prev) => prev.filter((id) => id !== epicId));
|
|
9164
9420
|
}
|
|
9165
9421
|
};
|
|
9166
9422
|
const getPhaseLabel = (phase) => {
|
|
@@ -9203,218 +9459,315 @@ var EpicsView = ({
|
|
|
9203
9459
|
}
|
|
9204
9460
|
}
|
|
9205
9461
|
) }),
|
|
9206
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime54.
|
|
9462
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9207
9463
|
"div",
|
|
9208
9464
|
{
|
|
9209
|
-
className: "h-full overflow-y-auto",
|
|
9465
|
+
className: "h-full overflow-y-auto no-scrollbar",
|
|
9210
9466
|
style: {
|
|
9211
9467
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
9212
9468
|
},
|
|
9213
|
-
children:
|
|
9214
|
-
|
|
9215
|
-
|
|
9216
|
-
|
|
9217
|
-
|
|
9218
|
-
|
|
9219
|
-
|
|
9220
|
-
|
|
9221
|
-
|
|
9222
|
-
|
|
9223
|
-
|
|
9224
|
-
|
|
9225
|
-
|
|
9226
|
-
|
|
9227
|
-
|
|
9228
|
-
|
|
9229
|
-
|
|
9230
|
-
children: [
|
|
9231
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "p-4 border-b border-border", children: editingEpic === epic.id.toString() ? (
|
|
9232
|
-
/* Edit Mode */
|
|
9233
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "space-y-4", children: [
|
|
9234
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9235
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9236
|
-
Input,
|
|
9237
|
-
{
|
|
9238
|
-
value: editForm.name || "",
|
|
9239
|
-
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
9240
|
-
placeholder: "Epic name",
|
|
9241
|
-
className: "font-semibold"
|
|
9242
|
-
}
|
|
9243
|
-
),
|
|
9244
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex gap-2 ml-2", children: [
|
|
9245
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9246
|
-
Button,
|
|
9247
|
-
{
|
|
9248
|
-
size: "sm",
|
|
9249
|
-
variant: "ghost",
|
|
9250
|
-
onClick: handleSaveEdit,
|
|
9251
|
-
className: "p-1 h-8 w-8",
|
|
9252
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Check, { className: "h-4 w-4" })
|
|
9253
|
-
}
|
|
9254
|
-
),
|
|
9469
|
+
children: [
|
|
9470
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "mb-4", children: [
|
|
9471
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9472
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
9473
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
|
|
9474
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Epics" }),
|
|
9475
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "text-xs text-muted-foreground", children: selectedEpicIds.length === 0 ? "All showing" : `${selectedEpicIds.length}/${availableEpics.length} selected` })
|
|
9476
|
+
] }),
|
|
9477
|
+
selectedEpicIds.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
9478
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
9479
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleEpics.map((epic) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9480
|
+
"div",
|
|
9481
|
+
{
|
|
9482
|
+
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
9483
|
+
children: [
|
|
9484
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
9485
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "max-w-[80px] truncate", children: epic.name }),
|
|
9255
9486
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9256
|
-
|
|
9487
|
+
"button",
|
|
9257
9488
|
{
|
|
9258
|
-
|
|
9259
|
-
|
|
9260
|
-
onClick: handleCancelEdit,
|
|
9261
|
-
className: "p-1 h-8 w-8",
|
|
9489
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
9490
|
+
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
9262
9491
|
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.X, { className: "h-4 w-4" })
|
|
9263
9492
|
}
|
|
9264
9493
|
)
|
|
9265
|
-
]
|
|
9494
|
+
]
|
|
9495
|
+
},
|
|
9496
|
+
epic.id
|
|
9497
|
+
)) })
|
|
9498
|
+
] })
|
|
9499
|
+
] }),
|
|
9500
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9501
|
+
Button,
|
|
9502
|
+
{
|
|
9503
|
+
onClick: () => setIsEpicSelectorOpen(!isEpicSelectorOpen),
|
|
9504
|
+
variant: "outline",
|
|
9505
|
+
size: "sm",
|
|
9506
|
+
className: "gap-1",
|
|
9507
|
+
children: [
|
|
9508
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Layers, { className: "h-3 w-3" }),
|
|
9509
|
+
isEpicSelectorOpen ? "Close" : "Select"
|
|
9510
|
+
]
|
|
9511
|
+
}
|
|
9512
|
+
)
|
|
9513
|
+
] }) }),
|
|
9514
|
+
isEpicSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9515
|
+
"div",
|
|
9516
|
+
{
|
|
9517
|
+
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
9518
|
+
onClick: () => setIsEpicSelectorOpen(false)
|
|
9519
|
+
}
|
|
9520
|
+
),
|
|
9521
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9522
|
+
"div",
|
|
9523
|
+
{
|
|
9524
|
+
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"}`,
|
|
9525
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
9526
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
9527
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9528
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Epics" }),
|
|
9529
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9530
|
+
Button,
|
|
9531
|
+
{
|
|
9532
|
+
variant: "ghost",
|
|
9533
|
+
size: "sm",
|
|
9534
|
+
onClick: () => setIsEpicSelectorOpen(false),
|
|
9535
|
+
className: "h-8 w-8 p-0",
|
|
9536
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.X, { className: "h-4 w-4" })
|
|
9537
|
+
}
|
|
9538
|
+
)
|
|
9266
9539
|
] }),
|
|
9267
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9268
|
-
|
|
9540
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Filter which epics to display. Select none to show all." })
|
|
9541
|
+
] }),
|
|
9542
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto no-scrollbar", children: availableEpics.length > 0 ? availableEpics.map((epic) => {
|
|
9543
|
+
const isSelected = selectedEpicIds.includes(epic.id.toString());
|
|
9544
|
+
const taskCount = availableTasks.filter(
|
|
9545
|
+
(t) => extractId(t.epic) === epic.id
|
|
9546
|
+
).length;
|
|
9547
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9548
|
+
"div",
|
|
9269
9549
|
{
|
|
9270
|
-
|
|
9271
|
-
|
|
9272
|
-
|
|
9273
|
-
|
|
9274
|
-
|
|
9275
|
-
|
|
9276
|
-
|
|
9277
|
-
|
|
9278
|
-
|
|
9279
|
-
|
|
9280
|
-
|
|
9281
|
-
|
|
9282
|
-
|
|
9283
|
-
|
|
9284
|
-
|
|
9285
|
-
|
|
9286
|
-
|
|
9287
|
-
|
|
9288
|
-
|
|
9289
|
-
|
|
9290
|
-
|
|
9291
|
-
|
|
9292
|
-
|
|
9293
|
-
|
|
9294
|
-
|
|
9295
|
-
|
|
9296
|
-
|
|
9297
|
-
|
|
9298
|
-
|
|
9299
|
-
|
|
9300
|
-
|
|
9301
|
-
|
|
9302
|
-
|
|
9303
|
-
|
|
9304
|
-
|
|
9305
|
-
|
|
9306
|
-
|
|
9307
|
-
|
|
9308
|
-
|
|
9309
|
-
|
|
9310
|
-
|
|
9311
|
-
|
|
9312
|
-
|
|
9313
|
-
|
|
9314
|
-
|
|
9315
|
-
|
|
9316
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-2 mb-2", children: [
|
|
9317
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: `w-4 h-4 rounded-full ${epic.color}` }),
|
|
9318
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "font-semibold text-foreground select-none flex-1", children: epic.name }),
|
|
9319
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex gap-1", children: [
|
|
9550
|
+
className: `p-3 rounded-lg border transition-all ${isSelected ? "bg-primary/10 border-primary/30 ring-1 ring-primary/20" : "bg-card border-border"}`,
|
|
9551
|
+
children: [
|
|
9552
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9553
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-2 flex-1 min-w-0", children: [
|
|
9554
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
9555
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "font-medium text-sm text-foreground truncate", children: epic.name })
|
|
9556
|
+
] }),
|
|
9557
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "ml-2 flex items-center gap-1", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Badge, { variant: "secondary", className: "text-xs", children: taskCount }) })
|
|
9558
|
+
] }),
|
|
9559
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9560
|
+
Button,
|
|
9561
|
+
{
|
|
9562
|
+
variant: isSelected ? "default" : "outline",
|
|
9563
|
+
size: "sm",
|
|
9564
|
+
className: "w-full mt-2 text-xs h-7",
|
|
9565
|
+
onClick: () => toggleEpicView(epic.id.toString()),
|
|
9566
|
+
children: isSelected ? "Deselect" : "Select"
|
|
9567
|
+
}
|
|
9568
|
+
)
|
|
9569
|
+
]
|
|
9570
|
+
},
|
|
9571
|
+
epic.id
|
|
9572
|
+
);
|
|
9573
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "text-sm text-muted-foreground text-center py-8", children: "No epics yet. Add one to get started." }) }) })
|
|
9574
|
+
] })
|
|
9575
|
+
}
|
|
9576
|
+
)
|
|
9577
|
+
] }),
|
|
9578
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.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) => {
|
|
9579
|
+
const epicTasks = getTasksByEpic(epic.id.toString());
|
|
9580
|
+
const totalPoints = epicTasks.reduce(
|
|
9581
|
+
(sum, task) => sum + (task.storyPoints || 0),
|
|
9582
|
+
0
|
|
9583
|
+
);
|
|
9584
|
+
return /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9585
|
+
Card,
|
|
9586
|
+
{
|
|
9587
|
+
className: "flex flex-col bg-card shadow-sm",
|
|
9588
|
+
style: { maxHeight: "420px" },
|
|
9589
|
+
onDragOver: handleDragOver,
|
|
9590
|
+
onDrop: (e) => handleDrop(e, epic.id.toString()),
|
|
9591
|
+
children: [
|
|
9592
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "p-3 border-b border-border flex-shrink-0", children: editingEpic === epic.id.toString() ? (
|
|
9593
|
+
/* Edit Mode */
|
|
9594
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "space-y-3", children: [
|
|
9595
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
9320
9596
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9321
|
-
|
|
9597
|
+
Input,
|
|
9322
9598
|
{
|
|
9323
|
-
|
|
9324
|
-
|
|
9325
|
-
|
|
9326
|
-
className: "
|
|
9327
|
-
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Edit2, { className: "h-3 w-3" })
|
|
9599
|
+
value: editForm.name || "",
|
|
9600
|
+
onChange: (e) => setEditForm({ ...editForm, name: e.target.value }),
|
|
9601
|
+
placeholder: "Epic name",
|
|
9602
|
+
className: "font-semibold text-sm"
|
|
9328
9603
|
}
|
|
9329
9604
|
),
|
|
9330
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.
|
|
9331
|
-
|
|
9332
|
-
|
|
9333
|
-
|
|
9334
|
-
|
|
9335
|
-
|
|
9336
|
-
|
|
9337
|
-
|
|
9338
|
-
|
|
9339
|
-
|
|
9340
|
-
|
|
9341
|
-
|
|
9342
|
-
|
|
9343
|
-
|
|
9344
|
-
|
|
9345
|
-
|
|
9346
|
-
|
|
9347
|
-
|
|
9348
|
-
|
|
9349
|
-
|
|
9605
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex gap-1 ml-2", children: [
|
|
9606
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9607
|
+
Button,
|
|
9608
|
+
{
|
|
9609
|
+
size: "sm",
|
|
9610
|
+
variant: "ghost",
|
|
9611
|
+
onClick: handleSaveEdit,
|
|
9612
|
+
className: "p-1 h-7 w-7",
|
|
9613
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Check, { className: "h-3 w-3" })
|
|
9614
|
+
}
|
|
9615
|
+
),
|
|
9616
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9617
|
+
Button,
|
|
9618
|
+
{
|
|
9619
|
+
size: "sm",
|
|
9620
|
+
variant: "ghost",
|
|
9621
|
+
onClick: handleCancelEdit,
|
|
9622
|
+
className: "p-1 h-7 w-7",
|
|
9623
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.X, { className: "h-3 w-3" })
|
|
9624
|
+
}
|
|
9625
|
+
)
|
|
9626
|
+
] })
|
|
9350
9627
|
] }),
|
|
9351
|
-
/* @__PURE__ */ (0, import_jsx_runtime54.
|
|
9352
|
-
|
|
9628
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9629
|
+
Textarea,
|
|
9353
9630
|
{
|
|
9354
|
-
|
|
9355
|
-
|
|
9356
|
-
|
|
9357
|
-
|
|
9358
|
-
" tasks"
|
|
9359
|
-
]
|
|
9631
|
+
value: editForm.description || "",
|
|
9632
|
+
onChange: (e) => setEditForm({ ...editForm, description: e.target.value }),
|
|
9633
|
+
placeholder: "Epic description",
|
|
9634
|
+
className: "text-xs min-h-[50px]"
|
|
9360
9635
|
}
|
|
9361
9636
|
),
|
|
9637
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
9638
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
|
|
9639
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("label", { className: "text-xs text-muted-foreground", children: "Confidence" }),
|
|
9640
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9641
|
+
"select",
|
|
9642
|
+
{
|
|
9643
|
+
value: editForm.confidence || epic.confidence,
|
|
9644
|
+
onChange: (e) => setEditForm({
|
|
9645
|
+
...editForm,
|
|
9646
|
+
confidence: e.target.value
|
|
9647
|
+
}),
|
|
9648
|
+
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",
|
|
9649
|
+
children: [
|
|
9650
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("option", { value: "low", children: "Low" }),
|
|
9651
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("option", { value: "medium", children: "Medium" }),
|
|
9652
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("option", { value: "high", children: "High" })
|
|
9653
|
+
]
|
|
9654
|
+
}
|
|
9655
|
+
)
|
|
9656
|
+
] }),
|
|
9657
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { children: [
|
|
9658
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("label", { className: "text-xs text-muted-foreground", children: "Phase" }),
|
|
9659
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9660
|
+
"select",
|
|
9661
|
+
{
|
|
9662
|
+
value: editForm.phase?.toString() || epic.phase.toString(),
|
|
9663
|
+
onChange: (e) => setEditForm({ ...editForm, phase: parseInt(e.target.value) }),
|
|
9664
|
+
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",
|
|
9665
|
+
children: [1, 2, 3, 4, 5, 6, 7, 8, 9].map((phase) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("option", { value: phase.toString(), children: [
|
|
9666
|
+
"Phase ",
|
|
9667
|
+
phase
|
|
9668
|
+
] }, phase))
|
|
9669
|
+
}
|
|
9670
|
+
)
|
|
9671
|
+
] })
|
|
9672
|
+
] })
|
|
9673
|
+
] })
|
|
9674
|
+
) : (
|
|
9675
|
+
/* Display Mode */
|
|
9676
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(import_jsx_runtime54.Fragment, { children: [
|
|
9677
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex items-center gap-1.5 mb-1.5", children: [
|
|
9678
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: `w-3 h-3 rounded-full flex-shrink-0 ${epic.color}` }),
|
|
9679
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("h3", { className: "font-semibold text-foreground text-sm select-none flex-1 truncate", children: epic.name }),
|
|
9680
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex gap-0.5", children: [
|
|
9681
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9682
|
+
Button,
|
|
9683
|
+
{
|
|
9684
|
+
size: "sm",
|
|
9685
|
+
variant: "ghost",
|
|
9686
|
+
onClick: () => handleEditEpic(epic),
|
|
9687
|
+
className: "p-1 h-6 w-6",
|
|
9688
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Edit2, { className: "h-3 w-3" })
|
|
9689
|
+
}
|
|
9690
|
+
),
|
|
9691
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9692
|
+
Button,
|
|
9693
|
+
{
|
|
9694
|
+
size: "sm",
|
|
9695
|
+
variant: "ghost",
|
|
9696
|
+
onClick: () => handleDeleteEpic(epic.id.toString()),
|
|
9697
|
+
className: "p-1 h-6 w-6 hover:bg-destructive/10 hover:text-destructive",
|
|
9698
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Trash2, { className: "h-3 w-3" })
|
|
9699
|
+
}
|
|
9700
|
+
)
|
|
9701
|
+
] })
|
|
9702
|
+
] }),
|
|
9703
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-wrap gap-1 mb-2", children: [
|
|
9704
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Badge, { className: `text-xs px-1.5 py-0 ${getConfidenceColor(epic.confidence)}`, children: epic.confidence }),
|
|
9705
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(Badge, { variant: "outline", className: "text-xs px-1.5 py-0", children: getPhaseLabel(epic.phase) }),
|
|
9706
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(Badge, { variant: "secondary", className: "text-xs px-1.5 py-0 bg-muted text-muted-foreground", children: [
|
|
9707
|
+
epicTasks.length,
|
|
9708
|
+
"t \xB7 ",
|
|
9709
|
+
totalPoints,
|
|
9710
|
+
"pt"
|
|
9711
|
+
] })
|
|
9712
|
+
] }),
|
|
9713
|
+
epic.description && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)("p", { className: "text-xs text-muted-foreground mb-2 select-none line-clamp-2", children: epic.description }),
|
|
9362
9714
|
/* @__PURE__ */ (0, import_jsx_runtime54.jsxs)(
|
|
9363
|
-
|
|
9715
|
+
Button,
|
|
9364
9716
|
{
|
|
9365
|
-
|
|
9366
|
-
|
|
9717
|
+
onClick: () => {
|
|
9718
|
+
setIsAddTaskModalOpen(true);
|
|
9719
|
+
setAddTaskEpic(epic);
|
|
9720
|
+
},
|
|
9721
|
+
variant: "outline",
|
|
9722
|
+
size: "sm",
|
|
9723
|
+
className: "w-full gap-1 h-7 text-xs",
|
|
9367
9724
|
children: [
|
|
9368
|
-
|
|
9369
|
-
"
|
|
9725
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Plus, { className: "h-3 w-3" }),
|
|
9726
|
+
"Add Task"
|
|
9370
9727
|
]
|
|
9371
9728
|
}
|
|
9372
9729
|
)
|
|
9373
|
-
] })
|
|
9374
|
-
|
|
9375
|
-
|
|
9376
|
-
|
|
9377
|
-
|
|
9378
|
-
|
|
9379
|
-
|
|
9380
|
-
|
|
9381
|
-
}
|
|
9382
|
-
|
|
9383
|
-
|
|
9384
|
-
|
|
9385
|
-
|
|
9386
|
-
|
|
9387
|
-
|
|
9388
|
-
|
|
9389
|
-
|
|
9390
|
-
|
|
9391
|
-
|
|
9392
|
-
|
|
9393
|
-
|
|
9394
|
-
|
|
9395
|
-
|
|
9396
|
-
|
|
9397
|
-
|
|
9398
|
-
|
|
9399
|
-
|
|
9400
|
-
|
|
9401
|
-
|
|
9402
|
-
|
|
9403
|
-
|
|
9404
|
-
|
|
9405
|
-
|
|
9406
|
-
|
|
9407
|
-
|
|
9408
|
-
|
|
9409
|
-
|
|
9410
|
-
|
|
9411
|
-
|
|
9412
|
-
|
|
9413
|
-
|
|
9414
|
-
},
|
|
9415
|
-
epic.id
|
|
9416
|
-
);
|
|
9417
|
-
}) })
|
|
9730
|
+
] })
|
|
9731
|
+
) }),
|
|
9732
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("div", { className: "flex-1 p-2 overflow-y-auto no-scrollbar min-h-0", children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9733
|
+
"div",
|
|
9734
|
+
{
|
|
9735
|
+
className: `space-y-2 min-h-[80px] border-2 border-dashed rounded p-2 transition-colors ${draggedTask ? "border-primary bg-primary/10" : "border-border"}`,
|
|
9736
|
+
children: epicTasks.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "flex flex-col items-center justify-center h-16 text-muted-foreground", children: [
|
|
9737
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.Move, { className: "h-5 w-5 mb-1" }),
|
|
9738
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)("span", { className: "text-xs select-none", children: "Drop tasks here" })
|
|
9739
|
+
] }) : epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime54.jsxs)("div", { className: "relative group", children: [
|
|
9740
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9741
|
+
TaskCard,
|
|
9742
|
+
{
|
|
9743
|
+
task,
|
|
9744
|
+
epic,
|
|
9745
|
+
onDragStart: handleDragStart,
|
|
9746
|
+
onTaskClick: handleTaskClick,
|
|
9747
|
+
isCompact: true
|
|
9748
|
+
}
|
|
9749
|
+
),
|
|
9750
|
+
/* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9751
|
+
"button",
|
|
9752
|
+
{
|
|
9753
|
+
onClick: (e) => {
|
|
9754
|
+
e.stopPropagation();
|
|
9755
|
+
handleRemoveFromEpic(task);
|
|
9756
|
+
},
|
|
9757
|
+
title: "Remove from epic",
|
|
9758
|
+
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",
|
|
9759
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(import_lucide_react24.X, { className: "h-3 w-3" })
|
|
9760
|
+
}
|
|
9761
|
+
)
|
|
9762
|
+
] }, task.id))
|
|
9763
|
+
}
|
|
9764
|
+
) })
|
|
9765
|
+
]
|
|
9766
|
+
},
|
|
9767
|
+
epic.id
|
|
9768
|
+
);
|
|
9769
|
+
}) })
|
|
9770
|
+
]
|
|
9418
9771
|
}
|
|
9419
9772
|
) })
|
|
9420
9773
|
] }),
|
|
@@ -9437,21 +9790,417 @@ var EpicsView = ({
|
|
|
9437
9790
|
defaultEpicId: addTaskEpic?.id.toString() || "",
|
|
9438
9791
|
sprints
|
|
9439
9792
|
}
|
|
9793
|
+
),
|
|
9794
|
+
selectedTask && /* @__PURE__ */ (0, import_jsx_runtime54.jsx)(
|
|
9795
|
+
TaskDetailsModal,
|
|
9796
|
+
{
|
|
9797
|
+
isOpen: !!selectedTask,
|
|
9798
|
+
onClose: () => setSelectedTask(null),
|
|
9799
|
+
initialTask: selectedTask,
|
|
9800
|
+
epics: availableEpics,
|
|
9801
|
+
sprints,
|
|
9802
|
+
onUpdateTask: handleUpdateTask,
|
|
9803
|
+
onDeleteTask: handleDeleteTask,
|
|
9804
|
+
onAddComment,
|
|
9805
|
+
colleagues,
|
|
9806
|
+
onUploadFile,
|
|
9807
|
+
onDeleteFile,
|
|
9808
|
+
onFileUpdate
|
|
9809
|
+
}
|
|
9440
9810
|
)
|
|
9441
9811
|
] });
|
|
9442
9812
|
};
|
|
9443
9813
|
|
|
9444
|
-
// src/components/Projects/
|
|
9445
|
-
var import_react29 = require("react");
|
|
9446
|
-
var import_lucide_react26 = require("lucide-react");
|
|
9447
|
-
|
|
9448
|
-
// src/components/Projects/AddSprintModal.tsx
|
|
9814
|
+
// src/components/Projects/GanttView.tsx
|
|
9449
9815
|
var import_react28 = require("react");
|
|
9450
|
-
var import_lucide_react25 = require("lucide-react");
|
|
9451
9816
|
var import_date_fns = require("date-fns");
|
|
9817
|
+
var import_lucide_react25 = require("lucide-react");
|
|
9452
9818
|
var import_jsx_runtime55 = require("react/jsx-runtime");
|
|
9819
|
+
var PHASE_LABELS = {
|
|
9820
|
+
1: "Plan",
|
|
9821
|
+
2: "Dev",
|
|
9822
|
+
3: "Test",
|
|
9823
|
+
4: "Deploy",
|
|
9824
|
+
5: "Review",
|
|
9825
|
+
6: "Maint.",
|
|
9826
|
+
7: "Complete",
|
|
9827
|
+
8: "Archive",
|
|
9828
|
+
9: "Legacy"
|
|
9829
|
+
};
|
|
9830
|
+
var ZOOM_LEVELS = [
|
|
9831
|
+
{ label: "Quarter", dayWidth: 3 },
|
|
9832
|
+
{ label: "Month", dayWidth: 7 },
|
|
9833
|
+
{ label: "Week", dayWidth: 14 },
|
|
9834
|
+
{ label: "Day", dayWidth: 40 }
|
|
9835
|
+
];
|
|
9836
|
+
var ROW_HEIGHT = 48;
|
|
9837
|
+
var TIME_HEADER_HEIGHT = 60;
|
|
9838
|
+
var GanttView = ({
|
|
9839
|
+
tasks,
|
|
9840
|
+
epics,
|
|
9841
|
+
sprints,
|
|
9842
|
+
onTaskClick
|
|
9843
|
+
}) => {
|
|
9844
|
+
const [dayWidth, setDayWidth] = (0, import_react28.useState)(7);
|
|
9845
|
+
const [isFullscreen, setIsFullscreen] = (0, import_react28.useState)(false);
|
|
9846
|
+
const scrollRef = (0, import_react28.useRef)(null);
|
|
9847
|
+
const heroRef = (0, import_react28.useRef)(null);
|
|
9848
|
+
const [heroHeight, setHeroHeight] = (0, import_react28.useState)(0);
|
|
9849
|
+
(0, import_react28.useEffect)(() => {
|
|
9850
|
+
const measure = () => {
|
|
9851
|
+
if (heroRef.current) setHeroHeight(heroRef.current.offsetHeight);
|
|
9852
|
+
};
|
|
9853
|
+
const observer = new ResizeObserver(measure);
|
|
9854
|
+
if (heroRef.current) observer.observe(heroRef.current);
|
|
9855
|
+
return () => observer.disconnect();
|
|
9856
|
+
}, []);
|
|
9857
|
+
const { timelineStart, timelineEnd, totalDays } = (0, import_react28.useMemo)(() => {
|
|
9858
|
+
if (epics.length === 0) {
|
|
9859
|
+
const today = /* @__PURE__ */ new Date();
|
|
9860
|
+
const start = (0, import_date_fns.addDays)(today, -14);
|
|
9861
|
+
const end = (0, import_date_fns.addDays)(today, 76);
|
|
9862
|
+
return { timelineStart: start, timelineEnd: end, totalDays: 90 };
|
|
9863
|
+
}
|
|
9864
|
+
const allDates = epics.flatMap((e) => [new Date(e.startDate), new Date(e.endDate)]);
|
|
9865
|
+
const minTime = Math.min(...allDates.map((d) => d.getTime()));
|
|
9866
|
+
const maxTime = Math.max(...allDates.map((d) => d.getTime()));
|
|
9867
|
+
const paddedStart = (0, import_date_fns.addDays)(new Date(minTime), -14);
|
|
9868
|
+
const paddedEnd = (0, import_date_fns.addDays)(new Date(maxTime), 14);
|
|
9869
|
+
return {
|
|
9870
|
+
timelineStart: paddedStart,
|
|
9871
|
+
timelineEnd: paddedEnd,
|
|
9872
|
+
totalDays: (0, import_date_fns.differenceInDays)(paddedEnd, paddedStart)
|
|
9873
|
+
};
|
|
9874
|
+
}, [epics]);
|
|
9875
|
+
const { groups, sortedKeys } = (0, import_react28.useMemo)(() => {
|
|
9876
|
+
const groups2 = {};
|
|
9877
|
+
epics.forEach((epic) => {
|
|
9878
|
+
if (!groups2[epic.name]) groups2[epic.name] = [];
|
|
9879
|
+
groups2[epic.name].push(epic);
|
|
9880
|
+
});
|
|
9881
|
+
Object.values(groups2).forEach((list) => list.sort((a, b) => a.phase - b.phase));
|
|
9882
|
+
const sortedKeys2 = Object.keys(groups2).sort((a, b) => {
|
|
9883
|
+
const aMin = Math.min(...groups2[a].map((e) => new Date(e.startDate).getTime()));
|
|
9884
|
+
const bMin = Math.min(...groups2[b].map((e) => new Date(e.startDate).getTime()));
|
|
9885
|
+
return aMin - bMin;
|
|
9886
|
+
});
|
|
9887
|
+
return { groups: groups2, sortedKeys: sortedKeys2 };
|
|
9888
|
+
}, [epics]);
|
|
9889
|
+
const realSprints = (0, import_react28.useMemo)(
|
|
9890
|
+
() => sprints.filter((s) => {
|
|
9891
|
+
const name = s.name.toLowerCase();
|
|
9892
|
+
return name !== "backlog" && name !== "all tasks";
|
|
9893
|
+
}),
|
|
9894
|
+
[sprints]
|
|
9895
|
+
);
|
|
9896
|
+
const monthHeaders = (0, import_react28.useMemo)(
|
|
9897
|
+
() => (0, import_date_fns.eachMonthOfInterval)({ start: timelineStart, end: timelineEnd }).map((month) => ({
|
|
9898
|
+
month,
|
|
9899
|
+
left: (0, import_date_fns.differenceInDays)(month, timelineStart) * dayWidth
|
|
9900
|
+
})),
|
|
9901
|
+
[timelineStart, timelineEnd, dayWidth]
|
|
9902
|
+
);
|
|
9903
|
+
const totalWidth = Math.max(totalDays * dayWidth, 600);
|
|
9904
|
+
const scrollToToday = (0, import_react28.useCallback)(() => {
|
|
9905
|
+
if (scrollRef.current) {
|
|
9906
|
+
const todayOffset = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
9907
|
+
scrollRef.current.scrollLeft = Math.max(0, todayOffset - 200);
|
|
9908
|
+
}
|
|
9909
|
+
}, [timelineStart, dayWidth]);
|
|
9910
|
+
const todayLeft = (0, import_date_fns.differenceInDays)(/* @__PURE__ */ new Date(), timelineStart) * dayWidth;
|
|
9911
|
+
const getEpicStats = (epic) => {
|
|
9912
|
+
const epicTasks = tasks.filter((t) => extractId(t.epic) === epic.id);
|
|
9913
|
+
const done = epicTasks.filter((t) => t.status === "done").length;
|
|
9914
|
+
const pct = epicTasks.length > 0 ? Math.round(done / epicTasks.length * 100) : 0;
|
|
9915
|
+
return { total: epicTasks.length, done, pct };
|
|
9916
|
+
};
|
|
9917
|
+
const getGroupStats = (epicList) => {
|
|
9918
|
+
const allTasks = epicList.flatMap(
|
|
9919
|
+
(e) => tasks.filter((t) => extractId(t.epic) === e.id)
|
|
9920
|
+
);
|
|
9921
|
+
const done = allTasks.filter((t) => t.status === "done").length;
|
|
9922
|
+
const pct = allTasks.length > 0 ? Math.round(done / allTasks.length * 100) : 0;
|
|
9923
|
+
return { total: allTasks.length, done, pct };
|
|
9924
|
+
};
|
|
9925
|
+
const isSprintActive = (sprint) => {
|
|
9926
|
+
const today = /* @__PURE__ */ new Date();
|
|
9927
|
+
try {
|
|
9928
|
+
return (0, import_date_fns.isWithinInterval)(today, {
|
|
9929
|
+
start: new Date(sprint.startDate),
|
|
9930
|
+
end: new Date(sprint.endDate)
|
|
9931
|
+
});
|
|
9932
|
+
} catch {
|
|
9933
|
+
return false;
|
|
9934
|
+
}
|
|
9935
|
+
};
|
|
9936
|
+
const chartContent = /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex flex-1 min-h-0 overflow-hidden", children: [
|
|
9937
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "w-52 flex-shrink-0 border-r bg-background z-10 flex flex-col", children: [
|
|
9938
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
9939
|
+
"div",
|
|
9940
|
+
{
|
|
9941
|
+
className: "border-b flex items-end pb-2 px-3 flex-shrink-0 bg-muted/20",
|
|
9942
|
+
style: { height: TIME_HEADER_HEIGHT },
|
|
9943
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "text-xs font-semibold text-muted-foreground tracking-wider uppercase", children: "Epic" })
|
|
9944
|
+
}
|
|
9945
|
+
),
|
|
9946
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "overflow-y-auto flex-1", children: [
|
|
9947
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "flex items-center justify-center h-24 text-sm text-muted-foreground", children: "No epics" }),
|
|
9948
|
+
sortedKeys.map((name) => {
|
|
9949
|
+
const stats = getGroupStats(groups[name]);
|
|
9950
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
|
|
9951
|
+
"div",
|
|
9952
|
+
{
|
|
9953
|
+
className: "flex flex-col justify-center px-3 border-b",
|
|
9954
|
+
style: { height: ROW_HEIGHT },
|
|
9955
|
+
children: [
|
|
9956
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "text-sm font-medium truncate", title: name, children: name }),
|
|
9957
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("span", { className: "text-xs text-muted-foreground", children: [
|
|
9958
|
+
stats.total,
|
|
9959
|
+
" task",
|
|
9960
|
+
stats.total !== 1 ? "s" : "",
|
|
9961
|
+
" \xB7 ",
|
|
9962
|
+
stats.pct,
|
|
9963
|
+
"%"
|
|
9964
|
+
] })
|
|
9965
|
+
]
|
|
9966
|
+
},
|
|
9967
|
+
name
|
|
9968
|
+
);
|
|
9969
|
+
})
|
|
9970
|
+
] })
|
|
9971
|
+
] }),
|
|
9972
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "flex-1 overflow-x-auto overflow-y-auto", ref: scrollRef, children: /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { style: { width: totalWidth, position: "relative" }, children: [
|
|
9973
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
|
|
9974
|
+
"div",
|
|
9975
|
+
{
|
|
9976
|
+
className: "sticky top-0 border-b bg-muted/20 z-20 flex-shrink-0",
|
|
9977
|
+
style: { height: TIME_HEADER_HEIGHT, width: totalWidth },
|
|
9978
|
+
children: [
|
|
9979
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
9980
|
+
"div",
|
|
9981
|
+
{
|
|
9982
|
+
className: "absolute top-2 text-xs font-semibold text-muted-foreground select-none",
|
|
9983
|
+
style: { left: left + 4 },
|
|
9984
|
+
children: (0, import_date_fns.format)(month, "MMM yyyy")
|
|
9985
|
+
},
|
|
9986
|
+
month.toISOString()
|
|
9987
|
+
)),
|
|
9988
|
+
realSprints.map((sprint) => {
|
|
9989
|
+
const start = new Date(sprint.startDate);
|
|
9990
|
+
const end = new Date(sprint.endDate);
|
|
9991
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
9992
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
9993
|
+
const right = Math.min(
|
|
9994
|
+
totalWidth,
|
|
9995
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
9996
|
+
);
|
|
9997
|
+
const width = right - left;
|
|
9998
|
+
if (width <= 0) return null;
|
|
9999
|
+
const active = isSprintActive(sprint);
|
|
10000
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10001
|
+
"div",
|
|
10002
|
+
{
|
|
10003
|
+
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"}`,
|
|
10004
|
+
style: { left, width, height: 22 },
|
|
10005
|
+
title: sprint.name,
|
|
10006
|
+
children: sprint.name
|
|
10007
|
+
},
|
|
10008
|
+
`header-sprint-${sprint.id}`
|
|
10009
|
+
);
|
|
10010
|
+
})
|
|
10011
|
+
]
|
|
10012
|
+
}
|
|
10013
|
+
),
|
|
10014
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { style: { position: "relative", width: totalWidth }, children: [
|
|
10015
|
+
realSprints.map((sprint) => {
|
|
10016
|
+
const start = new Date(sprint.startDate);
|
|
10017
|
+
const end = new Date(sprint.endDate);
|
|
10018
|
+
if (start > timelineEnd || end < timelineStart) return null;
|
|
10019
|
+
const left = Math.max(0, (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth);
|
|
10020
|
+
const right = Math.min(
|
|
10021
|
+
totalWidth,
|
|
10022
|
+
(0, import_date_fns.differenceInDays)(end, timelineStart) * dayWidth
|
|
10023
|
+
);
|
|
10024
|
+
const width = right - left;
|
|
10025
|
+
if (width <= 0 || !isSprintActive(sprint)) return null;
|
|
10026
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10027
|
+
"div",
|
|
10028
|
+
{
|
|
10029
|
+
className: "absolute inset-y-0 bg-primary/5 pointer-events-none",
|
|
10030
|
+
style: { left, width }
|
|
10031
|
+
},
|
|
10032
|
+
`bg-${sprint.id}`
|
|
10033
|
+
);
|
|
10034
|
+
}),
|
|
10035
|
+
realSprints.map((sprint) => {
|
|
10036
|
+
const left = (0, import_date_fns.differenceInDays)(new Date(sprint.startDate), timelineStart) * dayWidth;
|
|
10037
|
+
if (left < 0 || left > totalWidth) return null;
|
|
10038
|
+
const active = isSprintActive(sprint);
|
|
10039
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10040
|
+
"div",
|
|
10041
|
+
{
|
|
10042
|
+
className: `absolute inset-y-0 pointer-events-none ${active ? "border-l border-primary/40" : "border-l border-dashed border-border/60"}`,
|
|
10043
|
+
style: { left }
|
|
10044
|
+
},
|
|
10045
|
+
`line-${sprint.id}`
|
|
10046
|
+
);
|
|
10047
|
+
}),
|
|
10048
|
+
todayLeft >= 0 && todayLeft <= totalWidth && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
|
|
10049
|
+
"div",
|
|
10050
|
+
{
|
|
10051
|
+
className: "absolute inset-y-0 pointer-events-none z-10",
|
|
10052
|
+
style: { left: todayLeft },
|
|
10053
|
+
children: [
|
|
10054
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "absolute inset-y-0 w-0.5 bg-destructive/50" }),
|
|
10055
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "absolute top-1 -translate-x-1/2 w-2 h-2 rounded-full bg-destructive" })
|
|
10056
|
+
]
|
|
10057
|
+
}
|
|
10058
|
+
),
|
|
10059
|
+
monthHeaders.map(({ month, left }) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10060
|
+
"div",
|
|
10061
|
+
{
|
|
10062
|
+
className: "absolute inset-y-0 border-l border-border/30 pointer-events-none",
|
|
10063
|
+
style: { left }
|
|
10064
|
+
},
|
|
10065
|
+
`grid-${month.toISOString()}`
|
|
10066
|
+
)),
|
|
10067
|
+
sortedKeys.map((name) => {
|
|
10068
|
+
const epicList = groups[name];
|
|
10069
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10070
|
+
"div",
|
|
10071
|
+
{
|
|
10072
|
+
className: "border-b relative flex items-center",
|
|
10073
|
+
style: { height: ROW_HEIGHT },
|
|
10074
|
+
children: epicList.map((epic) => {
|
|
10075
|
+
const start = new Date(epic.startDate);
|
|
10076
|
+
const end = new Date(epic.endDate);
|
|
10077
|
+
const left = (0, import_date_fns.differenceInDays)(start, timelineStart) * dayWidth;
|
|
10078
|
+
const width = Math.max(8, (0, import_date_fns.differenceInDays)(end, start) * dayWidth);
|
|
10079
|
+
const stats = getEpicStats(epic);
|
|
10080
|
+
const phaseLabel = PHASE_LABELS[epic.phase] ?? `Phase ${epic.phase}`;
|
|
10081
|
+
const showLabel = width >= 50;
|
|
10082
|
+
const tooltip = [
|
|
10083
|
+
`${epic.name} \xB7 ${phaseLabel}`,
|
|
10084
|
+
epic.description ? epic.description : null,
|
|
10085
|
+
`${(0, import_date_fns.format)(start, "dd MMM yyyy")} \u2192 ${(0, import_date_fns.format)(end, "dd MMM yyyy")}`,
|
|
10086
|
+
`${stats.total} tasks \xB7 ${stats.pct}% complete`
|
|
10087
|
+
].filter(Boolean).join("\n");
|
|
10088
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
|
|
10089
|
+
"div",
|
|
10090
|
+
{
|
|
10091
|
+
className: "absolute rounded overflow-hidden cursor-pointer hover:ring-2 hover:ring-white/40 transition-all",
|
|
10092
|
+
style: { left, width, height: 32, top: 8 },
|
|
10093
|
+
title: tooltip,
|
|
10094
|
+
children: [
|
|
10095
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10096
|
+
"div",
|
|
10097
|
+
{
|
|
10098
|
+
className: `absolute inset-0 ${epic.color}`,
|
|
10099
|
+
style: { opacity: 0.2 }
|
|
10100
|
+
}
|
|
10101
|
+
),
|
|
10102
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10103
|
+
"div",
|
|
10104
|
+
{
|
|
10105
|
+
className: `absolute inset-y-0 left-0 ${epic.color} transition-all`,
|
|
10106
|
+
style: { width: `${stats.pct}%`, opacity: 0.85 }
|
|
10107
|
+
}
|
|
10108
|
+
),
|
|
10109
|
+
showLabel && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "absolute inset-0 flex items-center px-2 gap-1.5 z-10", children: [
|
|
10110
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("span", { className: "text-xs font-semibold text-white drop-shadow truncate", children: phaseLabel }),
|
|
10111
|
+
stats.total > 0 && /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("span", { className: "text-xs text-white/80 drop-shadow shrink-0", children: [
|
|
10112
|
+
stats.pct,
|
|
10113
|
+
"%"
|
|
10114
|
+
] })
|
|
10115
|
+
] })
|
|
10116
|
+
]
|
|
10117
|
+
},
|
|
10118
|
+
epic.id
|
|
10119
|
+
);
|
|
10120
|
+
})
|
|
10121
|
+
},
|
|
10122
|
+
name
|
|
10123
|
+
);
|
|
10124
|
+
}),
|
|
10125
|
+
sortedKeys.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10126
|
+
"div",
|
|
10127
|
+
{
|
|
10128
|
+
className: "flex items-center justify-center text-sm text-muted-foreground",
|
|
10129
|
+
style: { height: 200 },
|
|
10130
|
+
children: "No epics to display on the timeline"
|
|
10131
|
+
}
|
|
10132
|
+
)
|
|
10133
|
+
] })
|
|
10134
|
+
] }) })
|
|
10135
|
+
] });
|
|
10136
|
+
const inner = /* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: `flex flex-col ${isFullscreen ? "h-screen" : "h-full"} overflow-hidden`, children: [
|
|
10137
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10138
|
+
DashboardHero,
|
|
10139
|
+
{
|
|
10140
|
+
title: "Gantt Chart",
|
|
10141
|
+
description: "Epic timeline with sprint alignment and phase-based grouping.",
|
|
10142
|
+
gradient: "bg-gradient-to-r from-indigo-600 via-blue-600 to-cyan-600",
|
|
10143
|
+
badge: `${sortedKeys.length} epic${sortedKeys.length !== 1 ? "s" : ""}`
|
|
10144
|
+
}
|
|
10145
|
+
) }),
|
|
10146
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)("div", { className: "flex items-center gap-2 px-4 py-2 border-b bg-background flex-shrink-0", children: [
|
|
10147
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_lucide_react25.BarChart2, { className: "h-4 w-4 text-muted-foreground" }),
|
|
10148
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "flex items-center gap-1", children: ZOOM_LEVELS.map((z) => /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10149
|
+
Button,
|
|
10150
|
+
{
|
|
10151
|
+
variant: dayWidth === z.dayWidth ? "default" : "outline",
|
|
10152
|
+
size: "sm",
|
|
10153
|
+
className: "h-7 px-2 text-xs",
|
|
10154
|
+
onClick: () => setDayWidth(z.dayWidth),
|
|
10155
|
+
children: z.label
|
|
10156
|
+
},
|
|
10157
|
+
z.label
|
|
10158
|
+
)) }),
|
|
10159
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "flex-1" }),
|
|
10160
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsxs)(
|
|
10161
|
+
Button,
|
|
10162
|
+
{
|
|
10163
|
+
variant: "outline",
|
|
10164
|
+
size: "sm",
|
|
10165
|
+
className: "h-7 px-2 text-xs",
|
|
10166
|
+
onClick: scrollToToday,
|
|
10167
|
+
children: [
|
|
10168
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_lucide_react25.Calendar, { className: "h-3 w-3 mr-1" }),
|
|
10169
|
+
"Today"
|
|
10170
|
+
]
|
|
10171
|
+
}
|
|
10172
|
+
),
|
|
10173
|
+
/* @__PURE__ */ (0, import_jsx_runtime55.jsx)(
|
|
10174
|
+
Button,
|
|
10175
|
+
{
|
|
10176
|
+
variant: "outline",
|
|
10177
|
+
size: "sm",
|
|
10178
|
+
className: "h-7 w-7 p-0",
|
|
10179
|
+
onClick: () => setIsFullscreen((v) => !v),
|
|
10180
|
+
title: isFullscreen ? "Exit fullscreen" : "Fullscreen",
|
|
10181
|
+
children: isFullscreen ? /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_lucide_react25.Minimize2, { className: "h-3.5 w-3.5" }) : /* @__PURE__ */ (0, import_jsx_runtime55.jsx)(import_lucide_react25.Maximize2, { className: "h-3.5 w-3.5" })
|
|
10182
|
+
}
|
|
10183
|
+
)
|
|
10184
|
+
] }),
|
|
10185
|
+
chartContent
|
|
10186
|
+
] });
|
|
10187
|
+
if (isFullscreen) {
|
|
10188
|
+
return /* @__PURE__ */ (0, import_jsx_runtime55.jsx)("div", { className: "fixed inset-0 z-50 bg-background overflow-hidden", children: inner });
|
|
10189
|
+
}
|
|
10190
|
+
return inner;
|
|
10191
|
+
};
|
|
10192
|
+
|
|
10193
|
+
// src/components/Projects/PlanningView.tsx
|
|
10194
|
+
var import_react30 = require("react");
|
|
10195
|
+
var import_lucide_react27 = require("lucide-react");
|
|
10196
|
+
|
|
10197
|
+
// src/components/Projects/AddSprintModal.tsx
|
|
10198
|
+
var import_react29 = require("react");
|
|
10199
|
+
var import_lucide_react26 = require("lucide-react");
|
|
10200
|
+
var import_date_fns2 = require("date-fns");
|
|
10201
|
+
var import_jsx_runtime56 = require("react/jsx-runtime");
|
|
9453
10202
|
var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
9454
|
-
const [formData, setFormData] = (0,
|
|
10203
|
+
const [formData, setFormData] = (0, import_react29.useState)({
|
|
9455
10204
|
name: "",
|
|
9456
10205
|
description: "",
|
|
9457
10206
|
startDate: void 0,
|
|
@@ -9492,12 +10241,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9492
10241
|
});
|
|
9493
10242
|
onClose();
|
|
9494
10243
|
};
|
|
9495
|
-
return /* @__PURE__ */ (0,
|
|
9496
|
-
/* @__PURE__ */ (0,
|
|
9497
|
-
/* @__PURE__ */ (0,
|
|
9498
|
-
/* @__PURE__ */ (0,
|
|
9499
|
-
/* @__PURE__ */ (0,
|
|
9500
|
-
/* @__PURE__ */ (0,
|
|
10244
|
+
return /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Dialog, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(DialogContent, { className: "sm:max-w-md", children: [
|
|
10245
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(DialogTitle, { children: "Add New Sprint" }) }),
|
|
10246
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
10247
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "space-y-2", children: [
|
|
10248
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Label3, { htmlFor: "name", children: "Sprint Name *" }),
|
|
10249
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
9501
10250
|
Input,
|
|
9502
10251
|
{
|
|
9503
10252
|
id: "name",
|
|
@@ -9508,9 +10257,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9508
10257
|
}
|
|
9509
10258
|
)
|
|
9510
10259
|
] }),
|
|
9511
|
-
/* @__PURE__ */ (0,
|
|
9512
|
-
/* @__PURE__ */ (0,
|
|
9513
|
-
/* @__PURE__ */ (0,
|
|
10260
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "space-y-2", children: [
|
|
10261
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Label3, { htmlFor: "description", children: "Description" }),
|
|
10262
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
9514
10263
|
Textarea,
|
|
9515
10264
|
{
|
|
9516
10265
|
id: "description",
|
|
@@ -9521,11 +10270,11 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9521
10270
|
}
|
|
9522
10271
|
)
|
|
9523
10272
|
] }),
|
|
9524
|
-
/* @__PURE__ */ (0,
|
|
9525
|
-
/* @__PURE__ */ (0,
|
|
9526
|
-
/* @__PURE__ */ (0,
|
|
9527
|
-
/* @__PURE__ */ (0,
|
|
9528
|
-
/* @__PURE__ */ (0,
|
|
10273
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
10274
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "space-y-2", children: [
|
|
10275
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Label3, { children: "Start Date *" }),
|
|
10276
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(Popover, { children: [
|
|
10277
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
|
|
9529
10278
|
Button,
|
|
9530
10279
|
{
|
|
9531
10280
|
variant: "outline",
|
|
@@ -9534,12 +10283,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9534
10283
|
!formData.startDate && "text-muted-foreground"
|
|
9535
10284
|
),
|
|
9536
10285
|
children: [
|
|
9537
|
-
/* @__PURE__ */ (0,
|
|
9538
|
-
formData.startDate ? (0,
|
|
10286
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lucide_react26.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
10287
|
+
formData.startDate ? (0, import_date_fns2.format)(formData.startDate, "PPP") : "Pick a date"
|
|
9539
10288
|
]
|
|
9540
10289
|
}
|
|
9541
10290
|
) }),
|
|
9542
|
-
/* @__PURE__ */ (0,
|
|
10291
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
9543
10292
|
Calendar4,
|
|
9544
10293
|
{
|
|
9545
10294
|
mode: "single",
|
|
@@ -9550,10 +10299,10 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9550
10299
|
) })
|
|
9551
10300
|
] })
|
|
9552
10301
|
] }),
|
|
9553
|
-
/* @__PURE__ */ (0,
|
|
9554
|
-
/* @__PURE__ */ (0,
|
|
9555
|
-
/* @__PURE__ */ (0,
|
|
9556
|
-
/* @__PURE__ */ (0,
|
|
10302
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "space-y-2", children: [
|
|
10303
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Label3, { children: "End Date *" }),
|
|
10304
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(Popover, { children: [
|
|
10305
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ (0, import_jsx_runtime56.jsxs)(
|
|
9557
10306
|
Button,
|
|
9558
10307
|
{
|
|
9559
10308
|
variant: "outline",
|
|
@@ -9562,12 +10311,12 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9562
10311
|
!formData.endDate && "text-muted-foreground"
|
|
9563
10312
|
),
|
|
9564
10313
|
children: [
|
|
9565
|
-
/* @__PURE__ */ (0,
|
|
9566
|
-
formData.endDate ? (0,
|
|
10314
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(import_lucide_react26.CalendarIcon, { className: "mr-2 h-4 w-4" }),
|
|
10315
|
+
formData.endDate ? (0, import_date_fns2.format)(formData.endDate, "PPP") : "Pick a date"
|
|
9567
10316
|
]
|
|
9568
10317
|
}
|
|
9569
10318
|
) }),
|
|
9570
|
-
/* @__PURE__ */ (0,
|
|
10319
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
9571
10320
|
Calendar4,
|
|
9572
10321
|
{
|
|
9573
10322
|
mode: "single",
|
|
@@ -9580,9 +10329,9 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9580
10329
|
] })
|
|
9581
10330
|
] })
|
|
9582
10331
|
] }),
|
|
9583
|
-
/* @__PURE__ */ (0,
|
|
9584
|
-
/* @__PURE__ */ (0,
|
|
9585
|
-
/* @__PURE__ */ (0,
|
|
10332
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsxs)("div", { className: "flex justify-end gap-3 pt-4", children: [
|
|
10333
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(Button, { type: "button", variant: "outline", onClick: handleClose, children: "Cancel" }),
|
|
10334
|
+
/* @__PURE__ */ (0, import_jsx_runtime56.jsx)(
|
|
9586
10335
|
Button,
|
|
9587
10336
|
{
|
|
9588
10337
|
type: "submit",
|
|
@@ -9596,7 +10345,7 @@ var AddSprintModal = ({ isOpen, onClose, onAddSprint }) => {
|
|
|
9596
10345
|
};
|
|
9597
10346
|
|
|
9598
10347
|
// src/components/Projects/PlanningView.tsx
|
|
9599
|
-
var
|
|
10348
|
+
var import_jsx_runtime57 = require("react/jsx-runtime");
|
|
9600
10349
|
var PlanningView = ({
|
|
9601
10350
|
tasks,
|
|
9602
10351
|
epics,
|
|
@@ -9607,25 +10356,25 @@ var PlanningView = ({
|
|
|
9607
10356
|
onUpdateSprint,
|
|
9608
10357
|
onDeleteSprint
|
|
9609
10358
|
}) => {
|
|
9610
|
-
const [selectedSprintIds, setSelectedSprintIds] = (0,
|
|
9611
|
-
const [collapsedEpics, setCollapsedEpics] = (0,
|
|
9612
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
9613
|
-
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0,
|
|
9614
|
-
const [dragOverTarget, setDragOverTarget] = (0,
|
|
9615
|
-
const [editingSprintId, setEditingSprintId] = (0,
|
|
9616
|
-
const [sprintEditForm, setSprintEditForm] = (0,
|
|
10359
|
+
const [selectedSprintIds, setSelectedSprintIds] = (0, import_react30.useState)([]);
|
|
10360
|
+
const [collapsedEpics, setCollapsedEpics] = (0, import_react30.useState)(/* @__PURE__ */ new Set());
|
|
10361
|
+
const [draggedTask, setDraggedTask] = (0, import_react30.useState)(null);
|
|
10362
|
+
const [isAddSprintModalOpen, setIsAddSprintModalOpen] = (0, import_react30.useState)(false);
|
|
10363
|
+
const [dragOverTarget, setDragOverTarget] = (0, import_react30.useState)(null);
|
|
10364
|
+
const [editingSprintId, setEditingSprintId] = (0, import_react30.useState)(null);
|
|
10365
|
+
const [sprintEditForm, setSprintEditForm] = (0, import_react30.useState)({
|
|
9617
10366
|
name: "",
|
|
9618
10367
|
description: "",
|
|
9619
10368
|
startDate: "",
|
|
9620
10369
|
endDate: ""
|
|
9621
10370
|
});
|
|
9622
|
-
const [availableSprints, setAvailableSprints] = (0,
|
|
9623
|
-
const [sprintFilter, setSprintFilter] = (0,
|
|
9624
|
-
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0,
|
|
9625
|
-
const [heroHeight, setHeroHeight] = (0,
|
|
9626
|
-
const heroRef = (0,
|
|
9627
|
-
const containerRef = (0,
|
|
9628
|
-
(0,
|
|
10371
|
+
const [availableSprints, setAvailableSprints] = (0, import_react30.useState)([]);
|
|
10372
|
+
const [sprintFilter, setSprintFilter] = (0, import_react30.useState)("upcoming");
|
|
10373
|
+
const [isSprintSelectorOpen, setIsSprintSelectorOpen] = (0, import_react30.useState)(false);
|
|
10374
|
+
const [heroHeight, setHeroHeight] = (0, import_react30.useState)(0);
|
|
10375
|
+
const heroRef = (0, import_react30.useRef)(null);
|
|
10376
|
+
const containerRef = (0, import_react30.useRef)(null);
|
|
10377
|
+
(0, import_react30.useEffect)(() => {
|
|
9629
10378
|
const savedSprintIds = localStorage.getItem("planningView_selectedSprints");
|
|
9630
10379
|
if (savedSprintIds) {
|
|
9631
10380
|
try {
|
|
@@ -9638,10 +10387,10 @@ var PlanningView = ({
|
|
|
9638
10387
|
}
|
|
9639
10388
|
}
|
|
9640
10389
|
}, []);
|
|
9641
|
-
(0,
|
|
10390
|
+
(0, import_react30.useEffect)(() => {
|
|
9642
10391
|
localStorage.setItem("planningView_selectedSprints", JSON.stringify(selectedSprintIds));
|
|
9643
10392
|
}, [selectedSprintIds]);
|
|
9644
|
-
(0,
|
|
10393
|
+
(0, import_react30.useEffect)(() => {
|
|
9645
10394
|
const updateHeroHeight = () => {
|
|
9646
10395
|
if (heroRef.current) {
|
|
9647
10396
|
setHeroHeight(heroRef.current.offsetHeight);
|
|
@@ -9702,7 +10451,7 @@ var PlanningView = ({
|
|
|
9702
10451
|
});
|
|
9703
10452
|
return { tasksByEpic, unassignedTasks };
|
|
9704
10453
|
};
|
|
9705
|
-
(0,
|
|
10454
|
+
(0, import_react30.useEffect)(() => {
|
|
9706
10455
|
setAvailableSprints(sprints);
|
|
9707
10456
|
}, [sprints]);
|
|
9708
10457
|
const displayedSprints = availableSprints.filter((sprint) => {
|
|
@@ -9825,7 +10574,7 @@ var PlanningView = ({
|
|
|
9825
10574
|
e.dataTransfer.setData("text/plain", task.id.toString());
|
|
9826
10575
|
handleDragStart(e, task);
|
|
9827
10576
|
};
|
|
9828
|
-
return /* @__PURE__ */ (0,
|
|
10577
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9829
10578
|
Card,
|
|
9830
10579
|
{
|
|
9831
10580
|
className: "p-3 cursor-grab active:cursor-grabbing hover:shadow-md transition-all duration-200 border border-border bg-card hover:bg-accent/50",
|
|
@@ -9833,28 +10582,28 @@ var PlanningView = ({
|
|
|
9833
10582
|
onDragStart: handleCardDragStart,
|
|
9834
10583
|
onClick: handleCardClick,
|
|
9835
10584
|
style: { userSelect: "none" },
|
|
9836
|
-
children: /* @__PURE__ */ (0,
|
|
9837
|
-
/* @__PURE__ */ (0,
|
|
9838
|
-
/* @__PURE__ */ (0,
|
|
9839
|
-
/* @__PURE__ */ (0,
|
|
10585
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2 pointer-events-none", children: [
|
|
10586
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-start justify-between gap-2", children: [
|
|
10587
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h4", { className: "font-medium text-sm text-foreground line-clamp-1", children: task.name }),
|
|
10588
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Badge, { className: `text-xs ${getPriorityColor(task.priority || "medium")}`, children: task.priority?.[0]?.toUpperCase() })
|
|
9840
10589
|
] }),
|
|
9841
|
-
/* @__PURE__ */ (0,
|
|
9842
|
-
/* @__PURE__ */ (0,
|
|
9843
|
-
epic && /* @__PURE__ */ (0,
|
|
9844
|
-
/* @__PURE__ */ (0,
|
|
10590
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between text-xs", children: [
|
|
10591
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-1", children: [
|
|
10592
|
+
epic && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: `w-2 h-2 rounded-full ${epic.color}` }),
|
|
10593
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-muted-foreground truncate", children: epic?.name })
|
|
9845
10594
|
] }),
|
|
9846
|
-
/* @__PURE__ */ (0,
|
|
10595
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-muted-foreground", children: getDisplayName(task.assignee?.value?.name) })
|
|
9847
10596
|
] }),
|
|
9848
|
-
showSprint && sprint && /* @__PURE__ */ (0,
|
|
9849
|
-
/* @__PURE__ */ (0,
|
|
9850
|
-
/* @__PURE__ */ (0,
|
|
10597
|
+
showSprint && sprint && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-1 text-xs text-muted-foreground", children: [
|
|
10598
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Calendar, { className: "h-3 w-3" }),
|
|
10599
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { children: sprint.name })
|
|
9851
10600
|
] })
|
|
9852
10601
|
] })
|
|
9853
10602
|
}
|
|
9854
10603
|
);
|
|
9855
10604
|
};
|
|
9856
|
-
return /* @__PURE__ */ (0,
|
|
9857
|
-
/* @__PURE__ */ (0,
|
|
10605
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { ref: containerRef, className: "h-full flex flex-col px-2 md:px-4 py-4", children: [
|
|
10606
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { ref: heroRef, className: "flex-shrink-0", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9858
10607
|
DashboardHero,
|
|
9859
10608
|
{
|
|
9860
10609
|
title: "Sprint Planning",
|
|
@@ -9866,7 +10615,7 @@ var PlanningView = ({
|
|
|
9866
10615
|
}
|
|
9867
10616
|
}
|
|
9868
10617
|
) }),
|
|
9869
|
-
/* @__PURE__ */ (0,
|
|
10618
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex-1 min-h-0 mt-8", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
9870
10619
|
"div",
|
|
9871
10620
|
{
|
|
9872
10621
|
className: "h-full",
|
|
@@ -9874,30 +10623,30 @@ var PlanningView = ({
|
|
|
9874
10623
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 120}px)` : "calc(100vh - 12rem)"
|
|
9875
10624
|
},
|
|
9876
10625
|
children: [
|
|
9877
|
-
/* @__PURE__ */ (0,
|
|
9878
|
-
/* @__PURE__ */ (0,
|
|
9879
|
-
/* @__PURE__ */ (0,
|
|
9880
|
-
/* @__PURE__ */ (0,
|
|
9881
|
-
/* @__PURE__ */ (0,
|
|
9882
|
-
/* @__PURE__ */ (0,
|
|
10626
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "mb-4", children: [
|
|
10627
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(Card, { className: "p-3 bg-card shadow-sm", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
10628
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-3", children: [
|
|
10629
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { children: [
|
|
10630
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h3", { className: "font-semibold text-foreground text-sm", children: "Sprint Board" }),
|
|
10631
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("p", { className: "text-xs text-muted-foreground", children: [
|
|
9883
10632
|
selectedSprintIds?.length,
|
|
9884
10633
|
"/3 selected"
|
|
9885
10634
|
] })
|
|
9886
10635
|
] }),
|
|
9887
|
-
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0,
|
|
9888
|
-
/* @__PURE__ */ (0,
|
|
9889
|
-
/* @__PURE__ */ (0,
|
|
10636
|
+
selectedSprintIds?.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
10637
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "text-xs text-muted-foreground", children: "Viewing:" }),
|
|
10638
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex flex-wrap gap-1", children: visibleSprints.map((sprint) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
9890
10639
|
"div",
|
|
9891
10640
|
{
|
|
9892
10641
|
className: "flex items-center gap-1 bg-primary/10 text-primary px-2 py-0.5 rounded text-xs",
|
|
9893
10642
|
children: [
|
|
9894
|
-
/* @__PURE__ */ (0,
|
|
9895
|
-
/* @__PURE__ */ (0,
|
|
10643
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "max-w-[80px] truncate", children: sprint.name }),
|
|
10644
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9896
10645
|
"button",
|
|
9897
10646
|
{
|
|
9898
10647
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
9899
10648
|
className: "ml-0.5 hover:bg-primary/20 h-8 rounded p-0.5",
|
|
9900
|
-
children: /* @__PURE__ */ (0,
|
|
10649
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.X, { className: "h-4 w-4" })
|
|
9901
10650
|
}
|
|
9902
10651
|
)
|
|
9903
10652
|
]
|
|
@@ -9906,20 +10655,20 @@ var PlanningView = ({
|
|
|
9906
10655
|
)) })
|
|
9907
10656
|
] })
|
|
9908
10657
|
] }),
|
|
9909
|
-
/* @__PURE__ */ (0,
|
|
9910
|
-
/* @__PURE__ */ (0,
|
|
10658
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
10659
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
9911
10660
|
Button,
|
|
9912
10661
|
{
|
|
9913
10662
|
onClick: () => setIsAddSprintModalOpen(true),
|
|
9914
10663
|
className: "bg-primary hover:bg-primary/90 text-primary-foreground gap-1",
|
|
9915
10664
|
size: "sm",
|
|
9916
10665
|
children: [
|
|
9917
|
-
/* @__PURE__ */ (0,
|
|
10666
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Plus, { className: "h-3 w-3" }),
|
|
9918
10667
|
"Add"
|
|
9919
10668
|
]
|
|
9920
10669
|
}
|
|
9921
10670
|
),
|
|
9922
|
-
/* @__PURE__ */ (0,
|
|
10671
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
9923
10672
|
Button,
|
|
9924
10673
|
{
|
|
9925
10674
|
onClick: () => setIsSprintSelectorOpen(!isSprintSelectorOpen),
|
|
@@ -9927,43 +10676,43 @@ var PlanningView = ({
|
|
|
9927
10676
|
size: "sm",
|
|
9928
10677
|
className: "gap-1",
|
|
9929
10678
|
children: [
|
|
9930
|
-
/* @__PURE__ */ (0,
|
|
10679
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Calendar, { className: "h-3 w-3" }),
|
|
9931
10680
|
isSprintSelectorOpen ? "Close" : "Select"
|
|
9932
10681
|
]
|
|
9933
10682
|
}
|
|
9934
10683
|
)
|
|
9935
10684
|
] })
|
|
9936
10685
|
] }) }),
|
|
9937
|
-
isSprintSelectorOpen && /* @__PURE__ */ (0,
|
|
10686
|
+
isSprintSelectorOpen && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9938
10687
|
"div",
|
|
9939
10688
|
{
|
|
9940
10689
|
className: "fixed inset-0 bg-black/20 z-[5]",
|
|
9941
10690
|
onClick: () => setIsSprintSelectorOpen(false)
|
|
9942
10691
|
}
|
|
9943
10692
|
),
|
|
9944
|
-
/* @__PURE__ */ (0,
|
|
10693
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9945
10694
|
"div",
|
|
9946
10695
|
{
|
|
9947
10696
|
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"}`,
|
|
9948
|
-
children: /* @__PURE__ */ (0,
|
|
9949
|
-
/* @__PURE__ */ (0,
|
|
9950
|
-
/* @__PURE__ */ (0,
|
|
9951
|
-
/* @__PURE__ */ (0,
|
|
9952
|
-
/* @__PURE__ */ (0,
|
|
10697
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Card, { className: "h-full rounded-none border-0 flex flex-col", children: [
|
|
10698
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "p-4 border-b bg-muted/30 flex-shrink-0", children: [
|
|
10699
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between", children: [
|
|
10700
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h3", { className: "font-semibold text-foreground text-base", children: "Select Sprints" }),
|
|
10701
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
9953
10702
|
Button,
|
|
9954
10703
|
{
|
|
9955
10704
|
variant: "ghost",
|
|
9956
10705
|
size: "sm",
|
|
9957
10706
|
onClick: () => setIsSprintSelectorOpen(false),
|
|
9958
10707
|
className: "h-8 w-8 p-0",
|
|
9959
|
-
children: /* @__PURE__ */ (0,
|
|
10708
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.X, { className: "h-4 w-4" })
|
|
9960
10709
|
}
|
|
9961
10710
|
)
|
|
9962
10711
|
] }),
|
|
9963
|
-
/* @__PURE__ */ (0,
|
|
10712
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-sm text-muted-foreground mt-1", children: "Choose up to 3 sprints to view in your planning board" })
|
|
9964
10713
|
] }),
|
|
9965
|
-
/* @__PURE__ */ (0,
|
|
9966
|
-
/* @__PURE__ */ (0,
|
|
10714
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex flex-col flex-1 p-4 min-h-0", children: [
|
|
10715
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex gap-1 mb-4 bg-muted p-1 rounded-lg", children: [
|
|
9967
10716
|
{ key: "all", label: "All", count: sprints.length },
|
|
9968
10717
|
{
|
|
9969
10718
|
key: "active",
|
|
@@ -9975,7 +10724,7 @@ var PlanningView = ({
|
|
|
9975
10724
|
label: "Upcoming"
|
|
9976
10725
|
// count: sprints.filter((s) => !s.isActive).length,
|
|
9977
10726
|
}
|
|
9978
|
-
].map((filter) => /* @__PURE__ */ (0,
|
|
10727
|
+
].map((filter) => /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
9979
10728
|
Button,
|
|
9980
10729
|
{
|
|
9981
10730
|
variant: sprintFilter === filter.key ? "default" : "outline",
|
|
@@ -9991,18 +10740,18 @@ var PlanningView = ({
|
|
|
9991
10740
|
},
|
|
9992
10741
|
filter.key
|
|
9993
10742
|
)) }),
|
|
9994
|
-
/* @__PURE__ */ (0,
|
|
10743
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "space-y-2 flex-1 overflow-y-auto", children: displayedSprints.length > 0 ? displayedSprints.map((sprint) => {
|
|
9995
10744
|
const isSelected = selectedSprintIds.includes(sprint.id.toString());
|
|
9996
10745
|
const taskCount = tasks.filter(
|
|
9997
10746
|
(task) => extractId(task.sprint) === sprint.id
|
|
9998
10747
|
).length;
|
|
9999
10748
|
const canSelect = !isSelected && selectedSprintIds.length < 3;
|
|
10000
|
-
return /* @__PURE__ */ (0,
|
|
10749
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10001
10750
|
"div",
|
|
10002
10751
|
{
|
|
10003
10752
|
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"}`,
|
|
10004
|
-
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0,
|
|
10005
|
-
/* @__PURE__ */ (0,
|
|
10753
|
+
children: editingSprintId === sprint.id.toString() ? /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-3", children: [
|
|
10754
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10006
10755
|
Input,
|
|
10007
10756
|
{
|
|
10008
10757
|
value: sprintEditForm.name,
|
|
@@ -10011,7 +10760,7 @@ var PlanningView = ({
|
|
|
10011
10760
|
placeholder: "Sprint name"
|
|
10012
10761
|
}
|
|
10013
10762
|
),
|
|
10014
|
-
/* @__PURE__ */ (0,
|
|
10763
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10015
10764
|
Textarea,
|
|
10016
10765
|
{
|
|
10017
10766
|
value: sprintEditForm.description,
|
|
@@ -10023,10 +10772,10 @@ var PlanningView = ({
|
|
|
10023
10772
|
placeholder: "Sprint description"
|
|
10024
10773
|
}
|
|
10025
10774
|
),
|
|
10026
|
-
/* @__PURE__ */ (0,
|
|
10027
|
-
/* @__PURE__ */ (0,
|
|
10028
|
-
/* @__PURE__ */ (0,
|
|
10029
|
-
/* @__PURE__ */ (0,
|
|
10775
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "grid grid-cols-2 gap-2", children: [
|
|
10776
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { children: [
|
|
10777
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "Start Date" }),
|
|
10778
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10030
10779
|
Input,
|
|
10031
10780
|
{
|
|
10032
10781
|
type: "date",
|
|
@@ -10039,9 +10788,9 @@ var PlanningView = ({
|
|
|
10039
10788
|
}
|
|
10040
10789
|
)
|
|
10041
10790
|
] }),
|
|
10042
|
-
/* @__PURE__ */ (0,
|
|
10043
|
-
/* @__PURE__ */ (0,
|
|
10044
|
-
/* @__PURE__ */ (0,
|
|
10791
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { children: [
|
|
10792
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("label", { className: "text-xs text-muted-foreground block mb-1", children: "End Date" }),
|
|
10793
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10045
10794
|
Input,
|
|
10046
10795
|
{
|
|
10047
10796
|
type: "date",
|
|
@@ -10055,20 +10804,20 @@ var PlanningView = ({
|
|
|
10055
10804
|
)
|
|
10056
10805
|
] })
|
|
10057
10806
|
] }),
|
|
10058
|
-
/* @__PURE__ */ (0,
|
|
10059
|
-
/* @__PURE__ */ (0,
|
|
10807
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex gap-2", children: [
|
|
10808
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10060
10809
|
Button,
|
|
10061
10810
|
{
|
|
10062
10811
|
size: "sm",
|
|
10063
10812
|
onClick: () => handleSprintEditSave(),
|
|
10064
10813
|
className: "flex-1",
|
|
10065
10814
|
children: [
|
|
10066
|
-
/* @__PURE__ */ (0,
|
|
10815
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Check, { className: "h-3 w-3 mr-1" }),
|
|
10067
10816
|
"Save"
|
|
10068
10817
|
]
|
|
10069
10818
|
}
|
|
10070
10819
|
),
|
|
10071
|
-
/* @__PURE__ */ (0,
|
|
10820
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10072
10821
|
Button,
|
|
10073
10822
|
{
|
|
10074
10823
|
size: "sm",
|
|
@@ -10076,18 +10825,18 @@ var PlanningView = ({
|
|
|
10076
10825
|
onClick: handleSprintEditCancel,
|
|
10077
10826
|
className: "flex-1",
|
|
10078
10827
|
children: [
|
|
10079
|
-
/* @__PURE__ */ (0,
|
|
10828
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.X, { className: "h-3 w-3 mr-1" }),
|
|
10080
10829
|
"Cancel"
|
|
10081
10830
|
]
|
|
10082
10831
|
}
|
|
10083
10832
|
)
|
|
10084
10833
|
] })
|
|
10085
|
-
] }) : /* @__PURE__ */ (0,
|
|
10086
|
-
/* @__PURE__ */ (0,
|
|
10087
|
-
/* @__PURE__ */ (0,
|
|
10088
|
-
/* @__PURE__ */ (0,
|
|
10089
|
-
/* @__PURE__ */ (0,
|
|
10090
|
-
isSprintActive(sprint) && /* @__PURE__ */ (0,
|
|
10834
|
+
] }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { children: [
|
|
10835
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
10836
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex-1 min-w-0", children: [
|
|
10837
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
10838
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h4", { className: "font-medium text-sm text-foreground truncate", children: sprint.name }),
|
|
10839
|
+
isSprintActive(sprint) && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10091
10840
|
Badge,
|
|
10092
10841
|
{
|
|
10093
10842
|
variant: "default",
|
|
@@ -10096,43 +10845,43 @@ var PlanningView = ({
|
|
|
10096
10845
|
}
|
|
10097
10846
|
)
|
|
10098
10847
|
] }),
|
|
10099
|
-
/* @__PURE__ */ (0,
|
|
10100
|
-
/* @__PURE__ */ (0,
|
|
10101
|
-
/* @__PURE__ */ (0,
|
|
10102
|
-
/* @__PURE__ */ (0,
|
|
10848
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-xs text-muted-foreground line-clamp-2 mb-2", children: sprint.description }),
|
|
10849
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-3 text-xs text-muted-foreground", children: [
|
|
10850
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
10851
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.CalendarDays, { className: "h-3 w-3" }),
|
|
10103
10852
|
new Date(sprint.startDate).toLocaleDateString()
|
|
10104
10853
|
] }),
|
|
10105
|
-
/* @__PURE__ */ (0,
|
|
10106
|
-
/* @__PURE__ */ (0,
|
|
10854
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "flex items-center gap-1", children: [
|
|
10855
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.User, { className: "h-3 w-3" }),
|
|
10107
10856
|
taskCount,
|
|
10108
10857
|
" tasks"
|
|
10109
10858
|
] })
|
|
10110
10859
|
] })
|
|
10111
10860
|
] }),
|
|
10112
|
-
/* @__PURE__ */ (0,
|
|
10113
|
-
/* @__PURE__ */ (0,
|
|
10861
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-1 ml-2", children: [
|
|
10862
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10114
10863
|
Button,
|
|
10115
10864
|
{
|
|
10116
10865
|
size: "sm",
|
|
10117
10866
|
variant: "ghost",
|
|
10118
10867
|
onClick: () => handleSprintEditStart(sprint),
|
|
10119
10868
|
className: "h-6 w-6 p-0",
|
|
10120
|
-
children: /* @__PURE__ */ (0,
|
|
10869
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Edit2, { className: "h-3 w-3" })
|
|
10121
10870
|
}
|
|
10122
10871
|
),
|
|
10123
|
-
/* @__PURE__ */ (0,
|
|
10872
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10124
10873
|
Button,
|
|
10125
10874
|
{
|
|
10126
10875
|
size: "sm",
|
|
10127
10876
|
variant: "ghost",
|
|
10128
10877
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
10129
10878
|
className: "h-6 w-6 p-0 text-destructive hover:text-destructive",
|
|
10130
|
-
children: /* @__PURE__ */ (0,
|
|
10879
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Trash2, { className: "h-3 w-3" })
|
|
10131
10880
|
}
|
|
10132
10881
|
)
|
|
10133
10882
|
] })
|
|
10134
10883
|
] }),
|
|
10135
|
-
/* @__PURE__ */ (0,
|
|
10884
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex items-center justify-between mt-2", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10136
10885
|
Button,
|
|
10137
10886
|
{
|
|
10138
10887
|
variant: isSelected ? "default" : "outline",
|
|
@@ -10140,21 +10889,21 @@ var PlanningView = ({
|
|
|
10140
10889
|
className: "text-xs w-full h-8 flex items-center justify-center cursor-pointer",
|
|
10141
10890
|
onClick: () => toggleSprintView(sprint.id.toString()),
|
|
10142
10891
|
disabled: !isSelected && selectedSprintIds?.length >= 3,
|
|
10143
|
-
children: /* @__PURE__ */ (0,
|
|
10892
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "pointer-events-none select-none", children: isSelected ? "Deselect" : selectedSprintIds?.length >= 3 ? "Limit Reached" : "Select" })
|
|
10144
10893
|
}
|
|
10145
10894
|
) })
|
|
10146
10895
|
] })
|
|
10147
10896
|
},
|
|
10148
10897
|
sprint.id
|
|
10149
10898
|
);
|
|
10150
|
-
}) : /* @__PURE__ */ (0,
|
|
10151
|
-
/* @__PURE__ */ (0,
|
|
10152
|
-
/* @__PURE__ */ (0,
|
|
10899
|
+
}) : /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "text-center py-8 text-muted-foreground", children: [
|
|
10900
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Calendar, { className: "h-8 w-8 mx-auto mb-2 opacity-50" }),
|
|
10901
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("p", { className: "text-sm", children: [
|
|
10153
10902
|
'No sprints found for "',
|
|
10154
10903
|
sprintFilter,
|
|
10155
10904
|
'" filter'
|
|
10156
10905
|
] }),
|
|
10157
|
-
/* @__PURE__ */ (0,
|
|
10906
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10158
10907
|
Button,
|
|
10159
10908
|
{
|
|
10160
10909
|
variant: "link",
|
|
@@ -10165,18 +10914,18 @@ var PlanningView = ({
|
|
|
10165
10914
|
}
|
|
10166
10915
|
)
|
|
10167
10916
|
] }) }),
|
|
10168
|
-
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0,
|
|
10169
|
-
/* @__PURE__ */ (0,
|
|
10170
|
-
/* @__PURE__ */ (0,
|
|
10171
|
-
/* @__PURE__ */ (0,
|
|
10917
|
+
selectedSprintIds?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "mt-4 p-4 bg-muted/50 rounded-lg border-2 border-dashed border-border", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "text-center", children: [
|
|
10918
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Calendar, { className: "h-6 w-6 mx-auto mb-2 text-muted-foreground" }),
|
|
10919
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-sm text-muted-foreground font-medium", children: "Select sprints to start planning" }),
|
|
10920
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("p", { className: "text-xs text-muted-foreground mt-1", children: "Choose up to 3 sprints to view alongside your backlog" })
|
|
10172
10921
|
] }) })
|
|
10173
10922
|
] })
|
|
10174
10923
|
] })
|
|
10175
10924
|
}
|
|
10176
10925
|
)
|
|
10177
10926
|
] }),
|
|
10178
|
-
/* @__PURE__ */ (0,
|
|
10179
|
-
/* @__PURE__ */ (0,
|
|
10927
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "grid grid-cols-1 lg:grid-cols-4 gap-6 h-full flex-1 min-h-0", children: [
|
|
10928
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "lg:col-span-1", children: /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10180
10929
|
Card,
|
|
10181
10930
|
{
|
|
10182
10931
|
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",
|
|
@@ -10188,78 +10937,78 @@ var PlanningView = ({
|
|
|
10188
10937
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
10189
10938
|
},
|
|
10190
10939
|
children: [
|
|
10191
|
-
/* @__PURE__ */ (0,
|
|
10192
|
-
/* @__PURE__ */ (0,
|
|
10193
|
-
/* @__PURE__ */ (0,
|
|
10194
|
-
/* @__PURE__ */ (0,
|
|
10940
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
10941
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: "Backlog" }),
|
|
10942
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
10943
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Badge, { variant: "secondary", className: "bg-muted text-muted-foreground", children: [
|
|
10195
10944
|
backlogTasks?.length,
|
|
10196
10945
|
" tasks"
|
|
10197
10946
|
] }),
|
|
10198
|
-
/* @__PURE__ */ (0,
|
|
10947
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(Badge, { variant: "outline", className: "bg-gray-50 text-gray-700 border-gray-200", children: [
|
|
10199
10948
|
backlogStoryPoints,
|
|
10200
10949
|
" pts"
|
|
10201
10950
|
] })
|
|
10202
10951
|
] })
|
|
10203
10952
|
] }),
|
|
10204
|
-
/* @__PURE__ */ (0,
|
|
10953
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10205
10954
|
"div",
|
|
10206
10955
|
{
|
|
10207
10956
|
className: `flex-1 overflow-y-auto space-y-3 min-h-0 p-3 rounded transition-colors ${dragOverTarget === "backlog" ? "bg-primary/10" : ""}`,
|
|
10208
10957
|
children: (() => {
|
|
10209
10958
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(backlogTasks);
|
|
10210
|
-
return /* @__PURE__ */ (0,
|
|
10959
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
|
|
10211
10960
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
10212
10961
|
const epic = getEpicById(epicId);
|
|
10213
10962
|
if (!epic) return null;
|
|
10214
10963
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
10215
|
-
return /* @__PURE__ */ (0,
|
|
10216
|
-
/* @__PURE__ */ (0,
|
|
10964
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2", children: [
|
|
10965
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10217
10966
|
"div",
|
|
10218
10967
|
{
|
|
10219
10968
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
10220
10969
|
onClick: () => toggleEpicCollapse(epicId),
|
|
10221
10970
|
children: [
|
|
10222
|
-
/* @__PURE__ */ (0,
|
|
10223
|
-
/* @__PURE__ */ (0,
|
|
10224
|
-
/* @__PURE__ */ (0,
|
|
10971
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
10972
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
10973
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
10225
10974
|
"(",
|
|
10226
10975
|
epicTasks?.length,
|
|
10227
10976
|
")"
|
|
10228
10977
|
] }),
|
|
10229
|
-
/* @__PURE__ */ (0,
|
|
10978
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
10230
10979
|
]
|
|
10231
10980
|
}
|
|
10232
10981
|
),
|
|
10233
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
10982
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks.map((task) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
10234
10983
|
] }, epicId);
|
|
10235
10984
|
}),
|
|
10236
10985
|
unassignedTasks?.length > 0 && (() => {
|
|
10237
10986
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
10238
|
-
return /* @__PURE__ */ (0,
|
|
10239
|
-
/* @__PURE__ */ (0,
|
|
10987
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2", children: [
|
|
10988
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10240
10989
|
"div",
|
|
10241
10990
|
{
|
|
10242
10991
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
10243
10992
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
10244
10993
|
children: [
|
|
10245
|
-
/* @__PURE__ */ (0,
|
|
10246
|
-
/* @__PURE__ */ (0,
|
|
10247
|
-
/* @__PURE__ */ (0,
|
|
10994
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
10995
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
10996
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
10248
10997
|
"(",
|
|
10249
10998
|
unassignedTasks?.length,
|
|
10250
10999
|
")"
|
|
10251
11000
|
] }),
|
|
10252
|
-
/* @__PURE__ */ (0,
|
|
11001
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
10253
11002
|
]
|
|
10254
11003
|
}
|
|
10255
11004
|
),
|
|
10256
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
11005
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
10257
11006
|
] });
|
|
10258
11007
|
})(),
|
|
10259
|
-
backlogTasks?.length === 0 && /* @__PURE__ */ (0,
|
|
10260
|
-
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0,
|
|
10261
|
-
/* @__PURE__ */ (0,
|
|
10262
|
-
backlogTasks?.map((task) => /* @__PURE__ */ (0,
|
|
11008
|
+
backlogTasks?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime57.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" }),
|
|
11009
|
+
backlogTasks?.length > 0 && Object.keys(tasksByEpic).length === 0 && unassignedTasks.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2", children: [
|
|
11010
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "text-xs text-muted-foreground mb-2", children: "Direct backlog tasks:" }),
|
|
11011
|
+
backlogTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CompactTaskCard, { task }, task.id))
|
|
10263
11012
|
] })
|
|
10264
11013
|
] });
|
|
10265
11014
|
})()
|
|
@@ -10276,7 +11025,7 @@ var PlanningView = ({
|
|
|
10276
11025
|
(sum, task) => sum + (task?.storyPoints || 0),
|
|
10277
11026
|
0
|
|
10278
11027
|
);
|
|
10279
|
-
return /* @__PURE__ */ (0,
|
|
11028
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10280
11029
|
Card,
|
|
10281
11030
|
{
|
|
10282
11031
|
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",
|
|
@@ -10288,10 +11037,10 @@ var PlanningView = ({
|
|
|
10288
11037
|
height: heroHeight > 0 ? `calc(100vh - ${heroHeight + 200}px)` : "calc(100vh - 16rem)"
|
|
10289
11038
|
},
|
|
10290
11039
|
children: [
|
|
10291
|
-
/* @__PURE__ */ (0,
|
|
10292
|
-
/* @__PURE__ */ (0,
|
|
10293
|
-
/* @__PURE__ */ (0,
|
|
10294
|
-
/* @__PURE__ */ (0,
|
|
11040
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center justify-between mb-4 flex-shrink-0", children: [
|
|
11041
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("h3", { className: "font-semibold text-foreground select-none text-lg", children: sprint.name }) }),
|
|
11042
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "flex items-center gap-2", children: [
|
|
11043
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10295
11044
|
Badge,
|
|
10296
11045
|
{
|
|
10297
11046
|
variant: "secondary",
|
|
@@ -10302,7 +11051,7 @@ var PlanningView = ({
|
|
|
10302
11051
|
]
|
|
10303
11052
|
}
|
|
10304
11053
|
),
|
|
10305
|
-
/* @__PURE__ */ (0,
|
|
11054
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10306
11055
|
Badge,
|
|
10307
11056
|
{
|
|
10308
11057
|
variant: "outline",
|
|
@@ -10313,7 +11062,7 @@ var PlanningView = ({
|
|
|
10313
11062
|
]
|
|
10314
11063
|
}
|
|
10315
11064
|
),
|
|
10316
|
-
/* @__PURE__ */ (0,
|
|
11065
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10317
11066
|
Button,
|
|
10318
11067
|
{
|
|
10319
11068
|
size: "sm",
|
|
@@ -10323,73 +11072,73 @@ var PlanningView = ({
|
|
|
10323
11072
|
handleSprintEditStart(sprint);
|
|
10324
11073
|
},
|
|
10325
11074
|
className: "h-6 px-2",
|
|
10326
|
-
children: /* @__PURE__ */ (0,
|
|
11075
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Edit2, { className: "h-3 w-3" })
|
|
10327
11076
|
}
|
|
10328
11077
|
),
|
|
10329
|
-
/* @__PURE__ */ (0,
|
|
11078
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10330
11079
|
Button,
|
|
10331
11080
|
{
|
|
10332
11081
|
size: "sm",
|
|
10333
11082
|
variant: "ghost",
|
|
10334
11083
|
onClick: () => onDeleteSprint(sprint.id.toString()),
|
|
10335
11084
|
className: "h-6 px-2 text-destructive hover:text-destructive",
|
|
10336
|
-
children: /* @__PURE__ */ (0,
|
|
11085
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.Trash2, { className: "h-3 w-3" })
|
|
10337
11086
|
}
|
|
10338
11087
|
)
|
|
10339
11088
|
] })
|
|
10340
11089
|
] }),
|
|
10341
|
-
/* @__PURE__ */ (0,
|
|
11090
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex-1 overflow-y-auto space-y-3 min-h-0", children: (() => {
|
|
10342
11091
|
const { tasksByEpic, unassignedTasks } = getTasksByEpic(sprintTasksFiltered);
|
|
10343
|
-
return /* @__PURE__ */ (0,
|
|
11092
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(import_jsx_runtime57.Fragment, { children: [
|
|
10344
11093
|
Object.entries(tasksByEpic).map(([epicId, epicTasks]) => {
|
|
10345
11094
|
const epic = getEpicById(epicId);
|
|
10346
11095
|
if (!epic) return null;
|
|
10347
11096
|
const isCollapsed = collapsedEpics.has(epicId);
|
|
10348
|
-
return /* @__PURE__ */ (0,
|
|
10349
|
-
/* @__PURE__ */ (0,
|
|
11097
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2", children: [
|
|
11098
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10350
11099
|
"div",
|
|
10351
11100
|
{
|
|
10352
11101
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
10353
11102
|
onClick: () => toggleEpicCollapse(epicId),
|
|
10354
11103
|
children: [
|
|
10355
|
-
/* @__PURE__ */ (0,
|
|
10356
|
-
/* @__PURE__ */ (0,
|
|
10357
|
-
/* @__PURE__ */ (0,
|
|
11104
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: `w-3 h-3 rounded-full ${epic.color}` }),
|
|
11105
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "font-medium text-muted-foreground", children: epic.name }),
|
|
11106
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
10358
11107
|
"(",
|
|
10359
11108
|
epicTasks?.length,
|
|
10360
11109
|
")"
|
|
10361
11110
|
] }),
|
|
10362
|
-
/* @__PURE__ */ (0,
|
|
11111
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
10363
11112
|
]
|
|
10364
11113
|
}
|
|
10365
11114
|
),
|
|
10366
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
11115
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "space-y-2 pl-2", children: epicTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
10367
11116
|
] }, epicId);
|
|
10368
11117
|
}),
|
|
10369
11118
|
unassignedTasks?.length > 0 && (() => {
|
|
10370
11119
|
const isCollapsed = collapsedEpics.has("no-epic");
|
|
10371
|
-
return /* @__PURE__ */ (0,
|
|
10372
|
-
/* @__PURE__ */ (0,
|
|
11120
|
+
return /* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("div", { className: "space-y-2", children: [
|
|
11121
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)(
|
|
10373
11122
|
"div",
|
|
10374
11123
|
{
|
|
10375
11124
|
className: "flex items-center gap-2 px-2 py-1 bg-muted/50 rounded text-xs cursor-pointer hover:bg-muted/70 transition-colors",
|
|
10376
11125
|
onClick: () => toggleEpicCollapse("no-epic"),
|
|
10377
11126
|
children: [
|
|
10378
|
-
/* @__PURE__ */ (0,
|
|
10379
|
-
/* @__PURE__ */ (0,
|
|
10380
|
-
/* @__PURE__ */ (0,
|
|
11127
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "w-3 h-3 rounded-full bg-gray-400" }),
|
|
11128
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("span", { className: "font-medium text-muted-foreground", children: "No Epic" }),
|
|
11129
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsxs)("span", { className: "text-muted-foreground", children: [
|
|
10381
11130
|
"(",
|
|
10382
11131
|
unassignedTasks?.length,
|
|
10383
11132
|
")"
|
|
10384
11133
|
] }),
|
|
10385
|
-
/* @__PURE__ */ (0,
|
|
11134
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "ml-auto", children: isCollapsed ? /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronDown, { className: "h-3 w-3 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(import_lucide_react27.ChevronUp, { className: "h-3 w-3 text-muted-foreground" }) })
|
|
10386
11135
|
]
|
|
10387
11136
|
}
|
|
10388
11137
|
),
|
|
10389
|
-
!isCollapsed && /* @__PURE__ */ (0,
|
|
11138
|
+
!isCollapsed && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "space-y-2 pl-2", children: unassignedTasks?.map((task) => /* @__PURE__ */ (0, import_jsx_runtime57.jsx)(CompactTaskCard, { task }, task.id)) })
|
|
10390
11139
|
] });
|
|
10391
11140
|
})(),
|
|
10392
|
-
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0,
|
|
11141
|
+
sprintTasksFiltered?.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime57.jsx)("div", { className: "flex items-center justify-center h-32 text-muted-foreground text-sm select-none", children: "Drop tasks here" })
|
|
10393
11142
|
] });
|
|
10394
11143
|
})() })
|
|
10395
11144
|
]
|
|
@@ -10398,7 +11147,7 @@ var PlanningView = ({
|
|
|
10398
11147
|
);
|
|
10399
11148
|
})
|
|
10400
11149
|
] }),
|
|
10401
|
-
/* @__PURE__ */ (0,
|
|
11150
|
+
/* @__PURE__ */ (0, import_jsx_runtime57.jsx)(
|
|
10402
11151
|
AddSprintModal,
|
|
10403
11152
|
{
|
|
10404
11153
|
isOpen: isAddSprintModalOpen,
|
|
@@ -10413,9 +11162,9 @@ var PlanningView = ({
|
|
|
10413
11162
|
};
|
|
10414
11163
|
|
|
10415
11164
|
// src/components/Projects/TasksView.tsx
|
|
10416
|
-
var
|
|
10417
|
-
var
|
|
10418
|
-
var
|
|
11165
|
+
var import_react31 = require("react");
|
|
11166
|
+
var import_lucide_react28 = require("lucide-react");
|
|
11167
|
+
var import_jsx_runtime58 = require("react/jsx-runtime");
|
|
10419
11168
|
var formatDate = (date) => {
|
|
10420
11169
|
return date.toLocaleDateString("en-US", {
|
|
10421
11170
|
weekday: "short",
|
|
@@ -10453,7 +11202,7 @@ var isTomorrow = (date) => {
|
|
|
10453
11202
|
return date.toDateString() === tomorrow.toDateString();
|
|
10454
11203
|
};
|
|
10455
11204
|
var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
10456
|
-
const [formData, setFormData] = (0,
|
|
11205
|
+
const [formData, setFormData] = (0, import_react31.useState)({
|
|
10457
11206
|
title: "",
|
|
10458
11207
|
description: "",
|
|
10459
11208
|
dueDate: "",
|
|
@@ -10467,7 +11216,7 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10467
11216
|
reminderMinutes: 15,
|
|
10468
11217
|
tags: ""
|
|
10469
11218
|
});
|
|
10470
|
-
const [isColleagueError, setIsColleagueError] = (0,
|
|
11219
|
+
const [isColleagueError, setIsColleagueError] = (0, import_react31.useState)(false);
|
|
10471
11220
|
const handleSubmit = (e) => {
|
|
10472
11221
|
e.preventDefault();
|
|
10473
11222
|
const colleague = colleagues.find((c) => c?.id.toString() === formData.colleagueId.toString());
|
|
@@ -10512,18 +11261,18 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10512
11261
|
tags: ""
|
|
10513
11262
|
});
|
|
10514
11263
|
};
|
|
10515
|
-
(0,
|
|
11264
|
+
(0, import_react31.useEffect)(() => {
|
|
10516
11265
|
if (formData.colleagueId) {
|
|
10517
11266
|
setIsColleagueError(false);
|
|
10518
11267
|
}
|
|
10519
11268
|
}, [formData.colleagueId]);
|
|
10520
11269
|
const validColleagues = colleagues.filter(Boolean);
|
|
10521
|
-
return /* @__PURE__ */ (0,
|
|
10522
|
-
/* @__PURE__ */ (0,
|
|
10523
|
-
/* @__PURE__ */ (0,
|
|
10524
|
-
/* @__PURE__ */ (0,
|
|
10525
|
-
/* @__PURE__ */ (0,
|
|
10526
|
-
/* @__PURE__ */ (0,
|
|
11270
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
11271
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(DialogTitle, { children: "Add New Reminder" }) }),
|
|
11272
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
11273
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11274
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "title", children: "Title" }),
|
|
11275
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10527
11276
|
Input,
|
|
10528
11277
|
{
|
|
10529
11278
|
id: "title",
|
|
@@ -10534,9 +11283,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10534
11283
|
}
|
|
10535
11284
|
)
|
|
10536
11285
|
] }) }),
|
|
10537
|
-
/* @__PURE__ */ (0,
|
|
10538
|
-
/* @__PURE__ */ (0,
|
|
10539
|
-
/* @__PURE__ */ (0,
|
|
11286
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11287
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "description", children: "Description" }),
|
|
11288
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10540
11289
|
Textarea,
|
|
10541
11290
|
{
|
|
10542
11291
|
id: "description",
|
|
@@ -10547,10 +11296,10 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10547
11296
|
}
|
|
10548
11297
|
)
|
|
10549
11298
|
] }),
|
|
10550
|
-
/* @__PURE__ */ (0,
|
|
10551
|
-
/* @__PURE__ */ (0,
|
|
10552
|
-
/* @__PURE__ */ (0,
|
|
10553
|
-
/* @__PURE__ */ (0,
|
|
11299
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
11300
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11301
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "dueDate", children: "Due Date" }),
|
|
11302
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10554
11303
|
Input,
|
|
10555
11304
|
{
|
|
10556
11305
|
id: "dueDate",
|
|
@@ -10561,9 +11310,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10561
11310
|
}
|
|
10562
11311
|
)
|
|
10563
11312
|
] }),
|
|
10564
|
-
/* @__PURE__ */ (0,
|
|
10565
|
-
/* @__PURE__ */ (0,
|
|
10566
|
-
/* @__PURE__ */ (0,
|
|
11313
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11314
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "dueTime", children: "Due Time (optional)" }),
|
|
11315
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10567
11316
|
Input,
|
|
10568
11317
|
{
|
|
10569
11318
|
id: "dueTime",
|
|
@@ -10574,9 +11323,9 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10574
11323
|
)
|
|
10575
11324
|
] })
|
|
10576
11325
|
] }),
|
|
10577
|
-
/* @__PURE__ */ (0,
|
|
10578
|
-
/* @__PURE__ */ (0,
|
|
10579
|
-
/* @__PURE__ */ (0,
|
|
11326
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11327
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { className: `${isColleagueError ? "text-destructive" : ""}`, htmlFor: "colleague", children: "Assigned Colleague" }),
|
|
11328
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
|
|
10580
11329
|
Select,
|
|
10581
11330
|
{
|
|
10582
11331
|
value: formData.colleagueId,
|
|
@@ -10585,11 +11334,11 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10585
11334
|
},
|
|
10586
11335
|
required: true,
|
|
10587
11336
|
children: [
|
|
10588
|
-
/* @__PURE__ */ (0,
|
|
11337
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10589
11338
|
SelectTrigger,
|
|
10590
11339
|
{
|
|
10591
11340
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
10592
|
-
children: /* @__PURE__ */ (0,
|
|
11341
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10593
11342
|
SelectValue,
|
|
10594
11343
|
{
|
|
10595
11344
|
className: `${isColleagueError ? "text-destructive border-red-500" : ""}`,
|
|
@@ -10599,15 +11348,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10599
11348
|
)
|
|
10600
11349
|
}
|
|
10601
11350
|
),
|
|
10602
|
-
/* @__PURE__ */ (0,
|
|
11351
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectContent, { children: validColleagues.map((colleague) => /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectItem, { value: colleague.id.toString(), children: colleague.name }, colleague.id)) })
|
|
10603
11352
|
]
|
|
10604
11353
|
}
|
|
10605
11354
|
),
|
|
10606
|
-
isColleagueError && /* @__PURE__ */ (0,
|
|
11355
|
+
isColleagueError && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-destructive text-sm", children: "Please select a digital colleague" })
|
|
10607
11356
|
] }),
|
|
10608
|
-
/* @__PURE__ */ (0,
|
|
10609
|
-
/* @__PURE__ */ (0,
|
|
10610
|
-
/* @__PURE__ */ (0,
|
|
11357
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "space-y-2", children: [
|
|
11358
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
11359
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10611
11360
|
"input",
|
|
10612
11361
|
{
|
|
10613
11362
|
type: "checkbox",
|
|
@@ -10617,12 +11366,12 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10617
11366
|
className: "rounded border-border"
|
|
10618
11367
|
}
|
|
10619
11368
|
),
|
|
10620
|
-
/* @__PURE__ */ (0,
|
|
11369
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "isRecurring", children: "Make this a recurring reminder" })
|
|
10621
11370
|
] }),
|
|
10622
|
-
formData.isRecurring && /* @__PURE__ */ (0,
|
|
10623
|
-
/* @__PURE__ */ (0,
|
|
10624
|
-
/* @__PURE__ */ (0,
|
|
10625
|
-
/* @__PURE__ */ (0,
|
|
11371
|
+
formData.isRecurring && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "grid grid-cols-2 gap-4 pl-6", children: [
|
|
11372
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11373
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "recurrencePattern", children: "Frequency" }),
|
|
11374
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
|
|
10626
11375
|
Select,
|
|
10627
11376
|
{
|
|
10628
11377
|
value: formData.recurrencePattern,
|
|
@@ -10631,20 +11380,20 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10631
11380
|
recurrencePattern: value
|
|
10632
11381
|
}),
|
|
10633
11382
|
children: [
|
|
10634
|
-
/* @__PURE__ */ (0,
|
|
10635
|
-
/* @__PURE__ */ (0,
|
|
10636
|
-
/* @__PURE__ */ (0,
|
|
10637
|
-
/* @__PURE__ */ (0,
|
|
10638
|
-
/* @__PURE__ */ (0,
|
|
10639
|
-
/* @__PURE__ */ (0,
|
|
11383
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectTrigger, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectValue, {}) }),
|
|
11384
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectContent, { children: [
|
|
11385
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectItem, { value: "daily", children: "Daily" }),
|
|
11386
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectItem, { value: "weekly", children: "Weekly" }),
|
|
11387
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectItem, { value: "monthly", children: "Monthly" }),
|
|
11388
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectItem, { value: "yearly", children: "Yearly" })
|
|
10640
11389
|
] })
|
|
10641
11390
|
]
|
|
10642
11391
|
}
|
|
10643
11392
|
)
|
|
10644
11393
|
] }),
|
|
10645
|
-
/* @__PURE__ */ (0,
|
|
10646
|
-
/* @__PURE__ */ (0,
|
|
10647
|
-
/* @__PURE__ */ (0,
|
|
11394
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11395
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "recurrenceInterval", children: "Every" }),
|
|
11396
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10648
11397
|
Input,
|
|
10649
11398
|
{
|
|
10650
11399
|
id: "recurrenceInterval",
|
|
@@ -10657,15 +11406,15 @@ var AddReminderModal = ({ colleagues, onAddReminder, open, setOpen }) => {
|
|
|
10657
11406
|
] })
|
|
10658
11407
|
] })
|
|
10659
11408
|
] }),
|
|
10660
|
-
/* @__PURE__ */ (0,
|
|
10661
|
-
/* @__PURE__ */ (0,
|
|
10662
|
-
/* @__PURE__ */ (0,
|
|
11409
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
11410
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Button, { type: "button", variant: "outline", onClick: () => setOpen(false), children: "Cancel" }),
|
|
11411
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Button, { type: "submit", children: "Add Reminder" })
|
|
10663
11412
|
] })
|
|
10664
11413
|
] })
|
|
10665
11414
|
] }) });
|
|
10666
11415
|
};
|
|
10667
11416
|
var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose }) => {
|
|
10668
|
-
const [formData, setFormData] = (0,
|
|
11417
|
+
const [formData, setFormData] = (0, import_react31.useState)({
|
|
10669
11418
|
title: reminder.title,
|
|
10670
11419
|
description: reminder.description,
|
|
10671
11420
|
dueDate: reminder.dueDate?.toString().split("T")[0],
|
|
@@ -10699,12 +11448,12 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10699
11448
|
onClose();
|
|
10700
11449
|
};
|
|
10701
11450
|
const validColleagues = colleagues.filter(Boolean);
|
|
10702
|
-
return /* @__PURE__ */ (0,
|
|
10703
|
-
/* @__PURE__ */ (0,
|
|
10704
|
-
/* @__PURE__ */ (0,
|
|
10705
|
-
/* @__PURE__ */ (0,
|
|
10706
|
-
/* @__PURE__ */ (0,
|
|
10707
|
-
/* @__PURE__ */ (0,
|
|
11451
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Dialog, { open, onOpenChange: onClose, children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(DialogContent, { className: "max-w-2xl", children: [
|
|
11452
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(DialogHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(DialogTitle, { children: "Edit Reminder" }) }),
|
|
11453
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
|
|
11454
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "grid grid-cols-2 gap-4", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11455
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "edit-title", children: "Title" }),
|
|
11456
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10708
11457
|
Input,
|
|
10709
11458
|
{
|
|
10710
11459
|
id: "edit-title",
|
|
@@ -10715,9 +11464,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10715
11464
|
}
|
|
10716
11465
|
)
|
|
10717
11466
|
] }) }),
|
|
10718
|
-
/* @__PURE__ */ (0,
|
|
10719
|
-
/* @__PURE__ */ (0,
|
|
10720
|
-
/* @__PURE__ */ (0,
|
|
11467
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11468
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "edit-description", children: "Description" }),
|
|
11469
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10721
11470
|
Textarea,
|
|
10722
11471
|
{
|
|
10723
11472
|
id: "edit-description",
|
|
@@ -10728,10 +11477,10 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10728
11477
|
}
|
|
10729
11478
|
)
|
|
10730
11479
|
] }),
|
|
10731
|
-
/* @__PURE__ */ (0,
|
|
10732
|
-
/* @__PURE__ */ (0,
|
|
10733
|
-
/* @__PURE__ */ (0,
|
|
10734
|
-
/* @__PURE__ */ (0,
|
|
11480
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "grid grid-cols-2 gap-4", children: [
|
|
11481
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11482
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "edit-dueDate", children: "Due Date" }),
|
|
11483
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10735
11484
|
Input,
|
|
10736
11485
|
{
|
|
10737
11486
|
id: "edit-dueDate",
|
|
@@ -10742,9 +11491,9 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10742
11491
|
}
|
|
10743
11492
|
)
|
|
10744
11493
|
] }),
|
|
10745
|
-
/* @__PURE__ */ (0,
|
|
10746
|
-
/* @__PURE__ */ (0,
|
|
10747
|
-
/* @__PURE__ */ (0,
|
|
11494
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11495
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "edit-dueTime", children: "Due Time (optional)" }),
|
|
11496
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10748
11497
|
Input,
|
|
10749
11498
|
{
|
|
10750
11499
|
id: "edit-dueTime",
|
|
@@ -10755,8 +11504,8 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10755
11504
|
)
|
|
10756
11505
|
] })
|
|
10757
11506
|
] }),
|
|
10758
|
-
/* @__PURE__ */ (0,
|
|
10759
|
-
/* @__PURE__ */ (0,
|
|
11507
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "space-y-2", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-2", children: [
|
|
11508
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10760
11509
|
"input",
|
|
10761
11510
|
{
|
|
10762
11511
|
type: "checkbox",
|
|
@@ -10766,17 +11515,17 @@ var EditReminderModal = ({ reminder, colleagues, onUpdateReminder, open, onClose
|
|
|
10766
11515
|
className: "rounded border-border"
|
|
10767
11516
|
}
|
|
10768
11517
|
),
|
|
10769
|
-
/* @__PURE__ */ (0,
|
|
11518
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Label3, { htmlFor: "edit-isRecurring", children: "Make this a recurring reminder" })
|
|
10770
11519
|
] }) }),
|
|
10771
|
-
/* @__PURE__ */ (0,
|
|
10772
|
-
/* @__PURE__ */ (0,
|
|
10773
|
-
/* @__PURE__ */ (0,
|
|
11520
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex justify-end space-x-2", children: [
|
|
11521
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Button, { type: "button", variant: "outline", onClick: onClose, children: "Cancel" }),
|
|
11522
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(Button, { type: "submit", children: "Save Changes" })
|
|
10774
11523
|
] })
|
|
10775
11524
|
] })
|
|
10776
11525
|
] }) });
|
|
10777
11526
|
};
|
|
10778
11527
|
var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }) => {
|
|
10779
|
-
const [isEditing, setIsEditing] = (0,
|
|
11528
|
+
const [isEditing, setIsEditing] = (0, import_react31.useState)(false);
|
|
10780
11529
|
if (!reminder || !reminder.id) {
|
|
10781
11530
|
return null;
|
|
10782
11531
|
}
|
|
@@ -10794,8 +11543,8 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
10794
11543
|
if (tomorrow) return "Tomorrow";
|
|
10795
11544
|
return formatDate(new Date(reminder.dueDate || ""));
|
|
10796
11545
|
};
|
|
10797
|
-
return /* @__PURE__ */ (0,
|
|
10798
|
-
/* @__PURE__ */ (0,
|
|
11546
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(import_jsx_runtime58.Fragment, { children: [
|
|
11547
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10799
11548
|
EditReminderModal,
|
|
10800
11549
|
{
|
|
10801
11550
|
reminder,
|
|
@@ -10805,61 +11554,61 @@ var ReminderCard = ({ reminder, colleagues, onUpdateReminder, onDeleteReminder }
|
|
|
10805
11554
|
onClose: () => setIsEditing(false)
|
|
10806
11555
|
}
|
|
10807
11556
|
),
|
|
10808
|
-
/* @__PURE__ */ (0,
|
|
11557
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10809
11558
|
Card,
|
|
10810
11559
|
{
|
|
10811
|
-
children: /* @__PURE__ */ (0,
|
|
10812
|
-
/* @__PURE__ */ (0,
|
|
10813
|
-
/* @__PURE__ */ (0,
|
|
11560
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(CardContent, { className: "p-4", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-start justify-between", children: [
|
|
11561
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-start space-x-3 flex-1", children: [
|
|
11562
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10814
11563
|
"button",
|
|
10815
11564
|
{
|
|
10816
11565
|
onClick: handleToggleComplete,
|
|
10817
11566
|
className: "mt-1 text-primary hover:text-primary/80"
|
|
10818
11567
|
}
|
|
10819
11568
|
),
|
|
10820
|
-
/* @__PURE__ */ (0,
|
|
10821
|
-
/* @__PURE__ */ (0,
|
|
11569
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex-1", children: [
|
|
11570
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "flex items-center space-x-2 mb-1", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10822
11571
|
"h3",
|
|
10823
11572
|
{
|
|
10824
11573
|
children: reminder.title
|
|
10825
11574
|
}
|
|
10826
11575
|
) }),
|
|
10827
|
-
/* @__PURE__ */ (0,
|
|
10828
|
-
/* @__PURE__ */ (0,
|
|
10829
|
-
/* @__PURE__ */ (0,
|
|
10830
|
-
/* @__PURE__ */ (0,
|
|
10831
|
-
/* @__PURE__ */ (0,
|
|
11576
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-sm text-muted-foreground mb-2", children: reminder.description }),
|
|
11577
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-4 text-sm text-muted-foreground", children: [
|
|
11578
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
11579
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.Calendar, { className: "h-4 w-4" }),
|
|
11580
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { className: overdue ? "text-destructive font-medium" : "", children: getDateLabel() })
|
|
10832
11581
|
] }),
|
|
10833
|
-
reminder.dueTime && /* @__PURE__ */ (0,
|
|
10834
|
-
/* @__PURE__ */ (0,
|
|
10835
|
-
/* @__PURE__ */ (0,
|
|
11582
|
+
reminder.dueTime && /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
11583
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.Clock, { className: "h-4 w-4" }),
|
|
11584
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: formatTime(reminder.dueTime) })
|
|
10836
11585
|
] }),
|
|
10837
|
-
/* @__PURE__ */ (0,
|
|
10838
|
-
/* @__PURE__ */ (0,
|
|
10839
|
-
/* @__PURE__ */ (0,
|
|
11586
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
11587
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.User, { className: "h-4 w-4" }),
|
|
11588
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: typeof reminder.assignedColleague !== "number" ? reminder.assignedColleague.name : "Unknown Colleague" })
|
|
10840
11589
|
] })
|
|
10841
11590
|
] })
|
|
10842
11591
|
] })
|
|
10843
11592
|
] }),
|
|
10844
|
-
/* @__PURE__ */ (0,
|
|
10845
|
-
/* @__PURE__ */ (0,
|
|
11593
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-1", children: [
|
|
11594
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10846
11595
|
Button,
|
|
10847
11596
|
{
|
|
10848
11597
|
variant: "ghost",
|
|
10849
11598
|
size: "sm",
|
|
10850
11599
|
onClick: () => setIsEditing(true),
|
|
10851
11600
|
className: "h-8 w-8 p-0",
|
|
10852
|
-
children: /* @__PURE__ */ (0,
|
|
11601
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.Edit2, { className: "h-4 w-4" })
|
|
10853
11602
|
}
|
|
10854
11603
|
),
|
|
10855
|
-
/* @__PURE__ */ (0,
|
|
11604
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10856
11605
|
Button,
|
|
10857
11606
|
{
|
|
10858
11607
|
variant: "ghost",
|
|
10859
11608
|
size: "sm",
|
|
10860
11609
|
onClick: () => onDeleteReminder(reminder.id.toString()),
|
|
10861
11610
|
className: "h-8 w-8 p-0 text-destructive hover:text-destructive/80",
|
|
10862
|
-
children: /* @__PURE__ */ (0,
|
|
11611
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.Trash2, { className: "h-4 w-4" })
|
|
10863
11612
|
}
|
|
10864
11613
|
)
|
|
10865
11614
|
] })
|
|
@@ -10875,15 +11624,15 @@ var TasksView = ({
|
|
|
10875
11624
|
onUpdateReminder,
|
|
10876
11625
|
onDeleteReminder
|
|
10877
11626
|
}) => {
|
|
10878
|
-
const [reminders, setReminders] = (0,
|
|
10879
|
-
const [colleagues, setColleagues] = (0,
|
|
10880
|
-
const [filter, setFilter] = (0,
|
|
10881
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
10882
|
-
const [openAddReminderModal, setOpenAddReminderModal] = (0,
|
|
10883
|
-
(0,
|
|
11627
|
+
const [reminders, setReminders] = (0, import_react31.useState)(initialReminders.filter(Boolean));
|
|
11628
|
+
const [colleagues, setColleagues] = (0, import_react31.useState)(initialColleagues.filter(Boolean));
|
|
11629
|
+
const [filter, setFilter] = (0, import_react31.useState)("all");
|
|
11630
|
+
const [searchTerm, setSearchTerm] = (0, import_react31.useState)("");
|
|
11631
|
+
const [openAddReminderModal, setOpenAddReminderModal] = (0, import_react31.useState)(false);
|
|
11632
|
+
(0, import_react31.useEffect)(() => {
|
|
10884
11633
|
setReminders(initialReminders.filter(Boolean));
|
|
10885
11634
|
}, [initialReminders]);
|
|
10886
|
-
(0,
|
|
11635
|
+
(0, import_react31.useEffect)(() => {
|
|
10887
11636
|
setColleagues(initialColleagues.filter(Boolean));
|
|
10888
11637
|
}, [initialColleagues]);
|
|
10889
11638
|
const handleAddReminder = (newReminder) => {
|
|
@@ -10971,8 +11720,8 @@ var TasksView = ({
|
|
|
10971
11720
|
// lastUpdated: new Date(),
|
|
10972
11721
|
// isActive: true,
|
|
10973
11722
|
};
|
|
10974
|
-
return /* @__PURE__ */ (0,
|
|
10975
|
-
/* @__PURE__ */ (0,
|
|
11723
|
+
return /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
11724
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10976
11725
|
DashboardHero,
|
|
10977
11726
|
{
|
|
10978
11727
|
title: "Task Reminders",
|
|
@@ -10986,8 +11735,8 @@ var TasksView = ({
|
|
|
10986
11735
|
}
|
|
10987
11736
|
}
|
|
10988
11737
|
),
|
|
10989
|
-
/* @__PURE__ */ (0,
|
|
10990
|
-
/* @__PURE__ */ (0,
|
|
11738
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "h-full bg-background", children: [
|
|
11739
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
10991
11740
|
AddReminderModal,
|
|
10992
11741
|
{
|
|
10993
11742
|
colleagues,
|
|
@@ -10996,48 +11745,48 @@ var TasksView = ({
|
|
|
10996
11745
|
setOpen: setOpenAddReminderModal
|
|
10997
11746
|
}
|
|
10998
11747
|
),
|
|
10999
|
-
/* @__PURE__ */ (0,
|
|
11000
|
-
/* @__PURE__ */ (0,
|
|
11001
|
-
/* @__PURE__ */ (0,
|
|
11002
|
-
/* @__PURE__ */ (0,
|
|
11003
|
-
/* @__PURE__ */ (0,
|
|
11748
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "p-6", children: [
|
|
11749
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center justify-between mb-6", children: [
|
|
11750
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { children: [
|
|
11751
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Task Reminders" }),
|
|
11752
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-muted-foreground", children: "Manage your digital colleague task reminders" })
|
|
11004
11753
|
] }),
|
|
11005
|
-
/* @__PURE__ */ (0,
|
|
11754
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(
|
|
11006
11755
|
Button,
|
|
11007
11756
|
{
|
|
11008
11757
|
className: "flex items-center space-x-2",
|
|
11009
11758
|
onClick: () => setOpenAddReminderModal(true),
|
|
11010
11759
|
children: [
|
|
11011
|
-
/* @__PURE__ */ (0,
|
|
11012
|
-
/* @__PURE__ */ (0,
|
|
11760
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(import_lucide_react28.Plus, { className: "h-4 w-4" }),
|
|
11761
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("span", { children: "Add Reminder" })
|
|
11013
11762
|
]
|
|
11014
11763
|
}
|
|
11015
11764
|
)
|
|
11016
11765
|
] }),
|
|
11017
|
-
/* @__PURE__ */ (0,
|
|
11018
|
-
/* @__PURE__ */ (0,
|
|
11019
|
-
/* @__PURE__ */ (0,
|
|
11020
|
-
/* @__PURE__ */ (0,
|
|
11766
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "grid grid-cols-5 gap-4 mb-6", children: [
|
|
11767
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-4", children: [
|
|
11768
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-2xl font-bold text-foreground", children: stats.total }),
|
|
11769
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-sm text-muted-foreground", children: "Total" })
|
|
11021
11770
|
] }),
|
|
11022
|
-
/* @__PURE__ */ (0,
|
|
11023
|
-
/* @__PURE__ */ (0,
|
|
11024
|
-
/* @__PURE__ */ (0,
|
|
11771
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-4", children: [
|
|
11772
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-2xl font-bold text-primary", children: stats.overdue }),
|
|
11773
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-sm text-muted-foreground", children: "Pending" })
|
|
11025
11774
|
] }),
|
|
11026
|
-
/* @__PURE__ */ (0,
|
|
11027
|
-
/* @__PURE__ */ (0,
|
|
11028
|
-
/* @__PURE__ */ (0,
|
|
11775
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-4", children: [
|
|
11776
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-2xl font-bold text-success", children: stats.today }),
|
|
11777
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-sm text-muted-foreground", children: "Completed" })
|
|
11029
11778
|
] }),
|
|
11030
|
-
/* @__PURE__ */ (0,
|
|
11031
|
-
/* @__PURE__ */ (0,
|
|
11032
|
-
/* @__PURE__ */ (0,
|
|
11779
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-4", children: [
|
|
11780
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-2xl font-bold text-destructive", children: stats.overdue }),
|
|
11781
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-sm text-muted-foreground", children: "Overdue" })
|
|
11033
11782
|
] }),
|
|
11034
|
-
/* @__PURE__ */ (0,
|
|
11035
|
-
/* @__PURE__ */ (0,
|
|
11036
|
-
/* @__PURE__ */ (0,
|
|
11783
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-4", children: [
|
|
11784
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-2xl font-bold text-warning", children: stats.today }),
|
|
11785
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-sm text-muted-foreground", children: "Today" })
|
|
11037
11786
|
] })
|
|
11038
11787
|
] }),
|
|
11039
|
-
/* @__PURE__ */ (0,
|
|
11040
|
-
/* @__PURE__ */ (0,
|
|
11788
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)("div", { className: "flex items-center space-x-4 mb-6", children: [
|
|
11789
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
11041
11790
|
Input,
|
|
11042
11791
|
{
|
|
11043
11792
|
placeholder: "Search reminders...",
|
|
@@ -11046,25 +11795,25 @@ var TasksView = ({
|
|
|
11046
11795
|
className: "max-w-md"
|
|
11047
11796
|
}
|
|
11048
11797
|
) }),
|
|
11049
|
-
/* @__PURE__ */ (0,
|
|
11050
|
-
/* @__PURE__ */ (0,
|
|
11051
|
-
/* @__PURE__ */ (0,
|
|
11052
|
-
/* @__PURE__ */ (0,
|
|
11798
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Select, { value: filter, onValueChange: (value) => setFilter(value), children: [
|
|
11799
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectTrigger, { className: "w-40", children: /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(SelectValue, {}) }),
|
|
11800
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectContent, { children: [
|
|
11801
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectItem, { value: "all", children: [
|
|
11053
11802
|
"All (",
|
|
11054
11803
|
stats.total,
|
|
11055
11804
|
")"
|
|
11056
11805
|
] }),
|
|
11057
|
-
/* @__PURE__ */ (0,
|
|
11806
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectItem, { value: "overdue", children: [
|
|
11058
11807
|
"Overdue (",
|
|
11059
11808
|
stats.overdue,
|
|
11060
11809
|
")"
|
|
11061
11810
|
] }),
|
|
11062
|
-
/* @__PURE__ */ (0,
|
|
11811
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectItem, { value: "overdue", children: [
|
|
11063
11812
|
"Overdue (",
|
|
11064
11813
|
stats.overdue,
|
|
11065
11814
|
")"
|
|
11066
11815
|
] }),
|
|
11067
|
-
/* @__PURE__ */ (0,
|
|
11816
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(SelectItem, { value: "today", children: [
|
|
11068
11817
|
"Today (",
|
|
11069
11818
|
stats.today,
|
|
11070
11819
|
")"
|
|
@@ -11072,11 +11821,11 @@ var TasksView = ({
|
|
|
11072
11821
|
] })
|
|
11073
11822
|
] })
|
|
11074
11823
|
] }),
|
|
11075
|
-
/* @__PURE__ */ (0,
|
|
11076
|
-
/* @__PURE__ */ (0,
|
|
11077
|
-
!searchTerm && filter === "all" && /* @__PURE__ */ (0,
|
|
11824
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "space-y-4", children: sortedReminders.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime58.jsxs)(Card, { className: "p-8 text-center", children: [
|
|
11825
|
+
/* @__PURE__ */ (0, import_jsx_runtime58.jsx)("div", { className: "text-muted-foreground", children: searchTerm || filter !== "all" ? "No reminders match your filters" : "No reminders yet" }),
|
|
11826
|
+
!searchTerm && filter === "all" && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)("p", { className: "text-sm text-muted-foreground/60 mt-2", children: "Create your first reminder to get started" })
|
|
11078
11827
|
] }) : sortedReminders.map(
|
|
11079
|
-
(reminder) => reminder && /* @__PURE__ */ (0,
|
|
11828
|
+
(reminder) => reminder && /* @__PURE__ */ (0, import_jsx_runtime58.jsx)(
|
|
11080
11829
|
ReminderCard,
|
|
11081
11830
|
{
|
|
11082
11831
|
reminder,
|
|
@@ -11093,10 +11842,10 @@ var TasksView = ({
|
|
|
11093
11842
|
};
|
|
11094
11843
|
|
|
11095
11844
|
// src/components/Projects/FileView.tsx
|
|
11096
|
-
var
|
|
11097
|
-
var
|
|
11098
|
-
var
|
|
11099
|
-
var
|
|
11845
|
+
var import_react32 = require("react");
|
|
11846
|
+
var import_lucide_react29 = require("lucide-react");
|
|
11847
|
+
var import_react33 = require("motion/react");
|
|
11848
|
+
var import_jsx_runtime59 = require("react/jsx-runtime");
|
|
11100
11849
|
function FileView({
|
|
11101
11850
|
initialFiles = [],
|
|
11102
11851
|
onFileAdd,
|
|
@@ -11107,18 +11856,18 @@ function FileView({
|
|
|
11107
11856
|
compactView = false,
|
|
11108
11857
|
className
|
|
11109
11858
|
}) {
|
|
11110
|
-
const [files, setFiles] = (0,
|
|
11111
|
-
const [searchTerm, setSearchTerm] = (0,
|
|
11112
|
-
const [appFilter, setAppFilter] = (0,
|
|
11113
|
-
const [activeTab, setActiveTab] = (0,
|
|
11114
|
-
const [isAddFileModalOpen, setIsAddFileModalOpen] = (0,
|
|
11115
|
-
const prevFilesHash = (0,
|
|
11859
|
+
const [files, setFiles] = (0, import_react32.useState)(initialFiles);
|
|
11860
|
+
const [searchTerm, setSearchTerm] = (0, import_react32.useState)("");
|
|
11861
|
+
const [appFilter, setAppFilter] = (0, import_react32.useState)("all");
|
|
11862
|
+
const [activeTab, setActiveTab] = (0, import_react32.useState)("all");
|
|
11863
|
+
const [isAddFileModalOpen, setIsAddFileModalOpen] = (0, import_react32.useState)(false);
|
|
11864
|
+
const prevFilesHash = (0, import_react32.useRef)("");
|
|
11116
11865
|
const getHash = (list) => {
|
|
11117
11866
|
return list.map(
|
|
11118
11867
|
(item) => `${item.id}-${new Date(item.createdAt).getTime()}-${new Date(item.updatedAt).getTime()}`
|
|
11119
11868
|
).join("-");
|
|
11120
11869
|
};
|
|
11121
|
-
(0,
|
|
11870
|
+
(0, import_react32.useEffect)(() => {
|
|
11122
11871
|
const next = getHash(
|
|
11123
11872
|
initialFiles.map((el) => ({
|
|
11124
11873
|
...el,
|
|
@@ -11155,16 +11904,16 @@ function FileView({
|
|
|
11155
11904
|
setSearchTerm("");
|
|
11156
11905
|
setAppFilter("all");
|
|
11157
11906
|
};
|
|
11158
|
-
return /* @__PURE__ */ (0,
|
|
11159
|
-
/* @__PURE__ */ (0,
|
|
11160
|
-
|
|
11907
|
+
return /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "px-2 md:px-4 py-4 space-y-8", children: [
|
|
11908
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_react33.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11909
|
+
import_react33.motion.div,
|
|
11161
11910
|
{
|
|
11162
11911
|
initial: { opacity: 0, y: 10 },
|
|
11163
11912
|
animate: { opacity: 1, y: 0 },
|
|
11164
11913
|
exit: { opacity: 0, y: -10 },
|
|
11165
11914
|
transition: { duration: 0.2 },
|
|
11166
|
-
children: /* @__PURE__ */ (0,
|
|
11167
|
-
/* @__PURE__ */ (0,
|
|
11915
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: `space-y-6 ${className || ""}`, children: [
|
|
11916
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11168
11917
|
DashboardHero,
|
|
11169
11918
|
{
|
|
11170
11919
|
title: "Files",
|
|
@@ -11180,10 +11929,10 @@ function FileView({
|
|
|
11180
11929
|
}
|
|
11181
11930
|
}
|
|
11182
11931
|
),
|
|
11183
|
-
/* @__PURE__ */ (0,
|
|
11184
|
-
/* @__PURE__ */ (0,
|
|
11185
|
-
/* @__PURE__ */ (0,
|
|
11186
|
-
/* @__PURE__ */ (0,
|
|
11932
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(CardContent, { className: "pt-6", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "flex flex-col md:flex-row gap-4", children: [
|
|
11933
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)("div", { className: "flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "relative", children: [
|
|
11934
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react29.Search, { className: "absolute left-3 top-3 h-4 w-4 text-muted-foreground" }),
|
|
11935
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11187
11936
|
Input,
|
|
11188
11937
|
{
|
|
11189
11938
|
placeholder: "Search files...",
|
|
@@ -11193,13 +11942,13 @@ function FileView({
|
|
|
11193
11942
|
}
|
|
11194
11943
|
)
|
|
11195
11944
|
] }) }),
|
|
11196
|
-
(searchTerm || appFilter !== "all") && /* @__PURE__ */ (0,
|
|
11197
|
-
/* @__PURE__ */ (0,
|
|
11945
|
+
(searchTerm || appFilter !== "all") && /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Button, { variant: "outline", onClick: clearFilters, className: "gap-2", children: [
|
|
11946
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react29.Filter, { className: "h-4 w-4" }),
|
|
11198
11947
|
"Clear"
|
|
11199
11948
|
] })
|
|
11200
11949
|
] }) }) }),
|
|
11201
|
-
/* @__PURE__ */ (0,
|
|
11202
|
-
/* @__PURE__ */ (0,
|
|
11950
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "space-y-4", children: [
|
|
11951
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11203
11952
|
NavigationTabs,
|
|
11204
11953
|
{
|
|
11205
11954
|
activeTab,
|
|
@@ -11213,7 +11962,7 @@ function FileView({
|
|
|
11213
11962
|
gridCols: 3
|
|
11214
11963
|
}
|
|
11215
11964
|
),
|
|
11216
|
-
activeTab === "all" && /* @__PURE__ */ (0,
|
|
11965
|
+
activeTab === "all" && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11217
11966
|
FileList,
|
|
11218
11967
|
{
|
|
11219
11968
|
files: filteredFiles,
|
|
@@ -11223,7 +11972,7 @@ function FileView({
|
|
|
11223
11972
|
showHeader: !compactView
|
|
11224
11973
|
}
|
|
11225
11974
|
),
|
|
11226
|
-
activeTab === "recent" && /* @__PURE__ */ (0,
|
|
11975
|
+
activeTab === "recent" && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11227
11976
|
FileList,
|
|
11228
11977
|
{
|
|
11229
11978
|
files: recentFiles,
|
|
@@ -11233,7 +11982,7 @@ function FileView({
|
|
|
11233
11982
|
showHeader: !compactView
|
|
11234
11983
|
}
|
|
11235
11984
|
),
|
|
11236
|
-
activeTab === "shared" && /* @__PURE__ */ (0,
|
|
11985
|
+
activeTab === "shared" && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11237
11986
|
FileList,
|
|
11238
11987
|
{
|
|
11239
11988
|
files: sharedFiles,
|
|
@@ -11244,12 +11993,12 @@ function FileView({
|
|
|
11244
11993
|
}
|
|
11245
11994
|
)
|
|
11246
11995
|
] }),
|
|
11247
|
-
filteredFiles.length === 0 && /* @__PURE__ */ (0,
|
|
11248
|
-
/* @__PURE__ */ (0,
|
|
11249
|
-
/* @__PURE__ */ (0,
|
|
11250
|
-
/* @__PURE__ */ (0,
|
|
11251
|
-
/* @__PURE__ */ (0,
|
|
11252
|
-
/* @__PURE__ */ (0,
|
|
11996
|
+
filteredFiles.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(Card, { children: /* @__PURE__ */ (0, import_jsx_runtime59.jsx)(CardContent, { className: "pt-6", children: /* @__PURE__ */ (0, import_jsx_runtime59.jsxs)("div", { className: "text-center py-8", children: [
|
|
11997
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react29.File, { className: "h-12 w-12 text-muted-foreground mx-auto mb-4" }),
|
|
11998
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)("h3", { className: "text-lg font-semibold mb-2", children: "No files found" }),
|
|
11999
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.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." }),
|
|
12000
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsxs)(Button, { onClick: handleAddFile, className: "gap-2", children: [
|
|
12001
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(import_lucide_react29.Plus, { className: "h-4 w-4" }),
|
|
11253
12002
|
"Upload File"
|
|
11254
12003
|
] })
|
|
11255
12004
|
] }) }) })
|
|
@@ -11257,7 +12006,7 @@ function FileView({
|
|
|
11257
12006
|
},
|
|
11258
12007
|
"files-view"
|
|
11259
12008
|
) }),
|
|
11260
|
-
/* @__PURE__ */ (0,
|
|
12009
|
+
/* @__PURE__ */ (0, import_jsx_runtime59.jsx)(
|
|
11261
12010
|
AddFileModal,
|
|
11262
12011
|
{
|
|
11263
12012
|
isOpen: isAddFileModalOpen,
|
|
@@ -11270,7 +12019,7 @@ function FileView({
|
|
|
11270
12019
|
|
|
11271
12020
|
// src/components/Projects/ProjectView.tsx
|
|
11272
12021
|
var import_navigation = require("next/navigation");
|
|
11273
|
-
var
|
|
12022
|
+
var import_jsx_runtime60 = require("react/jsx-runtime");
|
|
11274
12023
|
function ProjectView({
|
|
11275
12024
|
title = "",
|
|
11276
12025
|
initialTasks = [],
|
|
@@ -11318,47 +12067,47 @@ function ProjectView({
|
|
|
11318
12067
|
onCopilotClick,
|
|
11319
12068
|
handleAddComment
|
|
11320
12069
|
}) {
|
|
11321
|
-
const [tasks, setTasks] = (0,
|
|
11322
|
-
const [epics, setEpics] = (0,
|
|
11323
|
-
const [sprints, setSprints] = (0,
|
|
11324
|
-
const [projects, setProjects] = (0,
|
|
11325
|
-
const [reminders, setReminders] = (0,
|
|
11326
|
-
const [colleagues, setColleagues] = (0,
|
|
11327
|
-
const [users, setUsers] = (0,
|
|
11328
|
-
const [files, setFiles] = (0,
|
|
11329
|
-
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0,
|
|
11330
|
-
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0,
|
|
11331
|
-
const [selectedTask, setSelectedTask] = (0,
|
|
11332
|
-
const [selectedEpicForTask, setSelectedEpicForTask] = (0,
|
|
11333
|
-
const [draggedTask, setDraggedTask] = (0,
|
|
11334
|
-
const [currentView, setCurrentView] = (0,
|
|
11335
|
-
const [mobileMenuOpen, setMobileMenuOpen] = (0,
|
|
12070
|
+
const [tasks, setTasks] = (0, import_react34.useState)(initialTasks);
|
|
12071
|
+
const [epics, setEpics] = (0, import_react34.useState)(initialEpics);
|
|
12072
|
+
const [sprints, setSprints] = (0, import_react34.useState)(initialSprints);
|
|
12073
|
+
const [projects, setProjects] = (0, import_react34.useState)(initialProjects);
|
|
12074
|
+
const [reminders, setReminders] = (0, import_react34.useState)(initialReminders);
|
|
12075
|
+
const [colleagues, setColleagues] = (0, import_react34.useState)(initialColleagues);
|
|
12076
|
+
const [users, setUsers] = (0, import_react34.useState)(initialUsers);
|
|
12077
|
+
const [files, setFiles] = (0, import_react34.useState)(initialFiles);
|
|
12078
|
+
const [isAddTaskModalOpen, setIsAddTaskModalOpen] = (0, import_react34.useState)(false);
|
|
12079
|
+
const [isAddEpicModalOpen, setIsAddEpicModalOpen] = (0, import_react34.useState)(false);
|
|
12080
|
+
const [selectedTask, setSelectedTask] = (0, import_react34.useState)(null);
|
|
12081
|
+
const [selectedEpicForTask, setSelectedEpicForTask] = (0, import_react34.useState)(null);
|
|
12082
|
+
const [draggedTask, setDraggedTask] = (0, import_react34.useState)(null);
|
|
12083
|
+
const [currentView, setCurrentView] = (0, import_react34.useState)(initialView || "kanban");
|
|
12084
|
+
const [mobileMenuOpen, setMobileMenuOpen] = (0, import_react34.useState)(false);
|
|
11336
12085
|
const router = (0, import_navigation.useRouter)();
|
|
11337
|
-
(0,
|
|
12086
|
+
(0, import_react34.useEffect)(() => {
|
|
11338
12087
|
setTasks(initialTasks);
|
|
11339
12088
|
}, [initialTasks]);
|
|
11340
|
-
(0,
|
|
12089
|
+
(0, import_react34.useEffect)(() => {
|
|
11341
12090
|
setSprints(initialSprints);
|
|
11342
12091
|
}, [initialSprints]);
|
|
11343
|
-
(0,
|
|
12092
|
+
(0, import_react34.useEffect)(() => {
|
|
11344
12093
|
setEpics(initialEpics);
|
|
11345
12094
|
}, [initialEpics]);
|
|
11346
|
-
(0,
|
|
12095
|
+
(0, import_react34.useEffect)(() => {
|
|
11347
12096
|
setProjects(initialProjects);
|
|
11348
12097
|
}, [initialProjects]);
|
|
11349
|
-
(0,
|
|
12098
|
+
(0, import_react34.useEffect)(() => {
|
|
11350
12099
|
setFiles(initialFiles);
|
|
11351
12100
|
}, [initialFiles]);
|
|
11352
|
-
(0,
|
|
12101
|
+
(0, import_react34.useEffect)(() => {
|
|
11353
12102
|
setUsers(initialUsers);
|
|
11354
12103
|
}, [initialUsers]);
|
|
11355
|
-
(0,
|
|
12104
|
+
(0, import_react34.useEffect)(() => {
|
|
11356
12105
|
setColleagues(initialColleagues);
|
|
11357
12106
|
}, [initialColleagues]);
|
|
11358
|
-
(0,
|
|
12107
|
+
(0, import_react34.useEffect)(() => {
|
|
11359
12108
|
setReminders(initialReminders);
|
|
11360
12109
|
}, [initialReminders]);
|
|
11361
|
-
(0,
|
|
12110
|
+
(0, import_react34.useEffect)(() => {
|
|
11362
12111
|
setCurrentView(initialView);
|
|
11363
12112
|
}, [initialView]);
|
|
11364
12113
|
const filteredTasks = tasks.filter((task) => {
|
|
@@ -11564,6 +12313,8 @@ function ProjectView({
|
|
|
11564
12313
|
return "Documentation";
|
|
11565
12314
|
case "epics":
|
|
11566
12315
|
return "Epic Planning";
|
|
12316
|
+
case "gantt":
|
|
12317
|
+
return "Gantt Chart";
|
|
11567
12318
|
default:
|
|
11568
12319
|
return "Project Board";
|
|
11569
12320
|
}
|
|
@@ -11579,8 +12330,8 @@ function ProjectView({
|
|
|
11579
12330
|
const recentTeams = mockTeams.sort((a, b) => b.lastUsed.getTime() - a.lastUsed.getTime()).slice(0, 3);
|
|
11580
12331
|
const hasMoreTeams = mockTeams.length > 3;
|
|
11581
12332
|
const additionalTeams = mockTeams.slice(3);
|
|
11582
|
-
return /* @__PURE__ */ (0,
|
|
11583
|
-
currentView === "kanban" && /* @__PURE__ */ (0,
|
|
12333
|
+
return /* @__PURE__ */ (0, import_jsx_runtime60.jsxs)(ManagementSidebar, { currentView, onViewChange: handleViewChange, children: [
|
|
12334
|
+
currentView === "kanban" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "h-full overflow-hidden", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11584
12335
|
KanbanBoardView,
|
|
11585
12336
|
{
|
|
11586
12337
|
initialProjects: projects,
|
|
@@ -11597,7 +12348,7 @@ function ProjectView({
|
|
|
11597
12348
|
onAddComment: handleAddComment
|
|
11598
12349
|
}
|
|
11599
12350
|
) }),
|
|
11600
|
-
currentView === "planning" && /* @__PURE__ */ (0,
|
|
12351
|
+
currentView === "planning" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11601
12352
|
PlanningView,
|
|
11602
12353
|
{
|
|
11603
12354
|
tasks,
|
|
@@ -11610,7 +12361,7 @@ function ProjectView({
|
|
|
11610
12361
|
onDeleteSprint: handleDeleteSprint
|
|
11611
12362
|
}
|
|
11612
12363
|
) }),
|
|
11613
|
-
currentView === "tasks" && /* @__PURE__ */ (0,
|
|
12364
|
+
currentView === "tasks" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11614
12365
|
TasksView,
|
|
11615
12366
|
{
|
|
11616
12367
|
initialReminders: reminders,
|
|
@@ -11620,7 +12371,7 @@ function ProjectView({
|
|
|
11620
12371
|
onDeleteReminder: handleDeleteReminder
|
|
11621
12372
|
}
|
|
11622
12373
|
) }),
|
|
11623
|
-
currentView === "files" && /* @__PURE__ */ (0,
|
|
12374
|
+
currentView === "files" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11624
12375
|
FileView,
|
|
11625
12376
|
{
|
|
11626
12377
|
initialFiles: files,
|
|
@@ -11631,7 +12382,7 @@ function ProjectView({
|
|
|
11631
12382
|
compactView: false
|
|
11632
12383
|
}
|
|
11633
12384
|
) }),
|
|
11634
|
-
currentView === "epics" && /* @__PURE__ */ (0,
|
|
12385
|
+
currentView === "epics" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "h-full", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11635
12386
|
EpicsView,
|
|
11636
12387
|
{
|
|
11637
12388
|
tasks,
|
|
@@ -11645,7 +12396,17 @@ function ProjectView({
|
|
|
11645
12396
|
onDeleteEpic: handleDeleteEpic
|
|
11646
12397
|
}
|
|
11647
12398
|
) }),
|
|
11648
|
-
/* @__PURE__ */ (0,
|
|
12399
|
+
currentView === "gantt" && /* @__PURE__ */ (0, import_jsx_runtime60.jsx)("div", { className: "hidden md:block h-full", children: /* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
12400
|
+
GanttView,
|
|
12401
|
+
{
|
|
12402
|
+
tasks,
|
|
12403
|
+
epics,
|
|
12404
|
+
sprints,
|
|
12405
|
+
onUpdateEpic: handleUpdateEpic,
|
|
12406
|
+
onTaskClick: handleTaskClick
|
|
12407
|
+
}
|
|
12408
|
+
) }),
|
|
12409
|
+
/* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11649
12410
|
AddTaskModal,
|
|
11650
12411
|
{
|
|
11651
12412
|
isOpen: isAddTaskModalOpen,
|
|
@@ -11657,7 +12418,7 @@ function ProjectView({
|
|
|
11657
12418
|
defaultEpicId: selectedEpicForTask || void 0
|
|
11658
12419
|
}
|
|
11659
12420
|
),
|
|
11660
|
-
/* @__PURE__ */ (0,
|
|
12421
|
+
/* @__PURE__ */ (0, import_jsx_runtime60.jsx)(
|
|
11661
12422
|
AddEpicModal,
|
|
11662
12423
|
{
|
|
11663
12424
|
isOpen: isAddEpicModalOpen,
|
|
@@ -11669,7 +12430,7 @@ function ProjectView({
|
|
|
11669
12430
|
}
|
|
11670
12431
|
|
|
11671
12432
|
// src/components/Projects/ProjectPage.tsx
|
|
11672
|
-
var
|
|
12433
|
+
var import_jsx_runtime61 = require("react/jsx-runtime");
|
|
11673
12434
|
function ProjectPage({
|
|
11674
12435
|
title = "",
|
|
11675
12436
|
projects,
|
|
@@ -11705,8 +12466,8 @@ function ProjectPage({
|
|
|
11705
12466
|
onTeamChange,
|
|
11706
12467
|
onCopilotClick
|
|
11707
12468
|
}) {
|
|
11708
|
-
const [activeTab, setActiveTab] = (0,
|
|
11709
|
-
const [currentBusinessUnit, setCurrentBusinessUnit] = (0,
|
|
12469
|
+
const [activeTab, setActiveTab] = (0, import_react35.useState)("projects");
|
|
12470
|
+
const [currentBusinessUnit, setCurrentBusinessUnit] = (0, import_react35.useState)(businessUnits3[0]);
|
|
11710
12471
|
const handleAppOpen = (app) => {
|
|
11711
12472
|
console.log("Opening app:", app.name);
|
|
11712
12473
|
};
|
|
@@ -11731,7 +12492,7 @@ function ProjectPage({
|
|
|
11731
12492
|
const renderTabContent = () => {
|
|
11732
12493
|
switch (activeTab) {
|
|
11733
12494
|
case "projects":
|
|
11734
|
-
return /* @__PURE__ */ (0,
|
|
12495
|
+
return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
11735
12496
|
ProjectView,
|
|
11736
12497
|
{
|
|
11737
12498
|
initialProjects: projects,
|
|
@@ -11763,8 +12524,8 @@ function ProjectPage({
|
|
|
11763
12524
|
return null;
|
|
11764
12525
|
}
|
|
11765
12526
|
};
|
|
11766
|
-
return /* @__PURE__ */ (0,
|
|
11767
|
-
|
|
12527
|
+
return /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
12528
|
+
FoundryLayout,
|
|
11768
12529
|
{
|
|
11769
12530
|
sidebarItems: mockSidebarItems,
|
|
11770
12531
|
title,
|
|
@@ -11775,8 +12536,8 @@ function ProjectPage({
|
|
|
11775
12536
|
activeTab,
|
|
11776
12537
|
onTabChange: setActiveTab,
|
|
11777
12538
|
showTabs: true,
|
|
11778
|
-
children: /* @__PURE__ */ (0,
|
|
11779
|
-
|
|
12539
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(import_react36.AnimatePresence, { mode: "wait", children: /* @__PURE__ */ (0, import_jsx_runtime61.jsx)(
|
|
12540
|
+
import_react36.motion.div,
|
|
11780
12541
|
{
|
|
11781
12542
|
initial: { opacity: 0, y: 10 },
|
|
11782
12543
|
animate: { opacity: 1, y: 0 },
|