@burdenoff/microfe-crewfoundry 2026.731.1 → 2026.802.1
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/crewfoundry/CrewFoundryRoutes.js +1 -1
- package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
- package/dist/crewfoundry/components/forms/FormModal.d.ts.map +1 -1
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +1 -1
- package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/providers/CrewFoundryProvider.js +1 -1
- package/dist/crewfoundry/providers/CrewFoundryProvider.js.map +1 -1
- package/package.json +6 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AdminAdminPagePage as e } from "./pages/AdminAdminPagePage.js";
|
|
2
2
|
import { Suspense as t, lazy as n } from "react";
|
|
3
3
|
import { Loader2 as ee } from "lucide-react";
|
|
4
|
-
import { Navigate as r, Route as i, Routes as a } from "react-router
|
|
4
|
+
import { Navigate as r, Route as i, Routes as a } from "react-router";
|
|
5
5
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
6
|
//#region src/crewfoundry/CrewFoundryRoutes.tsx
|
|
7
7
|
var c = n(() => import("./pages/AnalyticsAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsAnalyticsPagePage }))), l = n(() => import("./pages/AnalyticsEmployeeAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsEmployeeAnalyticsPagePage }))), u = n(() => import("./pages/AnalyticsFinancialAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsFinancialAnalyticsPagePage }))), d = n(() => import("./pages/AnalyticsHiringAnalyticsPagePage.js").then((e) => ({ default: e.AnalyticsHiringAnalyticsPagePage }))), f = n(() => import("./pages/CommunicationsAnnouncementsPagePage.js").then((e) => ({ default: e.CommunicationsAnnouncementsPagePage }))), p = n(() => import("./pages/CommunicationsCallsPagePage.js").then((e) => ({ default: e.CommunicationsCallsPagePage }))), m = n(() => import("./pages/CommunicationsDirectoryPagePage.js").then((e) => ({ default: e.CommunicationsDirectoryPagePage }))), h = n(() => import("./pages/CommunicationsFilesPagePage.js").then((e) => ({ default: e.CommunicationsFilesPagePage }))), g = n(() => import("./pages/CommunicationsMessagesPagePage.js").then((e) => ({ default: e.CommunicationsMessagesPagePage }))), _ = n(() => import("./pages/CommunicationsTeamsPagePage.js").then((e) => ({ default: e.CommunicationsTeamsPagePage }))), v = n(() => import("./pages/CommunicationsVideoCallsPagePage.js").then((e) => ({ default: e.CommunicationsVideoCallsPagePage }))), y = n(() => import("./pages/CompanyClientManagementPagePage.js").then((e) => ({ default: e.CompanyClientManagementPagePage }))), b = n(() => import("./pages/CompanyCompanyDashboardPagePage.js").then((e) => ({ default: e.CompanyCompanyDashboardPagePage }))), x = n(() => import("./pages/CompanyVendorManagementPagePage.js").then((e) => ({ default: e.CompanyVendorManagementPagePage }))), S = n(() => import("./pages/DashboardAnalyticsPagePage.js").then((e) => ({ default: e.DashboardAnalyticsPagePage }))), C = n(() => import("./pages/DashboardDashboardPagePage.js").then((e) => ({ default: e.DashboardDashboardPagePage }))), w = n(() => import("./pages/DashboardEnhancedDashboardPagePage.js").then((e) => ({ default: e.DashboardEnhancedDashboardPagePage }))), T = n(() => import("./pages/DashboardExecutiveDashboardPage.js").then((e) => ({ default: e.DashboardExecutiveDashboardPage }))), E = n(() => import("./pages/HiringApplicationsPagePage.js").then((e) => ({ default: e.HiringApplicationsPagePage }))), D = n(() => import("./pages/HiringCandidatesPagePage.js").then((e) => ({ default: e.HiringCandidatesPagePage }))), O = n(() => import("./pages/HiringCreateJobPagePage.js").then((e) => ({ default: e.HiringCreateJobPagePage }))), k = n(() => import("./pages/HiringInterviewsPagePage.js").then((e) => ({ default: e.HiringInterviewsPagePage }))), A = n(() => import("./pages/HiringOnboardingPagePage.js").then((e) => ({ default: e.HiringOnboardingPagePage }))), j = n(() => import("./pages/HiringJobDetailsPagePage.js").then((e) => ({ default: e.HiringJobDetailsPagePage }))), M = n(() => import("./pages/HiringJobsPagePage.js").then((e) => ({ default: e.HiringJobsPagePage }))), N = n(() => import("./pages/HrDepartmentsPagePage.js").then((e) => ({ default: e.HrDepartmentsPagePage }))), P = n(() => import("./pages/HrEmployeesPagePage.js").then((e) => ({ default: e.HrEmployeesPagePage }))), F = n(() => import("./pages/HrEmployeeProfilePagePage.js").then((e) => ({ default: e.HrEmployeeProfilePagePage }))), I = n(() => import("./pages/HrLeaveManagementPagePage.js").then((e) => ({ default: e.HrLeaveManagementPagePage }))), L = n(() => import("./pages/HrPayrollPagePage.js").then((e) => ({ default: e.HrPayrollPagePage }))), R = n(() => import("./pages/HrTimeTrackingPagePage.js").then((e) => ({ default: e.HrTimeTrackingPagePage }))), z = n(() => import("./pages/LearningAssessmentsPagePage.js").then((e) => ({ default: e.LearningAssessmentsPagePage }))), B = n(() => import("./pages/LearningCertificatesPagePage.js").then((e) => ({ default: e.LearningCertificatesPagePage }))), V = n(() => import("./pages/LearningCourseDetailsPagePage.js").then((e) => ({ default: e.LearningCourseDetailsPagePage }))), H = n(() => import("./pages/LearningCourseLearningPagePage.js").then((e) => ({ default: e.LearningCourseLearningPagePage }))), U = n(() => import("./pages/LearningCoursesPagePage.js").then((e) => ({ default: e.LearningCoursesPagePage }))), te = n(() => import("./pages/LearningLearningAnalyticsPagePage.js").then((e) => ({ default: e.LearningLearningAnalyticsPagePage }))), W = n(() => import("./pages/LearningLearningPagePage.js").then((e) => ({ default: e.LearningLearningPagePage }))), G = n(() => import("./pages/LearningLearningPathDetailPagePage.js").then((e) => ({ default: e.LearningLearningPathDetailPagePage }))), K = n(() => import("./pages/LearningLearningPathsPagePage.js").then((e) => ({ default: e.LearningLearningPathsPagePage }))), q = n(() => import("./pages/LearningMyLearningPagePage.js").then((e) => ({ default: e.LearningMyLearningPagePage }))), J = n(() => import("./pages/MarketplaceBookingManagementPagePage.js").then((e) => ({ default: e.MarketplaceBookingManagementPagePage }))), Y = n(() => import("./pages/MarketplaceEarningsPagePage.js").then((e) => ({ default: e.MarketplaceEarningsPagePage }))), X = n(() => import("./pages/MarketplaceMarketplacePagePage.js").then((e) => ({ default: e.MarketplaceMarketplacePagePage }))), Z = n(() => import("./pages/MarketplaceMarketplaceServicesPagePage.js").then((e) => ({ default: e.MarketplaceMarketplaceServicesPagePage }))), Q = n(() => import("./pages/MarketplaceMessagingPagePage.js").then((e) => ({ default: e.MarketplaceMessagingPagePage }))), ne = n(() => import("./pages/MarketplaceMyServicesPagePage.js").then((e) => ({ default: e.MarketplaceMyServicesPagePage }))), re = n(() => import("./pages/MarketplaceProjectDetailsPagePage.js").then((e) => ({ default: e.MarketplaceProjectDetailsPagePage }))), ie = n(() => import("./pages/MarketplaceServiceDetailsPagePage.js").then((e) => ({ default: e.MarketplaceServiceDetailsPagePage }))), ae = n(() => import("./pages/PaymentsEscrowPagePage.js").then((e) => ({ default: e.PaymentsEscrowPagePage }))), oe = n(() => import("./pages/PaymentsInvoicesPagePage.js").then((e) => ({ default: e.PaymentsInvoicesPagePage }))), se = n(() => import("./pages/PaymentsPaymentDashboardPagePage.js").then((e) => ({ default: e.PaymentsPaymentDashboardPagePage }))), ce = n(() => import("./pages/PaymentsPaymentMethodsPagePage.js").then((e) => ({ default: e.PaymentsPaymentMethodsPagePage }))), le = n(() => import("./pages/PaymentsSecurityPagePage.js").then((e) => ({ default: e.PaymentsSecurityPagePage }))), ue = n(() => import("./pages/ProjectsCreateProjectPagePage.js").then((e) => ({ default: e.ProjectsCreateProjectPagePage }))), de = n(() => import("./pages/ProjectsProjectDetailsPagePage.js").then((e) => ({ default: e.ProjectsProjectDetailsPagePage }))), fe = n(() => import("./pages/ProjectsProjectsPagePage.js").then((e) => ({ default: e.ProjectsProjectsPagePage }))), pe = n(() => import("./pages/ProjectsResourcingPagePage.js").then((e) => ({ default: e.ProjectsResourcingPagePage }))), $ = n(() => import("./pages/TeamsTeamAnalyticsPagePage.js").then((e) => ({ default: e.TeamsTeamAnalyticsPagePage }))), me = n(() => import("./pages/TeamsTeamDetailPagePage.js").then((e) => ({ default: e.TeamsTeamDetailPagePage }))), he = n(() => import("./pages/TeamsTeamDirectoryPagePage.js").then((e) => ({ default: e.TeamsTeamDirectoryPagePage }))), ge = n(() => import("./pages/TeamsTeamsPagePage.js").then((e) => ({ default: e.TeamsTeamsPagePage }))), _e = n(() => import("./pages/HelpApiDocumentationPagePage.js").then((e) => ({ default: e.HelpApiDocumentationPagePage }))), ve = n(() => import("./pages/CompanyCompanyProfilePagePage.js").then((e) => ({ default: e.CompanyCompanyProfilePagePage }))), ye = n(() => import("./pages/MarketplaceFreelancerProfilePagePage.js").then((e) => ({ default: e.MarketplaceFreelancerProfilePagePage }))), be = n(() => import("./pages/MarketplaceFreelancerProfilePageEnhancedPage.js").then((e) => ({ default: e.MarketplaceFreelancerProfilePageEnhancedPage }))), xe = n(() => import("./pages/TeamsTeamSettingsPagePage.js").then((e) => ({ default: e.TeamsTeamSettingsPagePage })));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CrewFoundryRoutes.js","names":[],"sources":["../../src/crewfoundry/CrewFoundryRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\nimport { AdminAdminPagePage as IndexPage } from './pages/AdminAdminPagePage';\n\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AnalyticsEmployeeAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsEmployeeAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsEmployeeAnalyticsPagePage,\n }))\n);\nconst AnalyticsFinancialAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsFinancialAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsFinancialAnalyticsPagePage,\n }))\n);\nconst AnalyticsHiringAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsHiringAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsHiringAnalyticsPagePage,\n }))\n);\nconst CommunicationsAnnouncementsPagePage = lazy(() =>\n import('./pages/CommunicationsAnnouncementsPagePage').then((m) => ({\n default: m.CommunicationsAnnouncementsPagePage,\n }))\n);\nconst CommunicationsCallsPagePage = lazy(() =>\n import('./pages/CommunicationsCallsPagePage').then((m) => ({\n default: m.CommunicationsCallsPagePage,\n }))\n);\nconst CommunicationsDirectoryPagePage = lazy(() =>\n import('./pages/CommunicationsDirectoryPagePage').then((m) => ({\n default: m.CommunicationsDirectoryPagePage,\n }))\n);\nconst CommunicationsFilesPagePage = lazy(() =>\n import('./pages/CommunicationsFilesPagePage').then((m) => ({\n default: m.CommunicationsFilesPagePage,\n }))\n);\nconst CommunicationsMessagesPagePage = lazy(() =>\n import('./pages/CommunicationsMessagesPagePage').then((m) => ({\n default: m.CommunicationsMessagesPagePage,\n }))\n);\nconst CommunicationsTeamsPagePage = lazy(() =>\n import('./pages/CommunicationsTeamsPagePage').then((m) => ({\n default: m.CommunicationsTeamsPagePage,\n }))\n);\nconst CommunicationsVideoCallsPagePage = lazy(() =>\n import('./pages/CommunicationsVideoCallsPagePage').then((m) => ({\n default: m.CommunicationsVideoCallsPagePage,\n }))\n);\nconst CompanyClientManagementPagePage = lazy(() =>\n import('./pages/CompanyClientManagementPagePage').then((m) => ({\n default: m.CompanyClientManagementPagePage,\n }))\n);\nconst CompanyCompanyDashboardPagePage = lazy(() =>\n import('./pages/CompanyCompanyDashboardPagePage').then((m) => ({\n default: m.CompanyCompanyDashboardPagePage,\n }))\n);\nconst CompanyVendorManagementPagePage = lazy(() =>\n import('./pages/CompanyVendorManagementPagePage').then((m) => ({\n default: m.CompanyVendorManagementPagePage,\n }))\n);\nconst DashboardAnalyticsPagePage = lazy(() =>\n import('./pages/DashboardAnalyticsPagePage').then((m) => ({\n default: m.DashboardAnalyticsPagePage,\n }))\n);\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst DashboardEnhancedDashboardPagePage = lazy(() =>\n import('./pages/DashboardEnhancedDashboardPagePage').then((m) => ({\n default: m.DashboardEnhancedDashboardPagePage,\n }))\n);\nconst DashboardExecutiveDashboardPage = lazy(() =>\n import('./pages/DashboardExecutiveDashboardPage').then((m) => ({\n default: m.DashboardExecutiveDashboardPage,\n }))\n);\nconst HiringApplicationsPagePage = lazy(() =>\n import('./pages/HiringApplicationsPagePage').then((m) => ({\n default: m.HiringApplicationsPagePage,\n }))\n);\nconst HiringCandidatesPagePage = lazy(() =>\n import('./pages/HiringCandidatesPagePage').then((m) => ({ default: m.HiringCandidatesPagePage }))\n);\nconst HiringCreateJobPagePage = lazy(() =>\n import('./pages/HiringCreateJobPagePage').then((m) => ({ default: m.HiringCreateJobPagePage }))\n);\nconst HiringInterviewsPagePage = lazy(() =>\n import('./pages/HiringInterviewsPagePage').then((m) => ({ default: m.HiringInterviewsPagePage }))\n);\nconst HiringOnboardingPagePage = lazy(() =>\n import('./pages/HiringOnboardingPagePage').then((m) => ({ default: m.HiringOnboardingPagePage }))\n);\nconst HiringJobDetailsPagePage = lazy(() =>\n import('./pages/HiringJobDetailsPagePage').then((m) => ({ default: m.HiringJobDetailsPagePage }))\n);\nconst HiringJobsPagePage = lazy(() =>\n import('./pages/HiringJobsPagePage').then((m) => ({ default: m.HiringJobsPagePage }))\n);\nconst HrDepartmentsPagePage = lazy(() =>\n import('./pages/HrDepartmentsPagePage').then((m) => ({ default: m.HrDepartmentsPagePage }))\n);\nconst HrEmployeesPagePage = lazy(() =>\n import('./pages/HrEmployeesPagePage').then((m) => ({ default: m.HrEmployeesPagePage }))\n);\nconst HrEmployeeProfilePagePage = lazy(() =>\n import('./pages/HrEmployeeProfilePagePage').then((m) => ({\n default: m.HrEmployeeProfilePagePage,\n }))\n);\nconst HrLeaveManagementPagePage = lazy(() =>\n import('./pages/HrLeaveManagementPagePage').then((m) => ({\n default: m.HrLeaveManagementPagePage,\n }))\n);\nconst HrPayrollPagePage = lazy(() =>\n import('./pages/HrPayrollPagePage').then((m) => ({ default: m.HrPayrollPagePage }))\n);\nconst HrTimeTrackingPagePage = lazy(() =>\n import('./pages/HrTimeTrackingPagePage').then((m) => ({ default: m.HrTimeTrackingPagePage }))\n);\nconst LearningAssessmentsPagePage = lazy(() =>\n import('./pages/LearningAssessmentsPagePage').then((m) => ({\n default: m.LearningAssessmentsPagePage,\n }))\n);\nconst LearningCertificatesPagePage = lazy(() =>\n import('./pages/LearningCertificatesPagePage').then((m) => ({\n default: m.LearningCertificatesPagePage,\n }))\n);\nconst LearningCourseDetailsPagePage = lazy(() =>\n import('./pages/LearningCourseDetailsPagePage').then((m) => ({\n default: m.LearningCourseDetailsPagePage,\n }))\n);\nconst LearningCourseLearningPagePage = lazy(() =>\n import('./pages/LearningCourseLearningPagePage').then((m) => ({\n default: m.LearningCourseLearningPagePage,\n }))\n);\nconst LearningCoursesPagePage = lazy(() =>\n import('./pages/LearningCoursesPagePage').then((m) => ({ default: m.LearningCoursesPagePage }))\n);\nconst LearningLearningAnalyticsPagePage = lazy(() =>\n import('./pages/LearningLearningAnalyticsPagePage').then((m) => ({\n default: m.LearningLearningAnalyticsPagePage,\n }))\n);\nconst LearningLearningPagePage = lazy(() =>\n import('./pages/LearningLearningPagePage').then((m) => ({ default: m.LearningLearningPagePage }))\n);\nconst LearningLearningPathDetailPagePage = lazy(() =>\n import('./pages/LearningLearningPathDetailPagePage').then((m) => ({\n default: m.LearningLearningPathDetailPagePage,\n }))\n);\nconst LearningLearningPathsPagePage = lazy(() =>\n import('./pages/LearningLearningPathsPagePage').then((m) => ({\n default: m.LearningLearningPathsPagePage,\n }))\n);\nconst LearningMyLearningPagePage = lazy(() =>\n import('./pages/LearningMyLearningPagePage').then((m) => ({\n default: m.LearningMyLearningPagePage,\n }))\n);\nconst MarketplaceBookingManagementPagePage = lazy(() =>\n import('./pages/MarketplaceBookingManagementPagePage').then((m) => ({\n default: m.MarketplaceBookingManagementPagePage,\n }))\n);\nconst MarketplaceEarningsPagePage = lazy(() =>\n import('./pages/MarketplaceEarningsPagePage').then((m) => ({\n default: m.MarketplaceEarningsPagePage,\n }))\n);\nconst MarketplaceMarketplacePagePage = lazy(() =>\n import('./pages/MarketplaceMarketplacePagePage').then((m) => ({\n default: m.MarketplaceMarketplacePagePage,\n }))\n);\nconst MarketplaceMarketplaceServicesPagePage = lazy(() =>\n import('./pages/MarketplaceMarketplaceServicesPagePage').then((m) => ({\n default: m.MarketplaceMarketplaceServicesPagePage,\n }))\n);\nconst MarketplaceMessagingPagePage = lazy(() =>\n import('./pages/MarketplaceMessagingPagePage').then((m) => ({\n default: m.MarketplaceMessagingPagePage,\n }))\n);\nconst MarketplaceMyServicesPagePage = lazy(() =>\n import('./pages/MarketplaceMyServicesPagePage').then((m) => ({\n default: m.MarketplaceMyServicesPagePage,\n }))\n);\nconst MarketplaceProjectDetailsPagePage = lazy(() =>\n import('./pages/MarketplaceProjectDetailsPagePage').then((m) => ({\n default: m.MarketplaceProjectDetailsPagePage,\n }))\n);\nconst MarketplaceServiceDetailsPagePage = lazy(() =>\n import('./pages/MarketplaceServiceDetailsPagePage').then((m) => ({\n default: m.MarketplaceServiceDetailsPagePage,\n }))\n);\nconst PaymentsEscrowPagePage = lazy(() =>\n import('./pages/PaymentsEscrowPagePage').then((m) => ({ default: m.PaymentsEscrowPagePage }))\n);\nconst PaymentsInvoicesPagePage = lazy(() =>\n import('./pages/PaymentsInvoicesPagePage').then((m) => ({ default: m.PaymentsInvoicesPagePage }))\n);\nconst PaymentsPaymentDashboardPagePage = lazy(() =>\n import('./pages/PaymentsPaymentDashboardPagePage').then((m) => ({\n default: m.PaymentsPaymentDashboardPagePage,\n }))\n);\nconst PaymentsPaymentMethodsPagePage = lazy(() =>\n import('./pages/PaymentsPaymentMethodsPagePage').then((m) => ({\n default: m.PaymentsPaymentMethodsPagePage,\n }))\n);\nconst PaymentsSecurityPagePage = lazy(() =>\n import('./pages/PaymentsSecurityPagePage').then((m) => ({ default: m.PaymentsSecurityPagePage }))\n);\nconst ProjectsCreateProjectPagePage = lazy(() =>\n import('./pages/ProjectsCreateProjectPagePage').then((m) => ({\n default: m.ProjectsCreateProjectPagePage,\n }))\n);\nconst ProjectsProjectDetailsPagePage = lazy(() =>\n import('./pages/ProjectsProjectDetailsPagePage').then((m) => ({\n default: m.ProjectsProjectDetailsPagePage,\n }))\n);\nconst ProjectsProjectsPagePage = lazy(() =>\n import('./pages/ProjectsProjectsPagePage').then((m) => ({ default: m.ProjectsProjectsPagePage }))\n);\nconst ProjectsResourcingPagePage = lazy(() =>\n import('./pages/ProjectsResourcingPagePage').then((m) => ({\n default: m.ProjectsResourcingPagePage,\n }))\n);\nconst TeamsTeamAnalyticsPagePage = lazy(() =>\n import('./pages/TeamsTeamAnalyticsPagePage').then((m) => ({\n default: m.TeamsTeamAnalyticsPagePage,\n }))\n);\nconst TeamsTeamDetailPagePage = lazy(() =>\n import('./pages/TeamsTeamDetailPagePage').then((m) => ({ default: m.TeamsTeamDetailPagePage }))\n);\nconst TeamsTeamDirectoryPagePage = lazy(() =>\n import('./pages/TeamsTeamDirectoryPagePage').then((m) => ({\n default: m.TeamsTeamDirectoryPagePage,\n }))\n);\nconst TeamsTeamsPagePage = lazy(() =>\n import('./pages/TeamsTeamsPagePage').then((m) => ({ default: m.TeamsTeamsPagePage }))\n);\nconst HelpApiDocumentationPagePage = lazy(() =>\n import('./pages/HelpApiDocumentationPagePage').then((m) => ({\n default: m.HelpApiDocumentationPagePage,\n }))\n);\nconst CompanyCompanyProfilePagePage = lazy(() =>\n import('./pages/CompanyCompanyProfilePagePage').then((m) => ({\n default: m.CompanyCompanyProfilePagePage,\n }))\n);\nconst MarketplaceFreelancerProfilePagePage = lazy(() =>\n import('./pages/MarketplaceFreelancerProfilePagePage').then((m) => ({\n default: m.MarketplaceFreelancerProfilePagePage,\n }))\n);\nconst MarketplaceFreelancerProfilePageEnhancedPage = lazy(() =>\n import('./pages/MarketplaceFreelancerProfilePageEnhancedPage').then((m) => ({\n default: m.MarketplaceFreelancerProfilePageEnhancedPage,\n }))\n);\nconst TeamsTeamSettingsPagePage = lazy(() =>\n import('./pages/TeamsTeamSettingsPagePage').then((m) => ({\n default: m.TeamsTeamSettingsPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function CrewFoundryRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<IndexPage />} />\n <Route path=\"analytics/analytics-page\" element={<AnalyticsAnalyticsPagePage />} />\n <Route\n path=\"analytics/employee-analytics-page\"\n element={<AnalyticsEmployeeAnalyticsPagePage />}\n />\n <Route\n path=\"analytics/financial-analytics-page\"\n element={<AnalyticsFinancialAnalyticsPagePage />}\n />\n <Route\n path=\"analytics/hiring-analytics-page\"\n element={<AnalyticsHiringAnalyticsPagePage />}\n />\n <Route\n path=\"communications/announcements-page\"\n element={<CommunicationsAnnouncementsPagePage />}\n />\n <Route path=\"communications/calls-page\" element={<CommunicationsCallsPagePage />} />\n <Route path=\"communications/directory-page\" element={<CommunicationsDirectoryPagePage />} />\n <Route path=\"communications/files-page\" element={<CommunicationsFilesPagePage />} />\n <Route path=\"communications/messages-page\" element={<CommunicationsMessagesPagePage />} />\n <Route path=\"communications/teams-page\" element={<CommunicationsTeamsPagePage />} />\n <Route\n path=\"communications/video-calls-page\"\n element={<CommunicationsVideoCallsPagePage />}\n />\n <Route\n path=\"company/client-management-page\"\n element={<CompanyClientManagementPagePage />}\n />\n <Route\n path=\"company/company-dashboard-page\"\n element={<CompanyCompanyDashboardPagePage />}\n />\n <Route\n path=\"company/vendor-management-page\"\n element={<CompanyVendorManagementPagePage />}\n />\n <Route path=\"dashboard/analytics-page\" element={<DashboardAnalyticsPagePage />} />\n <Route path=\"dashboard/dashboard-page\" element={<DashboardDashboardPagePage />} />\n <Route\n path=\"dashboard/enhanced-dashboard-page\"\n element={<DashboardEnhancedDashboardPagePage />}\n />\n <Route path=\"dashboard/executive-dashboard\" element={<DashboardExecutiveDashboardPage />} />\n <Route path=\"hiring/applications-page\" element={<HiringApplicationsPagePage />} />\n <Route path=\"hiring/candidates-page\" element={<HiringCandidatesPagePage />} />\n <Route path=\"hiring/create-job-page\" element={<HiringCreateJobPagePage />} />\n <Route path=\"hiring/interviews-page\" element={<HiringInterviewsPagePage />} />\n <Route path=\"hiring/onboarding-page\" element={<HiringOnboardingPagePage />} />\n <Route path=\"hiring/job-details-page\" element={<HiringJobDetailsPagePage />} />\n <Route path=\"hiring/jobs-page\" element={<HiringJobsPagePage />} />\n <Route path=\"hr/departments-page\" element={<HrDepartmentsPagePage />} />\n <Route path=\"hr/employees-page\" element={<HrEmployeesPagePage />} />\n <Route path=\"hr/employee-profile-page\" element={<HrEmployeeProfilePagePage />} />\n <Route path=\"hr/leave-management-page\" element={<HrLeaveManagementPagePage />} />\n <Route path=\"hr/payroll-page\" element={<HrPayrollPagePage />} />\n <Route path=\"hr/time-tracking-page\" element={<HrTimeTrackingPagePage />} />\n <Route path=\"learning/assessments-page\" element={<LearningAssessmentsPagePage />} />\n <Route path=\"learning/certificates-page\" element={<LearningCertificatesPagePage />} />\n <Route path=\"learning/course-details-page\" element={<LearningCourseDetailsPagePage />} />\n <Route path=\"learning/course-learning-page\" element={<LearningCourseLearningPagePage />} />\n <Route path=\"learning/courses-page\" element={<LearningCoursesPagePage />} />\n <Route\n path=\"learning/learning-analytics-page\"\n element={<LearningLearningAnalyticsPagePage />}\n />\n <Route path=\"learning/learning-page\" element={<LearningLearningPagePage />} />\n <Route\n path=\"learning/learning-path-detail-page\"\n element={<LearningLearningPathDetailPagePage />}\n />\n <Route path=\"learning/learning-paths-page\" element={<LearningLearningPathsPagePage />} />\n <Route path=\"learning/my-learning-page\" element={<LearningMyLearningPagePage />} />\n <Route\n path=\"marketplace/booking-management-page\"\n element={<MarketplaceBookingManagementPagePage />}\n />\n <Route path=\"marketplace/earnings-page\" element={<MarketplaceEarningsPagePage />} />\n <Route path=\"marketplace/marketplace-page\" element={<MarketplaceMarketplacePagePage />} />\n <Route\n path=\"marketplace/marketplace-services-page\"\n element={<MarketplaceMarketplaceServicesPagePage />}\n />\n <Route path=\"marketplace/messaging-page\" element={<MarketplaceMessagingPagePage />} />\n <Route path=\"marketplace/my-services-page\" element={<MarketplaceMyServicesPagePage />} />\n <Route\n path=\"marketplace/project-details-page\"\n element={<MarketplaceProjectDetailsPagePage />}\n />\n <Route\n path=\"marketplace/service-details-page\"\n element={<MarketplaceServiceDetailsPagePage />}\n />\n <Route path=\"payments/escrow-page\" element={<PaymentsEscrowPagePage />} />\n <Route path=\"payments/invoices-page\" element={<PaymentsInvoicesPagePage />} />\n <Route\n path=\"payments/payment-dashboard-page\"\n element={<PaymentsPaymentDashboardPagePage />}\n />\n <Route path=\"payments/payment-methods-page\" element={<PaymentsPaymentMethodsPagePage />} />\n <Route path=\"payments/security-page\" element={<PaymentsSecurityPagePage />} />\n <Route path=\"projects/create-project-page\" element={<ProjectsCreateProjectPagePage />} />\n <Route path=\"projects/project-details-page\" element={<ProjectsProjectDetailsPagePage />} />\n <Route path=\"projects/projects-page\" element={<ProjectsProjectsPagePage />} />\n <Route path=\"projects/resourcing-page\" element={<ProjectsResourcingPagePage />} />\n <Route path=\"teams/team-analytics-page\" element={<TeamsTeamAnalyticsPagePage />} />\n <Route path=\"teams/team-detail-page\" element={<TeamsTeamDetailPagePage />} />\n <Route path=\"teams/team-directory-page\" element={<TeamsTeamDirectoryPagePage />} />\n <Route path=\"teams/teams-page\" element={<TeamsTeamsPagePage />} />\n <Route path=\"teams/team-settings-page\" element={<TeamsTeamSettingsPagePage />} />\n <Route path=\"help/api-documentation-page\" element={<HelpApiDocumentationPagePage />} />\n <Route path=\"company/company-profile-page\" element={<CompanyCompanyProfilePagePage />} />\n <Route\n path=\"marketplace/freelancer-profile-page\"\n element={<MarketplaceFreelancerProfilePagePage />}\n />\n <Route\n path=\"marketplace/freelancer-profile-page-enhanced\"\n element={<MarketplaceFreelancerProfilePageEnhancedPage />}\n />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":";;;;;;AAKA,IAAM,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAAqC,QACzC,OAAO,iDAA8C,MAAM,OAAO,EAChE,SAAS,EAAE,oCACZ,EAAE,CACJ,EACK,IAAsC,QAC1C,OAAO,kDAA+C,MAAM,OAAO,EACjE,SAAS,EAAE,qCACZ,EAAE,CACJ,EACK,IAAmC,QACvC,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,kCACZ,EAAE,CACJ,EACK,IAAsC,QAC1C,OAAO,kDAA+C,MAAM,OAAO,EACjE,SAAS,EAAE,qCACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAAiC,QACrC,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,gCACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAAmC,QACvC,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,kCACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAAqC,QACzC,OAAO,iDAA8C,MAAM,OAAO,EAChE,SAAS,EAAE,oCACZ,EAAE,CACJ,EACK,IAAkC,QACtC,OAAO,8CAA2C,MAAM,OAAO,EAC7D,SAAS,EAAE,iCACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,IAA0B,QAC9B,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAChG,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,IAAqB,QACzB,OAAO,iCAA8B,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CACtF,EACK,IAAwB,QAC5B,OAAO,oCAAiC,MAAM,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAC5F,EACK,IAAsB,QAC1B,OAAO,kCAA+B,MAAM,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,CACxF,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ,EACK,IAAoB,QACxB,OAAO,gCAA6B,MAAM,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,CACpF,EACK,IAAyB,QAC7B,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAC9F,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,IAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ,EACK,IAAiC,QACrC,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,gCACZ,EAAE,CACJ,EACK,IAA0B,QAC9B,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAChG,EACK,KAAoC,QACxC,OAAO,gDAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,mCACZ,EAAE,CACJ,EACK,IAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,IAAqC,QACzC,OAAO,iDAA8C,MAAM,OAAO,EAChE,SAAS,EAAE,oCACZ,EAAE,CACJ,EACK,IAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAAuC,QAC3C,OAAO,mDAAgD,MAAM,OAAO,EAClE,SAAS,EAAE,sCACZ,EAAE,CACJ,EACK,IAA8B,QAClC,OAAO,0CAAuC,MAAM,OAAO,EACzD,SAAS,EAAE,6BACZ,EAAE,CACJ,EACK,IAAiC,QACrC,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,gCACZ,EAAE,CACJ,EACK,IAAyC,QAC7C,OAAO,qDAAkD,MAAM,OAAO,EACpE,SAAS,EAAE,wCACZ,EAAE,CACJ,EACK,IAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,KAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ,EACK,KAAoC,QACxC,OAAO,gDAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,mCACZ,EAAE,CACJ,EACK,KAAoC,QACxC,OAAO,gDAA6C,MAAM,OAAO,EAC/D,SAAS,EAAE,mCACZ,EAAE,CACJ,EACK,KAAyB,QAC7B,OAAO,qCAAkC,MAAM,OAAO,EAAE,SAAS,EAAE,wBAAwB,EAAE,CAC9F,EACK,KAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,KAAmC,QACvC,OAAO,+CAA4C,MAAM,OAAO,EAC9D,SAAS,EAAE,kCACZ,EAAE,CACJ,EACK,KAAiC,QACrC,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,gCACZ,EAAE,CACJ,EACK,KAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,KAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ,EACK,KAAiC,QACrC,OAAO,6CAA0C,MAAM,OAAO,EAC5D,SAAS,EAAE,gCACZ,EAAE,CACJ,EACK,KAA2B,QAC/B,OAAO,uCAAoC,MAAM,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,CAClG,EACK,KAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,IAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,KAA0B,QAC9B,OAAO,sCAAmC,MAAM,OAAO,EAAE,SAAS,EAAE,yBAAyB,EAAE,CAChG,EACK,KAA6B,QACjC,OAAO,yCAAsC,MAAM,OAAO,EACxD,SAAS,EAAE,4BACZ,EAAE,CACJ,EACK,KAAqB,QACzB,OAAO,iCAA8B,MAAM,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CACtF,EACK,KAA+B,QACnC,OAAO,2CAAwC,MAAM,OAAO,EAC1D,SAAS,EAAE,8BACZ,EAAE,CACJ,EACK,KAAgC,QACpC,OAAO,4CAAyC,MAAM,OAAO,EAC3D,SAAS,EAAE,+BACZ,EAAE,CACJ,EACK,KAAuC,QAC3C,OAAO,mDAAgD,MAAM,OAAO,EAClE,SAAS,EAAE,sCACZ,EAAE,CACJ,EACK,KAA+C,QACnD,OAAO,2DAAwD,MAAM,OAAO,EAC1E,SAAS,EAAE,8CACZ,EAAE,CACJ,EACK,KAA4B,QAChC,OAAO,wCAAqC,MAAM,OAAO,EACvD,SAAS,EAAE,2BACZ,EAAE,CACJ;AAED,SAAS,KAAa;AACpB,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,IAAD,EAAS,WAAU,qCAAsC,CAAA;EACrD,CAAA;;AAIV,SAAgB,KAAoB;AAClC,QACE,kBAAC,GAAD;EAAU,UAAU,kBAAC,IAAD,EAAc,CAAA;YAChC,kBAAC,GAAD,EAAA,UAAA;GACE,kBAAC,GAAD;IAAO,OAAA;IAAM,SAAS,kBAAC,GAAD,EAAa,CAAA;IAAI,CAAA;GACvC,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GAClF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAsC,CAAA;IAC/C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAuC,CAAA;IAChD,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAoC,CAAA;IAC7C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAuC,CAAA;IAChD,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA+B,CAAA;IAAI,CAAA;GACpF,kBAAC,GAAD;IAAO,MAAK;IAAgC,SAAS,kBAAC,GAAD,EAAmC,CAAA;IAAI,CAAA;GAC5F,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA+B,CAAA;IAAI,CAAA;GACpF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,GAAD,EAAkC,CAAA;IAAI,CAAA;GAC1F,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA+B,CAAA;IAAI,CAAA;GACpF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAoC,CAAA;IAC7C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAmC,CAAA;IAC5C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAmC,CAAA;IAC5C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAmC,CAAA;IAC5C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GAClF,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GAClF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAsC,CAAA;IAC/C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAAgC,SAAS,kBAAC,GAAD,EAAmC,CAAA;IAAI,CAAA;GAC5F,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GAClF,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,GAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,GAAD,EAA2B,CAAA;IAAI,CAAA;GAC7E,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,GAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,GAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IAAO,MAAK;IAA0B,SAAS,kBAAC,GAAD,EAA4B,CAAA;IAAI,CAAA;GAC/E,kBAAC,GAAD;IAAO,MAAK;IAAmB,SAAS,kBAAC,GAAD,EAAsB,CAAA;IAAI,CAAA;GAClE,kBAAC,GAAD;IAAO,MAAK;IAAsB,SAAS,kBAAC,GAAD,EAAyB,CAAA;IAAI,CAAA;GACxE,kBAAC,GAAD;IAAO,MAAK;IAAoB,SAAS,kBAAC,GAAD,EAAuB,CAAA;IAAI,CAAA;GACpE,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA6B,CAAA;IAAI,CAAA;GACjF,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,GAAD,EAA6B,CAAA;IAAI,CAAA;GACjF,kBAAC,GAAD;IAAO,MAAK;IAAkB,SAAS,kBAAC,GAAD,EAAqB,CAAA;IAAI,CAAA;GAChE,kBAAC,GAAD;IAAO,MAAK;IAAwB,SAAS,kBAAC,GAAD,EAA0B,CAAA;IAAI,CAAA;GAC3E,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA+B,CAAA;IAAI,CAAA;GACpF,kBAAC,GAAD;IAAO,MAAK;IAA6B,SAAS,kBAAC,GAAD,EAAgC,CAAA;IAAI,CAAA;GACtF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,GAAD,EAAiC,CAAA;IAAI,CAAA;GACzF,kBAAC,GAAD;IAAO,MAAK;IAAgC,SAAS,kBAAC,GAAD,EAAkC,CAAA;IAAI,CAAA;GAC3F,kBAAC,GAAD;IAAO,MAAK;IAAwB,SAAS,kBAAC,GAAD,EAA2B,CAAA;IAAI,CAAA;GAC5E,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAqC,CAAA;IAC9C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,GAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAsC,CAAA;IAC/C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,GAAD,EAAiC,CAAA;IAAI,CAAA;GACzF,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GACnF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAAwC,CAAA;IACjD,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA+B,CAAA;IAAI,CAAA;GACpF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,GAAD,EAAkC,CAAA;IAAI,CAAA;GAC1F,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,GAAD,EAA0C,CAAA;IACnD,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAA6B,SAAS,kBAAC,GAAD,EAAgC,CAAA;IAAI,CAAA;GACtF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,IAAD,EAAiC,CAAA;IAAI,CAAA;GACzF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAqC,CAAA;IAC9C,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAqC,CAAA;IAC9C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAAuB,SAAS,kBAAC,IAAD,EAA0B,CAAA;IAAI,CAAA;GAC1E,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,IAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAoC,CAAA;IAC7C,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAAgC,SAAS,kBAAC,IAAD,EAAkC,CAAA;IAAI,CAAA;GAC3F,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,IAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,IAAD,EAAiC,CAAA;IAAI,CAAA;GACzF,kBAAC,GAAD;IAAO,MAAK;IAAgC,SAAS,kBAAC,IAAD,EAAkC,CAAA;IAAI,CAAA;GAC3F,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,IAAD,EAA4B,CAAA;IAAI,CAAA;GAC9E,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,IAAD,EAA8B,CAAA;IAAI,CAAA;GAClF,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,GAAD,EAA8B,CAAA;IAAI,CAAA;GACnF,kBAAC,GAAD;IAAO,MAAK;IAAyB,SAAS,kBAAC,IAAD,EAA2B,CAAA;IAAI,CAAA;GAC7E,kBAAC,GAAD;IAAO,MAAK;IAA4B,SAAS,kBAAC,IAAD,EAA8B,CAAA;IAAI,CAAA;GACnF,kBAAC,GAAD;IAAO,MAAK;IAAmB,SAAS,kBAAC,IAAD,EAAsB,CAAA;IAAI,CAAA;GAClE,kBAAC,GAAD;IAAO,MAAK;IAA2B,SAAS,kBAAC,IAAD,EAA6B,CAAA;IAAI,CAAA;GACjF,kBAAC,GAAD;IAAO,MAAK;IAA8B,SAAS,kBAAC,IAAD,EAAgC,CAAA;IAAI,CAAA;GACvF,kBAAC,GAAD;IAAO,MAAK;IAA+B,SAAS,kBAAC,IAAD,EAAiC,CAAA;IAAI,CAAA;GACzF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAwC,CAAA;IACjD,CAAA;GACF,kBAAC,GAAD;IACE,MAAK;IACL,SAAS,kBAAC,IAAD,EAAgD,CAAA;IACzD,CAAA;GACF,kBAAC,GAAD;IAAO,MAAK;IAAI,SAAS,kBAAC,GAAD;KAAU,IAAG;KAAG,SAAA;KAAU,CAAA;IAAI,CAAA;GAChD,EAAA,CAAA;EACA,CAAA"}
|
|
1
|
+
{"version":3,"file":"CrewFoundryRoutes.js","names":[],"sources":["../../src/crewfoundry/CrewFoundryRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Navigate, Route, Routes } from 'react-router';\nimport { Loader2 } from 'lucide-react';\nimport { AdminAdminPagePage as IndexPage } from './pages/AdminAdminPagePage';\n\nconst AnalyticsAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsAnalyticsPagePage,\n }))\n);\nconst AnalyticsEmployeeAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsEmployeeAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsEmployeeAnalyticsPagePage,\n }))\n);\nconst AnalyticsFinancialAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsFinancialAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsFinancialAnalyticsPagePage,\n }))\n);\nconst AnalyticsHiringAnalyticsPagePage = lazy(() =>\n import('./pages/AnalyticsHiringAnalyticsPagePage').then((m) => ({\n default: m.AnalyticsHiringAnalyticsPagePage,\n }))\n);\nconst CommunicationsAnnouncementsPagePage = lazy(() =>\n import('./pages/CommunicationsAnnouncementsPagePage').then((m) => ({\n default: m.CommunicationsAnnouncementsPagePage,\n }))\n);\nconst CommunicationsCallsPagePage = lazy(() =>\n import('./pages/CommunicationsCallsPagePage').then((m) => ({\n default: m.CommunicationsCallsPagePage,\n }))\n);\nconst CommunicationsDirectoryPagePage = lazy(() =>\n import('./pages/CommunicationsDirectoryPagePage').then((m) => ({\n default: m.CommunicationsDirectoryPagePage,\n }))\n);\nconst CommunicationsFilesPagePage = lazy(() =>\n import('./pages/CommunicationsFilesPagePage').then((m) => ({\n default: m.CommunicationsFilesPagePage,\n }))\n);\nconst CommunicationsMessagesPagePage = lazy(() =>\n import('./pages/CommunicationsMessagesPagePage').then((m) => ({\n default: m.CommunicationsMessagesPagePage,\n }))\n);\nconst CommunicationsTeamsPagePage = lazy(() =>\n import('./pages/CommunicationsTeamsPagePage').then((m) => ({\n default: m.CommunicationsTeamsPagePage,\n }))\n);\nconst CommunicationsVideoCallsPagePage = lazy(() =>\n import('./pages/CommunicationsVideoCallsPagePage').then((m) => ({\n default: m.CommunicationsVideoCallsPagePage,\n }))\n);\nconst CompanyClientManagementPagePage = lazy(() =>\n import('./pages/CompanyClientManagementPagePage').then((m) => ({\n default: m.CompanyClientManagementPagePage,\n }))\n);\nconst CompanyCompanyDashboardPagePage = lazy(() =>\n import('./pages/CompanyCompanyDashboardPagePage').then((m) => ({\n default: m.CompanyCompanyDashboardPagePage,\n }))\n);\nconst CompanyVendorManagementPagePage = lazy(() =>\n import('./pages/CompanyVendorManagementPagePage').then((m) => ({\n default: m.CompanyVendorManagementPagePage,\n }))\n);\nconst DashboardAnalyticsPagePage = lazy(() =>\n import('./pages/DashboardAnalyticsPagePage').then((m) => ({\n default: m.DashboardAnalyticsPagePage,\n }))\n);\nconst DashboardDashboardPagePage = lazy(() =>\n import('./pages/DashboardDashboardPagePage').then((m) => ({\n default: m.DashboardDashboardPagePage,\n }))\n);\nconst DashboardEnhancedDashboardPagePage = lazy(() =>\n import('./pages/DashboardEnhancedDashboardPagePage').then((m) => ({\n default: m.DashboardEnhancedDashboardPagePage,\n }))\n);\nconst DashboardExecutiveDashboardPage = lazy(() =>\n import('./pages/DashboardExecutiveDashboardPage').then((m) => ({\n default: m.DashboardExecutiveDashboardPage,\n }))\n);\nconst HiringApplicationsPagePage = lazy(() =>\n import('./pages/HiringApplicationsPagePage').then((m) => ({\n default: m.HiringApplicationsPagePage,\n }))\n);\nconst HiringCandidatesPagePage = lazy(() =>\n import('./pages/HiringCandidatesPagePage').then((m) => ({ default: m.HiringCandidatesPagePage }))\n);\nconst HiringCreateJobPagePage = lazy(() =>\n import('./pages/HiringCreateJobPagePage').then((m) => ({ default: m.HiringCreateJobPagePage }))\n);\nconst HiringInterviewsPagePage = lazy(() =>\n import('./pages/HiringInterviewsPagePage').then((m) => ({ default: m.HiringInterviewsPagePage }))\n);\nconst HiringOnboardingPagePage = lazy(() =>\n import('./pages/HiringOnboardingPagePage').then((m) => ({ default: m.HiringOnboardingPagePage }))\n);\nconst HiringJobDetailsPagePage = lazy(() =>\n import('./pages/HiringJobDetailsPagePage').then((m) => ({ default: m.HiringJobDetailsPagePage }))\n);\nconst HiringJobsPagePage = lazy(() =>\n import('./pages/HiringJobsPagePage').then((m) => ({ default: m.HiringJobsPagePage }))\n);\nconst HrDepartmentsPagePage = lazy(() =>\n import('./pages/HrDepartmentsPagePage').then((m) => ({ default: m.HrDepartmentsPagePage }))\n);\nconst HrEmployeesPagePage = lazy(() =>\n import('./pages/HrEmployeesPagePage').then((m) => ({ default: m.HrEmployeesPagePage }))\n);\nconst HrEmployeeProfilePagePage = lazy(() =>\n import('./pages/HrEmployeeProfilePagePage').then((m) => ({\n default: m.HrEmployeeProfilePagePage,\n }))\n);\nconst HrLeaveManagementPagePage = lazy(() =>\n import('./pages/HrLeaveManagementPagePage').then((m) => ({\n default: m.HrLeaveManagementPagePage,\n }))\n);\nconst HrPayrollPagePage = lazy(() =>\n import('./pages/HrPayrollPagePage').then((m) => ({ default: m.HrPayrollPagePage }))\n);\nconst HrTimeTrackingPagePage = lazy(() =>\n import('./pages/HrTimeTrackingPagePage').then((m) => ({ default: m.HrTimeTrackingPagePage }))\n);\nconst LearningAssessmentsPagePage = lazy(() =>\n import('./pages/LearningAssessmentsPagePage').then((m) => ({\n default: m.LearningAssessmentsPagePage,\n }))\n);\nconst LearningCertificatesPagePage = lazy(() =>\n import('./pages/LearningCertificatesPagePage').then((m) => ({\n default: m.LearningCertificatesPagePage,\n }))\n);\nconst LearningCourseDetailsPagePage = lazy(() =>\n import('./pages/LearningCourseDetailsPagePage').then((m) => ({\n default: m.LearningCourseDetailsPagePage,\n }))\n);\nconst LearningCourseLearningPagePage = lazy(() =>\n import('./pages/LearningCourseLearningPagePage').then((m) => ({\n default: m.LearningCourseLearningPagePage,\n }))\n);\nconst LearningCoursesPagePage = lazy(() =>\n import('./pages/LearningCoursesPagePage').then((m) => ({ default: m.LearningCoursesPagePage }))\n);\nconst LearningLearningAnalyticsPagePage = lazy(() =>\n import('./pages/LearningLearningAnalyticsPagePage').then((m) => ({\n default: m.LearningLearningAnalyticsPagePage,\n }))\n);\nconst LearningLearningPagePage = lazy(() =>\n import('./pages/LearningLearningPagePage').then((m) => ({ default: m.LearningLearningPagePage }))\n);\nconst LearningLearningPathDetailPagePage = lazy(() =>\n import('./pages/LearningLearningPathDetailPagePage').then((m) => ({\n default: m.LearningLearningPathDetailPagePage,\n }))\n);\nconst LearningLearningPathsPagePage = lazy(() =>\n import('./pages/LearningLearningPathsPagePage').then((m) => ({\n default: m.LearningLearningPathsPagePage,\n }))\n);\nconst LearningMyLearningPagePage = lazy(() =>\n import('./pages/LearningMyLearningPagePage').then((m) => ({\n default: m.LearningMyLearningPagePage,\n }))\n);\nconst MarketplaceBookingManagementPagePage = lazy(() =>\n import('./pages/MarketplaceBookingManagementPagePage').then((m) => ({\n default: m.MarketplaceBookingManagementPagePage,\n }))\n);\nconst MarketplaceEarningsPagePage = lazy(() =>\n import('./pages/MarketplaceEarningsPagePage').then((m) => ({\n default: m.MarketplaceEarningsPagePage,\n }))\n);\nconst MarketplaceMarketplacePagePage = lazy(() =>\n import('./pages/MarketplaceMarketplacePagePage').then((m) => ({\n default: m.MarketplaceMarketplacePagePage,\n }))\n);\nconst MarketplaceMarketplaceServicesPagePage = lazy(() =>\n import('./pages/MarketplaceMarketplaceServicesPagePage').then((m) => ({\n default: m.MarketplaceMarketplaceServicesPagePage,\n }))\n);\nconst MarketplaceMessagingPagePage = lazy(() =>\n import('./pages/MarketplaceMessagingPagePage').then((m) => ({\n default: m.MarketplaceMessagingPagePage,\n }))\n);\nconst MarketplaceMyServicesPagePage = lazy(() =>\n import('./pages/MarketplaceMyServicesPagePage').then((m) => ({\n default: m.MarketplaceMyServicesPagePage,\n }))\n);\nconst MarketplaceProjectDetailsPagePage = lazy(() =>\n import('./pages/MarketplaceProjectDetailsPagePage').then((m) => ({\n default: m.MarketplaceProjectDetailsPagePage,\n }))\n);\nconst MarketplaceServiceDetailsPagePage = lazy(() =>\n import('./pages/MarketplaceServiceDetailsPagePage').then((m) => ({\n default: m.MarketplaceServiceDetailsPagePage,\n }))\n);\nconst PaymentsEscrowPagePage = lazy(() =>\n import('./pages/PaymentsEscrowPagePage').then((m) => ({ default: m.PaymentsEscrowPagePage }))\n);\nconst PaymentsInvoicesPagePage = lazy(() =>\n import('./pages/PaymentsInvoicesPagePage').then((m) => ({ default: m.PaymentsInvoicesPagePage }))\n);\nconst PaymentsPaymentDashboardPagePage = lazy(() =>\n import('./pages/PaymentsPaymentDashboardPagePage').then((m) => ({\n default: m.PaymentsPaymentDashboardPagePage,\n }))\n);\nconst PaymentsPaymentMethodsPagePage = lazy(() =>\n import('./pages/PaymentsPaymentMethodsPagePage').then((m) => ({\n default: m.PaymentsPaymentMethodsPagePage,\n }))\n);\nconst PaymentsSecurityPagePage = lazy(() =>\n import('./pages/PaymentsSecurityPagePage').then((m) => ({ default: m.PaymentsSecurityPagePage }))\n);\nconst ProjectsCreateProjectPagePage = lazy(() =>\n import('./pages/ProjectsCreateProjectPagePage').then((m) => ({\n default: m.ProjectsCreateProjectPagePage,\n }))\n);\nconst ProjectsProjectDetailsPagePage = lazy(() =>\n import('./pages/ProjectsProjectDetailsPagePage').then((m) => ({\n default: m.ProjectsProjectDetailsPagePage,\n }))\n);\nconst ProjectsProjectsPagePage = lazy(() =>\n import('./pages/ProjectsProjectsPagePage').then((m) => ({ default: m.ProjectsProjectsPagePage }))\n);\nconst ProjectsResourcingPagePage = lazy(() =>\n import('./pages/ProjectsResourcingPagePage').then((m) => ({\n default: m.ProjectsResourcingPagePage,\n }))\n);\nconst TeamsTeamAnalyticsPagePage = lazy(() =>\n import('./pages/TeamsTeamAnalyticsPagePage').then((m) => ({\n default: m.TeamsTeamAnalyticsPagePage,\n }))\n);\nconst TeamsTeamDetailPagePage = lazy(() =>\n import('./pages/TeamsTeamDetailPagePage').then((m) => ({ default: m.TeamsTeamDetailPagePage }))\n);\nconst TeamsTeamDirectoryPagePage = lazy(() =>\n import('./pages/TeamsTeamDirectoryPagePage').then((m) => ({\n default: m.TeamsTeamDirectoryPagePage,\n }))\n);\nconst TeamsTeamsPagePage = lazy(() =>\n import('./pages/TeamsTeamsPagePage').then((m) => ({ default: m.TeamsTeamsPagePage }))\n);\nconst HelpApiDocumentationPagePage = lazy(() =>\n import('./pages/HelpApiDocumentationPagePage').then((m) => ({\n default: m.HelpApiDocumentationPagePage,\n }))\n);\nconst CompanyCompanyProfilePagePage = lazy(() =>\n import('./pages/CompanyCompanyProfilePagePage').then((m) => ({\n default: m.CompanyCompanyProfilePagePage,\n }))\n);\nconst MarketplaceFreelancerProfilePagePage = lazy(() =>\n import('./pages/MarketplaceFreelancerProfilePagePage').then((m) => ({\n default: m.MarketplaceFreelancerProfilePagePage,\n }))\n);\nconst MarketplaceFreelancerProfilePageEnhancedPage = lazy(() =>\n import('./pages/MarketplaceFreelancerProfilePageEnhancedPage').then((m) => ({\n default: m.MarketplaceFreelancerProfilePageEnhancedPage,\n }))\n);\nconst TeamsTeamSettingsPagePage = lazy(() =>\n import('./pages/TeamsTeamSettingsPagePage').then((m) => ({\n default: m.TeamsTeamSettingsPagePage,\n }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function CrewFoundryRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<IndexPage />} />\n <Route path=\"analytics/analytics-page\" element={<AnalyticsAnalyticsPagePage />} />\n <Route\n path=\"analytics/employee-analytics-page\"\n element={<AnalyticsEmployeeAnalyticsPagePage />}\n />\n <Route\n path=\"analytics/financial-analytics-page\"\n element={<AnalyticsFinancialAnalyticsPagePage />}\n />\n <Route\n path=\"analytics/hiring-analytics-page\"\n element={<AnalyticsHiringAnalyticsPagePage />}\n />\n <Route\n path=\"communications/announcements-page\"\n element={<CommunicationsAnnouncementsPagePage />}\n />\n <Route path=\"communications/calls-page\" element={<CommunicationsCallsPagePage />} />\n <Route path=\"communications/directory-page\" element={<CommunicationsDirectoryPagePage />} />\n <Route path=\"communications/files-page\" element={<CommunicationsFilesPagePage />} />\n <Route path=\"communications/messages-page\" element={<CommunicationsMessagesPagePage />} />\n <Route path=\"communications/teams-page\" element={<CommunicationsTeamsPagePage />} />\n <Route\n path=\"communications/video-calls-page\"\n element={<CommunicationsVideoCallsPagePage />}\n />\n <Route\n path=\"company/client-management-page\"\n element={<CompanyClientManagementPagePage />}\n />\n <Route\n path=\"company/company-dashboard-page\"\n element={<CompanyCompanyDashboardPagePage />}\n />\n <Route\n path=\"company/vendor-management-page\"\n element={<CompanyVendorManagementPagePage />}\n />\n <Route path=\"dashboard/analytics-page\" element={<DashboardAnalyticsPagePage />} />\n <Route path=\"dashboard/dashboard-page\" element={<DashboardDashboardPagePage />} />\n <Route\n path=\"dashboard/enhanced-dashboard-page\"\n element={<DashboardEnhancedDashboardPagePage />}\n />\n <Route path=\"dashboard/executive-dashboard\" element={<DashboardExecutiveDashboardPage />} />\n <Route path=\"hiring/applications-page\" element={<HiringApplicationsPagePage />} />\n <Route path=\"hiring/candidates-page\" element={<HiringCandidatesPagePage />} />\n <Route path=\"hiring/create-job-page\" element={<HiringCreateJobPagePage />} />\n <Route path=\"hiring/interviews-page\" element={<HiringInterviewsPagePage />} />\n <Route path=\"hiring/onboarding-page\" element={<HiringOnboardingPagePage />} />\n <Route path=\"hiring/job-details-page\" element={<HiringJobDetailsPagePage />} />\n <Route path=\"hiring/jobs-page\" element={<HiringJobsPagePage />} />\n <Route path=\"hr/departments-page\" element={<HrDepartmentsPagePage />} />\n <Route path=\"hr/employees-page\" element={<HrEmployeesPagePage />} />\n <Route path=\"hr/employee-profile-page\" element={<HrEmployeeProfilePagePage />} />\n <Route path=\"hr/leave-management-page\" element={<HrLeaveManagementPagePage />} />\n <Route path=\"hr/payroll-page\" element={<HrPayrollPagePage />} />\n <Route path=\"hr/time-tracking-page\" element={<HrTimeTrackingPagePage />} />\n <Route path=\"learning/assessments-page\" element={<LearningAssessmentsPagePage />} />\n <Route path=\"learning/certificates-page\" element={<LearningCertificatesPagePage />} />\n <Route path=\"learning/course-details-page\" element={<LearningCourseDetailsPagePage />} />\n <Route path=\"learning/course-learning-page\" element={<LearningCourseLearningPagePage />} />\n <Route path=\"learning/courses-page\" element={<LearningCoursesPagePage />} />\n <Route\n path=\"learning/learning-analytics-page\"\n element={<LearningLearningAnalyticsPagePage />}\n />\n <Route path=\"learning/learning-page\" element={<LearningLearningPagePage />} />\n <Route\n path=\"learning/learning-path-detail-page\"\n element={<LearningLearningPathDetailPagePage />}\n />\n <Route path=\"learning/learning-paths-page\" element={<LearningLearningPathsPagePage />} />\n <Route path=\"learning/my-learning-page\" element={<LearningMyLearningPagePage />} />\n <Route\n path=\"marketplace/booking-management-page\"\n element={<MarketplaceBookingManagementPagePage />}\n />\n <Route path=\"marketplace/earnings-page\" element={<MarketplaceEarningsPagePage />} />\n <Route path=\"marketplace/marketplace-page\" element={<MarketplaceMarketplacePagePage />} />\n <Route\n path=\"marketplace/marketplace-services-page\"\n element={<MarketplaceMarketplaceServicesPagePage />}\n />\n <Route path=\"marketplace/messaging-page\" element={<MarketplaceMessagingPagePage />} />\n <Route path=\"marketplace/my-services-page\" element={<MarketplaceMyServicesPagePage />} />\n <Route\n path=\"marketplace/project-details-page\"\n element={<MarketplaceProjectDetailsPagePage />}\n />\n <Route\n path=\"marketplace/service-details-page\"\n element={<MarketplaceServiceDetailsPagePage />}\n />\n <Route path=\"payments/escrow-page\" element={<PaymentsEscrowPagePage />} />\n <Route path=\"payments/invoices-page\" element={<PaymentsInvoicesPagePage />} />\n <Route\n path=\"payments/payment-dashboard-page\"\n element={<PaymentsPaymentDashboardPagePage />}\n />\n <Route path=\"payments/payment-methods-page\" element={<PaymentsPaymentMethodsPagePage />} />\n <Route path=\"payments/security-page\" element={<PaymentsSecurityPagePage />} />\n <Route path=\"projects/create-project-page\" element={<ProjectsCreateProjectPagePage />} />\n <Route path=\"projects/project-details-page\" element={<ProjectsProjectDetailsPagePage />} />\n <Route path=\"projects/projects-page\" element={<ProjectsProjectsPagePage />} />\n <Route path=\"projects/resourcing-page\" element={<ProjectsResourcingPagePage />} />\n <Route path=\"teams/team-analytics-page\" element={<TeamsTeamAnalyticsPagePage />} />\n <Route path=\"teams/team-detail-page\" element={<TeamsTeamDetailPagePage />} />\n <Route path=\"teams/team-directory-page\" element={<TeamsTeamDirectoryPagePage />} />\n <Route path=\"teams/teams-page\" element={<TeamsTeamsPagePage />} />\n <Route path=\"teams/team-settings-page\" element={<TeamsTeamSettingsPagePage />} />\n <Route path=\"help/api-documentation-page\" element={<HelpApiDocumentationPagePage />} />\n <Route path=\"company/company-profile-page\" element={<CompanyCompanyProfilePagePage />} />\n <Route\n path=\"marketplace/freelancer-profile-page\"\n element={<MarketplaceFreelancerProfilePagePage />}\n />\n <Route\n path=\"marketplace/freelancer-profile-page-enhanced\"\n element={<MarketplaceFreelancerProfilePageEnhancedPage />}\n />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormModal.d.ts","sourceRoot":"","sources":["../../../../src/crewfoundry/components/forms/FormModal.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"FormModal.d.ts","sourceRoot":"","sources":["../../../../src/crewfoundry/components/forms/FormModal.tsx"],"names":[],"mappings":"AAkBA,MAAM,MAAM,aAAa,GACvB,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEnF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;AAC7D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,wFAAwF;IACxF,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,UAAU,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAkED,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,WAAW,EACX,MAAM,EACN,aAAa,EACb,WAAoB,EACpB,QAAQ,GACT,EAAE,cAAc,+BAyQhB;AAGD,MAAM,WAAW,kBAAkB,CAAC,QAAQ;IAC1C,IAAI,EAAE,OAAO,CAAC;IACd,0EAA0E;IAC1E,OAAO,EAAE,QAAQ,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAG,IAAI,KAAK,kBAAkB,CAAC,QAAQ,CAAC,CAmB5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormModal.js","names":[],"sources":["../../../../src/crewfoundry/components/forms/FormModal.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Button,\n Input,\n Label,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Switch,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { X } from 'lucide-react';\n\n// ── Public API ──────────────────────────────────────────────────\nexport type FormFieldType =\n | 'text'\n | 'number'\n | 'date'\n | 'email'\n | 'textarea'\n | 'select'\n | 'tags'\n | 'switch';\n\nexport type FormValue = string | number | boolean | string[];\nexport type FormValues = Record<string, FormValue>;\n\nexport interface FieldOption {\n label: string;\n value: string;\n}\n\nexport interface FieldConfig {\n name: string;\n label: string;\n type: FormFieldType;\n required?: boolean;\n placeholder?: string;\n options?: FieldOption[];\n /** Column span in the 2-col grid on md+ (defaults to 1; textarea/tags default to 2). */\n colSpan?: 1 | 2;\n}\n\nexport interface FormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n fields: FieldConfig[];\n initialValues?: FormValues;\n submitLabel?: string;\n onSubmit: (values: FormValues) => Promise<void>;\n}\n\n// ── Internal state helpers ──────────────────────────────────────\n// Text-like inputs are held as strings for controlled inputs; switches as\n// booleans; tags as string[]. Values are coerced back to their public shapes\n// on submit.\ntype InternalValue = string | boolean | string[];\ntype InternalValues = Record<string, InternalValue>;\n\nconst buildInitialState = (fields: FieldConfig[], initialValues?: FormValues): InternalValues => {\n const state: InternalValues = {};\n for (const field of fields) {\n const raw = initialValues?.[field.name];\n if (field.type === 'switch') {\n state[field.name] = Boolean(raw);\n } else if (field.type === 'tags') {\n if (Array.isArray(raw)) {\n state[field.name] = raw.map((item) => String(item));\n } else if (typeof raw === 'string' && raw.length > 0) {\n state[field.name] = raw\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n } else {\n state[field.name] = [];\n }\n } else {\n state[field.name] = raw === undefined || raw === null ? '' : String(raw);\n }\n }\n return state;\n};\n\nconst isEmptyValue = (field: FieldConfig, value: InternalValue): boolean => {\n if (field.type === 'switch') {\n return false;\n }\n if (field.type === 'tags') {\n return !Array.isArray(value) || value.length === 0;\n }\n return typeof value !== 'string' || value.trim() === '';\n};\n\nconst toOutput = (fields: FieldConfig[], state: InternalValues): FormValues => {\n const output: FormValues = {};\n for (const field of fields) {\n const value = state[field.name];\n if (field.type === 'switch') {\n output[field.name] = Boolean(value);\n } else if (field.type === 'tags') {\n output[field.name] = Array.isArray(value) ? value : [];\n } else if (field.type === 'number') {\n const raw = typeof value === 'string' ? value.trim() : '';\n output[field.name] = raw === '' ? '' : Number(raw);\n } else {\n output[field.name] = typeof value === 'string' ? value : '';\n }\n }\n return output;\n};\n\n// Native <select> styled with the same semantic tokens as fe-libs Input.\nconst SELECT_CLASS =\n 'flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)] focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50';\n\n// ── Component ───────────────────────────────────────────────────\nexport function FormModal({\n open,\n onOpenChange,\n title,\n description,\n fields,\n initialValues,\n submitLabel = 'Save',\n onSubmit,\n}: FormModalProps) {\n const { showToast } = useGlobalUi();\n const [values, setValues] = useState<InternalValues>(() =>\n buildInitialState(fields, initialValues)\n );\n const [tagDrafts, setTagDrafts] = useState<Record<string, string>>({});\n const [submitting, setSubmitting] = useState(false);\n\n // Keep the latest field config / initial values reachable from the reset\n // effect without making them effect dependencies (page callers rarely\n // memoize these, and depending on them would loop or clobber edits).\n const fieldsRef = useRef(fields);\n const initialValuesRef = useRef(initialValues);\n const wasOpenRef = useRef(false);\n\n // Sync the latest field config / initial values into refs after each commit\n // (never during render). Declared before the reset effect so that on a rising\n // edge of `open` the refs are refreshed first, then read by the reset below.\n useEffect(() => {\n fieldsRef.current = fields;\n initialValuesRef.current = initialValues;\n }, [fields, initialValues]);\n\n // Reset the working copy on each rising edge of `open` so edit vs create\n // contexts never leak into each other.\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n setValues(buildInitialState(fieldsRef.current, initialValuesRef.current));\n setTagDrafts({});\n setSubmitting(false);\n }\n wasOpenRef.current = open;\n }, [open]);\n\n const setFieldValue = useCallback((name: string, value: InternalValue) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n const commitTag = useCallback((name: string) => {\n setTagDrafts((prevDrafts) => {\n const draft = (prevDrafts[name] ?? '').trim();\n if (draft) {\n setValues((prev) => {\n const current = Array.isArray(prev[name]) ? (prev[name] as string[]) : [];\n if (current.includes(draft)) {\n return prev;\n }\n return { ...prev, [name]: [...current, draft] };\n });\n }\n return { ...prevDrafts, [name]: '' };\n });\n }, []);\n\n const removeTag = useCallback((name: string, tag: string) => {\n setValues((prev) => {\n const current = Array.isArray(prev[name]) ? (prev[name] as string[]) : [];\n return { ...prev, [name]: current.filter((item) => item !== tag) };\n });\n }, []);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (submitting) {\n return;\n }\n\n // Fold any un-committed tag draft into its field before validating.\n const staged: InternalValues = { ...values };\n for (const field of fields) {\n if (field.type === 'tags') {\n const draft = (tagDrafts[field.name] ?? '').trim();\n if (draft) {\n const current = Array.isArray(staged[field.name])\n ? (staged[field.name] as string[])\n : [];\n if (!current.includes(draft)) {\n staged[field.name] = [...current, draft];\n }\n }\n }\n }\n\n const missing = fields.find(\n (field) => field.required && isEmptyValue(field, staged[field.name])\n );\n if (missing) {\n showToast(`${missing.label} is required`, 'warning');\n return;\n }\n\n setSubmitting(true);\n try {\n await onSubmit(toOutput(fields, staged));\n onOpenChange(false);\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Something went wrong', 'error');\n } finally {\n setSubmitting(false);\n }\n },\n [fields, onOpenChange, onSubmit, showToast, submitting, tagDrafts, values]\n );\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-[560px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>{title}</ResponsiveDialogTitle>\n {description ? (\n <ResponsiveDialogDescription>{description}</ResponsiveDialogDescription>\n ) : null}\n </ResponsiveDialogHeader>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {fields.map((field) => {\n const fieldId = `formmodal-${field.name}`;\n const spanTwo =\n field.colSpan === 2 ||\n (field.colSpan === undefined &&\n (field.type === 'textarea' || field.type === 'tags'));\n const value = values[field.name];\n\n return (\n <div\n key={field.name}\n className={`flex flex-col gap-1.5 ${spanTwo ? 'md:col-span-2' : ''}`}\n >\n {field.type === 'switch' ? (\n <div className=\"flex items-center justify-between gap-3 rounded-input border border-border-default bg-bg-surface px-3 py-2\">\n <Label htmlFor={fieldId}>\n {field.label}\n {field.required ? <span className=\"text-status-error-fg\"> *</span> : null}\n </Label>\n <Switch\n id={fieldId}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setFieldValue(field.name, checked)}\n disabled={submitting}\n />\n </div>\n ) : (\n <>\n <Label htmlFor={fieldId}>\n {field.label}\n {field.required ? <span className=\"text-status-error-fg\"> *</span> : null}\n </Label>\n\n {field.type === 'textarea' ? (\n <Textarea\n id={fieldId}\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n />\n ) : field.type === 'select' ? (\n <select\n id={fieldId}\n className={SELECT_CLASS}\n value={typeof value === 'string' ? value : ''}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n >\n <option value=\"\" disabled>\n {field.placeholder ?? 'Select…'}\n </option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : field.type === 'tags' ? (\n <div className=\"flex min-h-10 flex-wrap items-center gap-1.5 rounded-input border border-border-default bg-bg-surface px-2 py-1.5\">\n {(Array.isArray(value) ? value : []).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-primary\"\n >\n {tag}\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n className=\"text-text-secondary hover:text-text-primary\"\n onClick={() => removeTag(field.name, tag)}\n disabled={submitting}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <input\n id={fieldId}\n className=\"min-w-[6rem] flex-1 bg-transparent text-sm text-text-primary outline-none placeholder:text-text-placeholder\"\n value={tagDrafts[field.name] ?? ''}\n placeholder={field.placeholder ?? 'Add and press Enter'}\n disabled={submitting}\n onChange={(event) =>\n setTagDrafts((prev) => ({\n ...prev,\n [field.name]: event.target.value,\n }))\n }\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n commitTag(field.name);\n } else if (\n event.key === 'Backspace' &&\n (tagDrafts[field.name] ?? '') === ''\n ) {\n const current = Array.isArray(value) ? value : [];\n if (current.length > 0) {\n removeTag(field.name, current[current.length - 1]);\n }\n }\n }}\n onBlur={() => commitTag(field.name)}\n />\n </div>\n ) : (\n <Input\n id={fieldId}\n type={\n field.type === 'number'\n ? 'number'\n : field.type === 'date'\n ? 'date'\n : field.type === 'email'\n ? 'email'\n : 'text'\n }\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n />\n )}\n </>\n )}\n </div>\n );\n })}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={submitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={submitting}>\n {submitting ? 'Saving…' : submitLabel}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ── Optional open/close helper ──────────────────────────────────\nexport interface UseFormModalResult<TContext> {\n open: boolean;\n /** The row/context passed to openModal (e.g. the entity being edited). */\n context: TContext | null;\n openModal: (context?: TContext) => void;\n closeModal: () => void;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Tiny helper for pages that toggle a single FormModal and want to remember\n * which row is being edited. `context` is null for a create flow.\n */\nexport function useFormModal<TContext = void>(): UseFormModalResult<TContext> {\n const [open, setOpen] = useState(false);\n const [context, setContext] = useState<TContext | null>(null);\n\n const openModal = useCallback((next?: TContext) => {\n setContext(next ?? null);\n setOpen(true);\n }, []);\n\n const closeModal = useCallback(() => setOpen(false), []);\n\n const onOpenChange = useCallback((nextOpen: boolean) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setContext(null);\n }\n }, []);\n\n return { open, context, openModal, closeModal, onOpenChange };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormModal.js","names":[],"sources":["../../../../src/crewfoundry/components/forms/FormModal.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n Button,\n Input,\n Label,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Switch,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { X } from 'lucide-react';\n\n// ── Public API ──────────────────────────────────────────────────\nexport type FormFieldType =\n 'text' | 'number' | 'date' | 'email' | 'textarea' | 'select' | 'tags' | 'switch';\n\nexport type FormValue = string | number | boolean | string[];\nexport type FormValues = Record<string, FormValue>;\n\nexport interface FieldOption {\n label: string;\n value: string;\n}\n\nexport interface FieldConfig {\n name: string;\n label: string;\n type: FormFieldType;\n required?: boolean;\n placeholder?: string;\n options?: FieldOption[];\n /** Column span in the 2-col grid on md+ (defaults to 1; textarea/tags default to 2). */\n colSpan?: 1 | 2;\n}\n\nexport interface FormModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n description?: string;\n fields: FieldConfig[];\n initialValues?: FormValues;\n submitLabel?: string;\n onSubmit: (values: FormValues) => Promise<void>;\n}\n\n// ── Internal state helpers ──────────────────────────────────────\n// Text-like inputs are held as strings for controlled inputs; switches as\n// booleans; tags as string[]. Values are coerced back to their public shapes\n// on submit.\ntype InternalValue = string | boolean | string[];\ntype InternalValues = Record<string, InternalValue>;\n\nconst buildInitialState = (fields: FieldConfig[], initialValues?: FormValues): InternalValues => {\n const state: InternalValues = {};\n for (const field of fields) {\n const raw = initialValues?.[field.name];\n if (field.type === 'switch') {\n state[field.name] = Boolean(raw);\n } else if (field.type === 'tags') {\n if (Array.isArray(raw)) {\n state[field.name] = raw.map((item) => String(item));\n } else if (typeof raw === 'string' && raw.length > 0) {\n state[field.name] = raw\n .split(',')\n .map((item) => item.trim())\n .filter(Boolean);\n } else {\n state[field.name] = [];\n }\n } else {\n state[field.name] = raw === undefined || raw === null ? '' : String(raw);\n }\n }\n return state;\n};\n\nconst isEmptyValue = (field: FieldConfig, value: InternalValue): boolean => {\n if (field.type === 'switch') {\n return false;\n }\n if (field.type === 'tags') {\n return !Array.isArray(value) || value.length === 0;\n }\n return typeof value !== 'string' || value.trim() === '';\n};\n\nconst toOutput = (fields: FieldConfig[], state: InternalValues): FormValues => {\n const output: FormValues = {};\n for (const field of fields) {\n const value = state[field.name];\n if (field.type === 'switch') {\n output[field.name] = Boolean(value);\n } else if (field.type === 'tags') {\n output[field.name] = Array.isArray(value) ? value : [];\n } else if (field.type === 'number') {\n const raw = typeof value === 'string' ? value.trim() : '';\n output[field.name] = raw === '' ? '' : Number(raw);\n } else {\n output[field.name] = typeof value === 'string' ? value : '';\n }\n }\n return output;\n};\n\n// Native <select> styled with the same semantic tokens as fe-libs Input.\nconst SELECT_CLASS =\n 'flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)] focus-visible:ring-1 focus-visible:ring-[var(--color-focus-ring)] disabled:cursor-not-allowed disabled:opacity-50';\n\n// ── Component ───────────────────────────────────────────────────\nexport function FormModal({\n open,\n onOpenChange,\n title,\n description,\n fields,\n initialValues,\n submitLabel = 'Save',\n onSubmit,\n}: FormModalProps) {\n const { showToast } = useGlobalUi();\n const [values, setValues] = useState<InternalValues>(() =>\n buildInitialState(fields, initialValues)\n );\n const [tagDrafts, setTagDrafts] = useState<Record<string, string>>({});\n const [submitting, setSubmitting] = useState(false);\n\n // Keep the latest field config / initial values reachable from the reset\n // effect without making them effect dependencies (page callers rarely\n // memoize these, and depending on them would loop or clobber edits).\n const fieldsRef = useRef(fields);\n const initialValuesRef = useRef(initialValues);\n const wasOpenRef = useRef(false);\n\n // Sync the latest field config / initial values into refs after each commit\n // (never during render). Declared before the reset effect so that on a rising\n // edge of `open` the refs are refreshed first, then read by the reset below.\n useEffect(() => {\n fieldsRef.current = fields;\n initialValuesRef.current = initialValues;\n }, [fields, initialValues]);\n\n // Reset the working copy on each rising edge of `open` so edit vs create\n // contexts never leak into each other.\n useEffect(() => {\n if (open && !wasOpenRef.current) {\n setValues(buildInitialState(fieldsRef.current, initialValuesRef.current));\n setTagDrafts({});\n setSubmitting(false);\n }\n wasOpenRef.current = open;\n }, [open]);\n\n const setFieldValue = useCallback((name: string, value: InternalValue) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n const commitTag = useCallback((name: string) => {\n setTagDrafts((prevDrafts) => {\n const draft = (prevDrafts[name] ?? '').trim();\n if (draft) {\n setValues((prev) => {\n const current = Array.isArray(prev[name]) ? (prev[name] as string[]) : [];\n if (current.includes(draft)) {\n return prev;\n }\n return { ...prev, [name]: [...current, draft] };\n });\n }\n return { ...prevDrafts, [name]: '' };\n });\n }, []);\n\n const removeTag = useCallback((name: string, tag: string) => {\n setValues((prev) => {\n const current = Array.isArray(prev[name]) ? (prev[name] as string[]) : [];\n return { ...prev, [name]: current.filter((item) => item !== tag) };\n });\n }, []);\n\n const handleSubmit = useCallback(\n async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n if (submitting) {\n return;\n }\n\n // Fold any un-committed tag draft into its field before validating.\n const staged: InternalValues = { ...values };\n for (const field of fields) {\n if (field.type === 'tags') {\n const draft = (tagDrafts[field.name] ?? '').trim();\n if (draft) {\n const current = Array.isArray(staged[field.name])\n ? (staged[field.name] as string[])\n : [];\n if (!current.includes(draft)) {\n staged[field.name] = [...current, draft];\n }\n }\n }\n }\n\n const missing = fields.find(\n (field) => field.required && isEmptyValue(field, staged[field.name])\n );\n if (missing) {\n showToast(`${missing.label} is required`, 'warning');\n return;\n }\n\n setSubmitting(true);\n try {\n await onSubmit(toOutput(fields, staged));\n onOpenChange(false);\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Something went wrong', 'error');\n } finally {\n setSubmitting(false);\n }\n },\n [fields, onOpenChange, onSubmit, showToast, submitting, tagDrafts, values]\n );\n\n return (\n <ResponsiveDialog open={open} onOpenChange={onOpenChange}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-[560px]\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>{title}</ResponsiveDialogTitle>\n {description ? (\n <ResponsiveDialogDescription>{description}</ResponsiveDialogDescription>\n ) : null}\n </ResponsiveDialogHeader>\n\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2\">\n {fields.map((field) => {\n const fieldId = `formmodal-${field.name}`;\n const spanTwo =\n field.colSpan === 2 ||\n (field.colSpan === undefined &&\n (field.type === 'textarea' || field.type === 'tags'));\n const value = values[field.name];\n\n return (\n <div\n key={field.name}\n className={`flex flex-col gap-1.5 ${spanTwo ? 'md:col-span-2' : ''}`}\n >\n {field.type === 'switch' ? (\n <div className=\"flex items-center justify-between gap-3 rounded-input border border-border-default bg-bg-surface px-3 py-2\">\n <Label htmlFor={fieldId}>\n {field.label}\n {field.required ? <span className=\"text-status-error-fg\"> *</span> : null}\n </Label>\n <Switch\n id={fieldId}\n checked={Boolean(value)}\n onCheckedChange={(checked) => setFieldValue(field.name, checked)}\n disabled={submitting}\n />\n </div>\n ) : (\n <>\n <Label htmlFor={fieldId}>\n {field.label}\n {field.required ? <span className=\"text-status-error-fg\"> *</span> : null}\n </Label>\n\n {field.type === 'textarea' ? (\n <Textarea\n id={fieldId}\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n />\n ) : field.type === 'select' ? (\n <select\n id={fieldId}\n className={SELECT_CLASS}\n value={typeof value === 'string' ? value : ''}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n >\n <option value=\"\" disabled>\n {field.placeholder ?? 'Select…'}\n </option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : field.type === 'tags' ? (\n <div className=\"flex min-h-10 flex-wrap items-center gap-1.5 rounded-input border border-border-default bg-bg-surface px-2 py-1.5\">\n {(Array.isArray(value) ? value : []).map((tag) => (\n <span\n key={tag}\n className=\"inline-flex items-center gap-1 rounded-full bg-bg-sunken px-2 py-0.5 text-xs text-text-primary\"\n >\n {tag}\n <button\n type=\"button\"\n aria-label={`Remove ${tag}`}\n className=\"text-text-secondary hover:text-text-primary\"\n onClick={() => removeTag(field.name, tag)}\n disabled={submitting}\n >\n <X className=\"h-3 w-3\" />\n </button>\n </span>\n ))}\n <input\n id={fieldId}\n className=\"min-w-[6rem] flex-1 bg-transparent text-sm text-text-primary outline-none placeholder:text-text-placeholder\"\n value={tagDrafts[field.name] ?? ''}\n placeholder={field.placeholder ?? 'Add and press Enter'}\n disabled={submitting}\n onChange={(event) =>\n setTagDrafts((prev) => ({\n ...prev,\n [field.name]: event.target.value,\n }))\n }\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault();\n commitTag(field.name);\n } else if (\n event.key === 'Backspace' &&\n (tagDrafts[field.name] ?? '') === ''\n ) {\n const current = Array.isArray(value) ? value : [];\n if (current.length > 0) {\n removeTag(field.name, current[current.length - 1]);\n }\n }\n }}\n onBlur={() => commitTag(field.name)}\n />\n </div>\n ) : (\n <Input\n id={fieldId}\n type={\n field.type === 'number'\n ? 'number'\n : field.type === 'date'\n ? 'date'\n : field.type === 'email'\n ? 'email'\n : 'text'\n }\n value={typeof value === 'string' ? value : ''}\n placeholder={field.placeholder}\n disabled={submitting}\n onChange={(event) => setFieldValue(field.name, event.target.value)}\n />\n )}\n </>\n )}\n </div>\n );\n })}\n </div>\n\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => onOpenChange(false)}\n disabled={submitting}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={submitting}>\n {submitting ? 'Saving…' : submitLabel}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n );\n}\n\n// ── Optional open/close helper ──────────────────────────────────\nexport interface UseFormModalResult<TContext> {\n open: boolean;\n /** The row/context passed to openModal (e.g. the entity being edited). */\n context: TContext | null;\n openModal: (context?: TContext) => void;\n closeModal: () => void;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Tiny helper for pages that toggle a single FormModal and want to remember\n * which row is being edited. `context` is null for a create flow.\n */\nexport function useFormModal<TContext = void>(): UseFormModalResult<TContext> {\n const [open, setOpen] = useState(false);\n const [context, setContext] = useState<TContext | null>(null);\n\n const openModal = useCallback((next?: TContext) => {\n setContext(next ?? null);\n setOpen(true);\n }, []);\n\n const closeModal = useCallback(() => setOpen(false), []);\n\n const onOpenChange = useCallback((nextOpen: boolean) => {\n setOpen(nextOpen);\n if (!nextOpen) {\n setContext(null);\n }\n }, []);\n\n return { open, context, openModal, closeModal, onOpenChange };\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import "../components/viz/index.js";
|
|
|
5
5
|
import { FormModal as r, useFormModal as ee } from "../components/forms/FormModal.js";
|
|
6
6
|
import { useMemo as i, useState as a } from "react";
|
|
7
7
|
import { Eye as o, MessageSquare as s, Pencil as te, Pin as c, PinOff as ne, Plus as re, Search as ie, Send as ae, Trash2 as l } from "lucide-react";
|
|
8
|
-
import { useNavigate as u } from "react-router
|
|
8
|
+
import { useNavigate as u } from "react-router";
|
|
9
9
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
10
10
|
import { AlertDialog as p, AlertDialogAction as m, AlertDialogCancel as h, AlertDialogContent as g, AlertDialogDescription as _, AlertDialogFooter as oe, AlertDialogHeader as v, AlertDialogTitle as se, Badge as y, Button as b, Card as ce, CardContent as x, CardHeader as S, CardTitle as C, GlassCard as le, GradientText as ue, IllustratedEmptyState as de, Input as w, PagePurpose as T } from "@burdenoff/fe-libs/ui";
|
|
11
11
|
import { useGlobalUi as E } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommunicationsAnnouncementsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsAnnouncementsPagePage.tsx"],"sourcesContent":["import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { formatRelativeTime } from '@burdenoff/fe-libs/shared/utils';\nimport { Eye, MessageSquare, Pencil, Pin, PinOff, Plus, Search, Send, Trash2 } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type Announcement } from '../store/crewfoundryStore';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { AvatarStack } from '../components/viz';\n\nconst CATEGORY_OPTIONS = [\n { label: 'General', value: 'general' },\n { label: 'HR', value: 'hr' },\n { label: 'IT', value: 'it' },\n { label: 'Emergency', value: 'emergency' },\n { label: 'Event', value: 'event' },\n];\n\nconst PRIORITY_OPTIONS = [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n { label: 'Urgent', value: 'urgent' },\n];\n\n// Category → tokenized pill styling (semantic tokens only — themes cleanly).\nconst CATEGORY_STYLE: Record<Announcement['category'], string> = {\n general: 'bg-bg-sunken text-text-secondary',\n hr: 'bg-status-success-bg text-status-success-text',\n it: 'bg-bg-sunken text-text-secondary',\n emergency: 'bg-status-error-bg text-status-error-text',\n event: 'bg-status-info-bg text-status-info-text',\n};\n\nconst PRIORITY_STYLE: Record<Announcement['priority'], string> = {\n low: 'bg-bg-sunken text-text-secondary',\n medium: 'bg-bg-sunken text-text-secondary',\n high: 'bg-status-warning-bg text-status-warning-text',\n urgent: 'bg-status-error-bg text-status-error-text',\n};\n\nconst CREATE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Title', type: 'text', required: true, colSpan: 2 },\n { name: 'content', label: 'Content', type: 'textarea', required: true, colSpan: 2 },\n { name: 'author', label: 'Author', type: 'text', required: true },\n { name: 'authorRole', label: 'Author Role', type: 'text', required: true },\n {\n name: 'category',\n label: 'Category',\n type: 'select',\n required: true,\n options: CATEGORY_OPTIONS,\n placeholder: 'Select a category',\n },\n {\n name: 'priority',\n label: 'Priority',\n type: 'select',\n required: true,\n options: PRIORITY_OPTIONS,\n placeholder: 'Select a priority',\n },\n { name: 'tags', label: 'Tags', type: 'tags', placeholder: 'Add a tag and press Enter' },\n { name: 'isPinned', label: 'Pin to top', type: 'switch' },\n];\n\n// Author/role are immutable after creation (they are not part of the update\n// input), so the edit form omits them.\nconst EDIT_FIELDS: FieldConfig[] = CREATE_FIELDS.filter(\n (field) => field.name !== 'author' && field.name !== 'authorRole'\n);\n\nconst relativeTime = (value: string): string => {\n if (!value) {\n return '';\n }\n try {\n return formatRelativeTime(value);\n } catch {\n return value;\n }\n};\n\nexport function CommunicationsAnnouncementsPagePage() {\n const { announcements, notifications, addAnnouncement, updateAnnouncement, removeAnnouncement } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const navigate = useNavigate();\n const form = useFormModal<Announcement>();\n const [deleteTarget, setDeleteTarget] = useState<Announcement | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [search, setSearch] = useState('');\n const [draftMessage, setDraftMessage] = useState('');\n\n const editing = form.context;\n\n // Real conversations surfaced by the workspace overlap query land in the store\n // as `communications`-category notifications (id `conversation-*`). Render the\n // rail from that real data — no fabricated threads.\n const conversations = useMemo(\n () => notifications.filter((n) => n.category === 'communications'),\n [notifications]\n );\n\n const query = search.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n query.length === 0\n ? announcements\n : announcements.filter((a) =>\n `${a.title} ${a.content} ${a.tags.join(' ')}`.toLowerCase().includes(query)\n ),\n [announcements, query]\n );\n\n const pinned = filtered.filter((a) => a.isPinned);\n const regular = filtered.filter((a) => !a.isPinned);\n\n const handleSubmit = async (values: FormValues) => {\n const tags = Array.isArray(values.tags) ? values.tags : [];\n if (editing) {\n await updateAnnouncement(editing.id, {\n title: String(values.title),\n content: String(values.content),\n category: String(values.category) as Announcement['category'],\n priority: String(values.priority) as Announcement['priority'],\n isPinned: Boolean(values.isPinned),\n tags,\n });\n showToast('Announcement updated', 'success');\n return;\n }\n await addAnnouncement({\n id: crypto.randomUUID(),\n title: String(values.title),\n content: String(values.content),\n author: String(values.author),\n authorRole: String(values.authorRole),\n category: String(values.category) as Announcement['category'],\n priority: String(values.priority) as Announcement['priority'],\n isPinned: Boolean(values.isPinned),\n createdAt: new Date().toISOString().slice(0, 10),\n viewCount: 0,\n tags,\n });\n showToast('Announcement published', 'success');\n };\n\n const togglePin = async (announcement: Announcement) => {\n try {\n await updateAnnouncement(announcement.id, { isPinned: !announcement.isPinned });\n showToast(announcement.isPinned ? 'Unpinned' : 'Pinned to top', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to update announcement', 'error');\n }\n };\n\n const confirmDelete = async () => {\n if (!deleteTarget) {\n return;\n }\n setDeleting(true);\n try {\n await removeAnnouncement(deleteTarget.id);\n showToast('Announcement deleted', 'success');\n setDeleteTarget(null);\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to delete announcement', 'error');\n } finally {\n setDeleting(false);\n }\n };\n\n const openMessages = () => navigate('../communications/messages-page');\n\n const initialValues: FormValues | undefined = editing\n ? {\n title: editing.title,\n content: editing.content,\n category: editing.category,\n priority: editing.priority,\n tags: editing.tags,\n isPinned: editing.isPinned,\n }\n : undefined;\n\n const renderCard = (ann: Announcement, isPinnedCard: boolean) => (\n <GlassCard\n key={ann.id}\n treatment={isPinnedCard ? 'glass' : 'plain'}\n glow={isPinnedCard}\n className=\"transition-shadow hover:shadow-elevation-2\"\n >\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge className={`border-transparent text-[10px] ${PRIORITY_STYLE[ann.priority]}`}>\n {formatEnumLabel(ann.priority)}\n </Badge>\n <Badge className={`border-transparent text-[10px] ${CATEGORY_STYLE[ann.category]}`}>\n {formatEnumLabel(ann.category)}\n </Badge>\n <span className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <AvatarStack people={[{ name: ann.author }]} size={20} />\n {ann.author}\n <span className=\"text-text-muted\">· {relativeTime(ann.createdAt)}</span>\n </span>\n </div>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={`h-7 w-7 ${ann.isPinned ? 'text-status-info-text' : ''}`}\n aria-label={ann.isPinned ? `Unpin ${ann.title}` : `Pin ${ann.title}`}\n aria-pressed={ann.isPinned}\n onClick={() => void togglePin(ann)}\n >\n {ann.isPinned ? <PinOff className=\"h-3.5 w-3.5\" /> : <Pin className=\"h-3.5 w-3.5\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label={`Edit announcement ${ann.title}`}\n onClick={() => form.openModal(ann)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-status-error-text\"\n aria-label={`Delete announcement ${ann.title}`}\n onClick={() => setDeleteTarget(ann)}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n <CardTitle className=\"text-base\">{ann.title}</CardTitle>\n </CardHeader>\n <CardContent className=\"pt-0\">\n <p className=\"text-sm text-text-secondary\">{ann.content}</p>\n {ann.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {ann.tags.map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px]\">\n {t}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"mt-3 flex items-center gap-1 text-xs text-text-muted\">\n <Eye className=\"h-3 w-3\" />\n {ann.viewCount} read\n </div>\n </CardContent>\n </GlassCard>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Announcements</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {announcements.length} company announcements\n </p>\n <PagePurpose className=\"mt-1\">\n Broadcast company-wide news and updates so everyone stays informed — post announcements\n here when you have something the whole team needs to see.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => form.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Announcement\n </Button>\n </div>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search announcements...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Feed */}\n <div className=\"space-y-4 lg:col-span-2\">\n {filtered.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title={query ? 'No announcements match' : 'No announcements yet'}\n description={\n query\n ? 'Try a different search term.'\n : 'Post an announcement to share news with the whole team.'\n }\n />\n )}\n {pinned.length > 0 && (\n <div className=\"space-y-3\">\n <h2 className=\"flex items-center gap-1 text-sm font-medium\">\n <Pin className=\"h-4 w-4\" />\n Pinned\n </h2>\n {pinned.map((ann) => renderCard(ann, true))}\n </div>\n )}\n {regular.length > 0 && (\n <div className=\"space-y-3\">{regular.map((ann) => renderCard(ann, false))}</div>\n )}\n </div>\n\n {/* Conversations rail */}\n <div className=\"lg:col-span-1\">\n <Card className=\"lg:sticky lg:top-6\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-3\">\n <CardTitle className=\"text-base\">Conversations</CardTitle>\n <Button variant=\"ghost\" size=\"sm\" onClick={openMessages}>\n <MessageSquare className=\"mr-1 h-3.5 w-3.5\" />\n Open\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-1\">\n {conversations.length === 0 ? (\n <p className=\"py-6 text-center text-xs text-text-muted\">\n No active conversations yet. Team channels will appear here as they get activity.\n </p>\n ) : (\n conversations.map((conv) => (\n <button\n key={conv.id}\n type=\"button\"\n onClick={openMessages}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-card)] p-2 text-left transition-colors hover:bg-bg-sunken\"\n >\n <AvatarStack people={[{ name: conv.title }]} size={32} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"truncate text-sm font-medium\">{conv.title}</p>\n <span className=\"shrink-0 text-[10px] text-text-muted\">\n {relativeTime(conv.createdAt)}\n </span>\n </div>\n <p className=\"truncate text-xs text-text-secondary\">{conv.message}</p>\n </div>\n {!conv.read && (\n <span\n className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full bg-status-success-text\"\n aria-label=\"Unread\"\n />\n )}\n </button>\n ))\n )}\n <div className=\"flex items-center gap-2 pt-3\">\n <Input\n placeholder=\"Type a message...\"\n className=\"h-9 flex-1\"\n value={draftMessage}\n onChange={(event) => setDraftMessage(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n openMessages();\n }\n }}\n aria-label=\"Message composer\"\n />\n <Button\n size=\"icon\"\n className=\"h-9 w-9 shrink-0\"\n aria-label=\"Open messages to send\"\n onClick={openMessages}\n >\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n\n <FormModal\n open={form.open}\n onOpenChange={form.onOpenChange}\n title={editing ? 'Edit Announcement' : 'New Announcement'}\n description={\n editing\n ? 'Update this announcement for the whole team.'\n : 'Share news and updates across the company.'\n }\n fields={editing ? EDIT_FIELDS : CREATE_FIELDS}\n initialValues={initialValues}\n submitLabel={editing ? 'Save changes' : 'Publish'}\n onSubmit={handleSubmit}\n />\n\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete announcement?</AlertDialogTitle>\n <AlertDialogDescription>\n {deleteTarget\n ? `\"${deleteTarget.title}\" will be permanently removed. This cannot be undone.`\n : ''}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={deleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n void confirmDelete();\n }}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CommunicationsAnnouncementsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsAnnouncementsPagePage.tsx"],"sourcesContent":["import {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { formatRelativeTime } from '@burdenoff/fe-libs/shared/utils';\nimport { Eye, MessageSquare, Pencil, Pin, PinOff, Plus, Search, Send, Trash2 } from 'lucide-react';\nimport { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useCrewFoundryStore, type Announcement } from '../store/crewfoundryStore';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { AvatarStack } from '../components/viz';\n\nconst CATEGORY_OPTIONS = [\n { label: 'General', value: 'general' },\n { label: 'HR', value: 'hr' },\n { label: 'IT', value: 'it' },\n { label: 'Emergency', value: 'emergency' },\n { label: 'Event', value: 'event' },\n];\n\nconst PRIORITY_OPTIONS = [\n { label: 'Low', value: 'low' },\n { label: 'Medium', value: 'medium' },\n { label: 'High', value: 'high' },\n { label: 'Urgent', value: 'urgent' },\n];\n\n// Category → tokenized pill styling (semantic tokens only — themes cleanly).\nconst CATEGORY_STYLE: Record<Announcement['category'], string> = {\n general: 'bg-bg-sunken text-text-secondary',\n hr: 'bg-status-success-bg text-status-success-text',\n it: 'bg-bg-sunken text-text-secondary',\n emergency: 'bg-status-error-bg text-status-error-text',\n event: 'bg-status-info-bg text-status-info-text',\n};\n\nconst PRIORITY_STYLE: Record<Announcement['priority'], string> = {\n low: 'bg-bg-sunken text-text-secondary',\n medium: 'bg-bg-sunken text-text-secondary',\n high: 'bg-status-warning-bg text-status-warning-text',\n urgent: 'bg-status-error-bg text-status-error-text',\n};\n\nconst CREATE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Title', type: 'text', required: true, colSpan: 2 },\n { name: 'content', label: 'Content', type: 'textarea', required: true, colSpan: 2 },\n { name: 'author', label: 'Author', type: 'text', required: true },\n { name: 'authorRole', label: 'Author Role', type: 'text', required: true },\n {\n name: 'category',\n label: 'Category',\n type: 'select',\n required: true,\n options: CATEGORY_OPTIONS,\n placeholder: 'Select a category',\n },\n {\n name: 'priority',\n label: 'Priority',\n type: 'select',\n required: true,\n options: PRIORITY_OPTIONS,\n placeholder: 'Select a priority',\n },\n { name: 'tags', label: 'Tags', type: 'tags', placeholder: 'Add a tag and press Enter' },\n { name: 'isPinned', label: 'Pin to top', type: 'switch' },\n];\n\n// Author/role are immutable after creation (they are not part of the update\n// input), so the edit form omits them.\nconst EDIT_FIELDS: FieldConfig[] = CREATE_FIELDS.filter(\n (field) => field.name !== 'author' && field.name !== 'authorRole'\n);\n\nconst relativeTime = (value: string): string => {\n if (!value) {\n return '';\n }\n try {\n return formatRelativeTime(value);\n } catch {\n return value;\n }\n};\n\nexport function CommunicationsAnnouncementsPagePage() {\n const { announcements, notifications, addAnnouncement, updateAnnouncement, removeAnnouncement } =\n useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const navigate = useNavigate();\n const form = useFormModal<Announcement>();\n const [deleteTarget, setDeleteTarget] = useState<Announcement | null>(null);\n const [deleting, setDeleting] = useState(false);\n const [search, setSearch] = useState('');\n const [draftMessage, setDraftMessage] = useState('');\n\n const editing = form.context;\n\n // Real conversations surfaced by the workspace overlap query land in the store\n // as `communications`-category notifications (id `conversation-*`). Render the\n // rail from that real data — no fabricated threads.\n const conversations = useMemo(\n () => notifications.filter((n) => n.category === 'communications'),\n [notifications]\n );\n\n const query = search.trim().toLowerCase();\n const filtered = useMemo(\n () =>\n query.length === 0\n ? announcements\n : announcements.filter((a) =>\n `${a.title} ${a.content} ${a.tags.join(' ')}`.toLowerCase().includes(query)\n ),\n [announcements, query]\n );\n\n const pinned = filtered.filter((a) => a.isPinned);\n const regular = filtered.filter((a) => !a.isPinned);\n\n const handleSubmit = async (values: FormValues) => {\n const tags = Array.isArray(values.tags) ? values.tags : [];\n if (editing) {\n await updateAnnouncement(editing.id, {\n title: String(values.title),\n content: String(values.content),\n category: String(values.category) as Announcement['category'],\n priority: String(values.priority) as Announcement['priority'],\n isPinned: Boolean(values.isPinned),\n tags,\n });\n showToast('Announcement updated', 'success');\n return;\n }\n await addAnnouncement({\n id: crypto.randomUUID(),\n title: String(values.title),\n content: String(values.content),\n author: String(values.author),\n authorRole: String(values.authorRole),\n category: String(values.category) as Announcement['category'],\n priority: String(values.priority) as Announcement['priority'],\n isPinned: Boolean(values.isPinned),\n createdAt: new Date().toISOString().slice(0, 10),\n viewCount: 0,\n tags,\n });\n showToast('Announcement published', 'success');\n };\n\n const togglePin = async (announcement: Announcement) => {\n try {\n await updateAnnouncement(announcement.id, { isPinned: !announcement.isPinned });\n showToast(announcement.isPinned ? 'Unpinned' : 'Pinned to top', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to update announcement', 'error');\n }\n };\n\n const confirmDelete = async () => {\n if (!deleteTarget) {\n return;\n }\n setDeleting(true);\n try {\n await removeAnnouncement(deleteTarget.id);\n showToast('Announcement deleted', 'success');\n setDeleteTarget(null);\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to delete announcement', 'error');\n } finally {\n setDeleting(false);\n }\n };\n\n const openMessages = () => navigate('../communications/messages-page');\n\n const initialValues: FormValues | undefined = editing\n ? {\n title: editing.title,\n content: editing.content,\n category: editing.category,\n priority: editing.priority,\n tags: editing.tags,\n isPinned: editing.isPinned,\n }\n : undefined;\n\n const renderCard = (ann: Announcement, isPinnedCard: boolean) => (\n <GlassCard\n key={ann.id}\n treatment={isPinnedCard ? 'glass' : 'plain'}\n glow={isPinnedCard}\n className=\"transition-shadow hover:shadow-elevation-2\"\n >\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <Badge className={`border-transparent text-[10px] ${PRIORITY_STYLE[ann.priority]}`}>\n {formatEnumLabel(ann.priority)}\n </Badge>\n <Badge className={`border-transparent text-[10px] ${CATEGORY_STYLE[ann.category]}`}>\n {formatEnumLabel(ann.category)}\n </Badge>\n <span className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n <AvatarStack people={[{ name: ann.author }]} size={20} />\n {ann.author}\n <span className=\"text-text-muted\">· {relativeTime(ann.createdAt)}</span>\n </span>\n </div>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={`h-7 w-7 ${ann.isPinned ? 'text-status-info-text' : ''}`}\n aria-label={ann.isPinned ? `Unpin ${ann.title}` : `Pin ${ann.title}`}\n aria-pressed={ann.isPinned}\n onClick={() => void togglePin(ann)}\n >\n {ann.isPinned ? <PinOff className=\"h-3.5 w-3.5\" /> : <Pin className=\"h-3.5 w-3.5\" />}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7\"\n aria-label={`Edit announcement ${ann.title}`}\n onClick={() => form.openModal(ann)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 text-status-error-text\"\n aria-label={`Delete announcement ${ann.title}`}\n onClick={() => setDeleteTarget(ann)}\n >\n <Trash2 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n </div>\n <CardTitle className=\"text-base\">{ann.title}</CardTitle>\n </CardHeader>\n <CardContent className=\"pt-0\">\n <p className=\"text-sm text-text-secondary\">{ann.content}</p>\n {ann.tags.length > 0 && (\n <div className=\"mt-3 flex flex-wrap gap-1\">\n {ann.tags.map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px]\">\n {t}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"mt-3 flex items-center gap-1 text-xs text-text-muted\">\n <Eye className=\"h-3 w-3\" />\n {ann.viewCount} read\n </div>\n </CardContent>\n </GlassCard>\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Announcements</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {announcements.length} company announcements\n </p>\n <PagePurpose className=\"mt-1\">\n Broadcast company-wide news and updates so everyone stays informed — post announcements\n here when you have something the whole team needs to see.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => form.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Announcement\n </Button>\n </div>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search announcements...\"\n className=\"pl-9\"\n value={search}\n onChange={(event) => setSearch(event.target.value)}\n />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Feed */}\n <div className=\"space-y-4 lg:col-span-2\">\n {filtered.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title={query ? 'No announcements match' : 'No announcements yet'}\n description={\n query\n ? 'Try a different search term.'\n : 'Post an announcement to share news with the whole team.'\n }\n />\n )}\n {pinned.length > 0 && (\n <div className=\"space-y-3\">\n <h2 className=\"flex items-center gap-1 text-sm font-medium\">\n <Pin className=\"h-4 w-4\" />\n Pinned\n </h2>\n {pinned.map((ann) => renderCard(ann, true))}\n </div>\n )}\n {regular.length > 0 && (\n <div className=\"space-y-3\">{regular.map((ann) => renderCard(ann, false))}</div>\n )}\n </div>\n\n {/* Conversations rail */}\n <div className=\"lg:col-span-1\">\n <Card className=\"lg:sticky lg:top-6\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-3\">\n <CardTitle className=\"text-base\">Conversations</CardTitle>\n <Button variant=\"ghost\" size=\"sm\" onClick={openMessages}>\n <MessageSquare className=\"mr-1 h-3.5 w-3.5\" />\n Open\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-1\">\n {conversations.length === 0 ? (\n <p className=\"py-6 text-center text-xs text-text-muted\">\n No active conversations yet. Team channels will appear here as they get activity.\n </p>\n ) : (\n conversations.map((conv) => (\n <button\n key={conv.id}\n type=\"button\"\n onClick={openMessages}\n className=\"flex w-full items-start gap-3 rounded-[var(--radius-card)] p-2 text-left transition-colors hover:bg-bg-sunken\"\n >\n <AvatarStack people={[{ name: conv.title }]} size={32} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"truncate text-sm font-medium\">{conv.title}</p>\n <span className=\"shrink-0 text-[10px] text-text-muted\">\n {relativeTime(conv.createdAt)}\n </span>\n </div>\n <p className=\"truncate text-xs text-text-secondary\">{conv.message}</p>\n </div>\n {!conv.read && (\n <span\n className=\"mt-1.5 h-2 w-2 shrink-0 rounded-full bg-status-success-text\"\n aria-label=\"Unread\"\n />\n )}\n </button>\n ))\n )}\n <div className=\"flex items-center gap-2 pt-3\">\n <Input\n placeholder=\"Type a message...\"\n className=\"h-9 flex-1\"\n value={draftMessage}\n onChange={(event) => setDraftMessage(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n openMessages();\n }\n }}\n aria-label=\"Message composer\"\n />\n <Button\n size=\"icon\"\n className=\"h-9 w-9 shrink-0\"\n aria-label=\"Open messages to send\"\n onClick={openMessages}\n >\n <Send className=\"h-4 w-4\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n\n <FormModal\n open={form.open}\n onOpenChange={form.onOpenChange}\n title={editing ? 'Edit Announcement' : 'New Announcement'}\n description={\n editing\n ? 'Update this announcement for the whole team.'\n : 'Share news and updates across the company.'\n }\n fields={editing ? EDIT_FIELDS : CREATE_FIELDS}\n initialValues={initialValues}\n submitLabel={editing ? 'Save changes' : 'Publish'}\n onSubmit={handleSubmit}\n />\n\n <AlertDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n >\n <AlertDialogContent>\n <AlertDialogHeader>\n <AlertDialogTitle>Delete announcement?</AlertDialogTitle>\n <AlertDialogDescription>\n {deleteTarget\n ? `\"${deleteTarget.title}\" will be permanently removed. This cannot be undone.`\n : ''}\n </AlertDialogDescription>\n </AlertDialogHeader>\n <AlertDialogFooter>\n <AlertDialogCancel disabled={deleting}>Cancel</AlertDialogCancel>\n <AlertDialogAction\n onClick={(event) => {\n event.preventDefault();\n void confirmDelete();\n }}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete'}\n </AlertDialogAction>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FolderInput as e } from "lucide-react";
|
|
2
|
-
import { useNavigate as t } from "react-router
|
|
2
|
+
import { useNavigate as t } from "react-router";
|
|
3
3
|
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
4
|
import { Button as i, GlassCard as a, GradientText as o, IllustratedEmptyState as s, PagePurpose as c } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/CommunicationsFilesPagePage.tsx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommunicationsFilesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsFilesPagePage.tsx"],"sourcesContent":["import {\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useNavigate } from 'react-router
|
|
1
|
+
{"version":3,"file":"CommunicationsFilesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsFilesPagePage.tsx"],"sourcesContent":["import {\n Button,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useNavigate } from 'react-router';\nimport { FolderInput } from 'lucide-react';\n\n// Files are owned by the platform Files service (wspace-files-svc), surfaced in\n// this app shell at the `/files` route. CrewFoundry keeps no bespoke file store,\n// so this page routes into the real Files experience rather than manufacturing\n// a fabricated file list.\nconst FILES_BROWSE_ROUTE = '/files/browse';\n\nexport function CommunicationsFilesPagePage() {\n const navigate = useNavigate();\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Shared Files</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Company documents live in the Files workspace\n </p>\n <PagePurpose className=\"mt-1\">\n A shared space for company documents and files — store, search, and share the resources\n your teams need to get work done.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => navigate(FILES_BROWSE_ROUTE)}>\n <FolderInput className=\"mr-1 h-4 w-4\" />\n Browse Files\n </Button>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"Files live in the Files workspace\"\n description=\"CrewFoundry shares documents through the platform Files service. Open the Files workspace to browse, upload, and manage the files your teams work with.\"\n action={\n <Button size=\"sm\" onClick={() => navigate(FILES_BROWSE_ROUTE)}>\n <FolderInput className=\"mr-1 h-4 w-4\" />\n Browse Files\n </Button>\n }\n />\n </div>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;;;AAcA,IAAM,IAAqB;AAE3B,SAAgB,IAA8B;CAC5C,IAAM,IAAW,GAAa;AAE9B,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,gBAA2B,CAAA;KACtC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA;IACJ,kBAAC,GAAD;KAAa,WAAU;eAAO;KAGhB,CAAA;IACV,EAAA,CAAA,EACN,kBAAC,GAAD;IAAQ,MAAK;IAAK,eAAe,EAAS,EAAmB;cAA7D,CACE,kBAAC,GAAD,EAAa,WAAU,gBAAiB,CAAA,EAAA,eAEjC;MACL;MAEN,kBAAC,GAAD;GAAW,WAAU;GAAQ,MAAA;GAAK,WAAU;aAC1C,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,QACE,kBAAC,GAAD;MAAQ,MAAK;MAAK,eAAe,EAAS,EAAmB;gBAA7D,CACE,kBAAC,GAAD,EAAa,WAAU,gBAAiB,CAAA,EAAA,eAEjC;;KAEX,CAAA;IACE,CAAA;GACI,CAAA,CACR"}
|
|
@@ -2,7 +2,7 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
3
|
import { FormModal as n, useFormModal as r } from "../components/forms/FormModal.js";
|
|
4
4
|
import { FolderKanban as i, Plus as a, Users as o } from "lucide-react";
|
|
5
|
-
import { useNavigate as s } from "react-router
|
|
5
|
+
import { useNavigate as s } from "react-router";
|
|
6
6
|
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
7
|
import { Badge as u, Button as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, IllustratedEmptyState as v, PagePurpose as y, Pagination as b } from "@burdenoff/fe-libs/ui";
|
|
8
8
|
import { usePagination as x } from "@burdenoff/fe-libs/shared/hooks";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommunicationsTeamsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsTeamsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { FolderKanban, Plus, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router
|
|
1
|
+
{"version":3,"file":"CommunicationsTeamsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsTeamsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { FolderKanban, Plus, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router';\nimport {\n FormModal,\n useFormModal,\n type FieldConfig,\n type FormValues,\n} from '../components/forms/FormModal';\nimport { useCrewFoundryStore, type Team } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\n// CreateCrewTeamInput accepts only this field subset; the store spreads the\n// object straight into `input`, so we send exactly the accepted shape.\nconst CHANNEL_FIELDS: FieldConfig[] = [\n { name: 'name', label: 'Channel Name', type: 'text', required: true },\n { name: 'department', label: 'Department', type: 'text', placeholder: 'e.g. Engineering' },\n { name: 'leadName', label: 'Channel Lead', type: 'text', placeholder: 'Lead full name' },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Forming', value: 'forming' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n];\n\nexport function CommunicationsTeamsPagePage() {\n const navigate = useNavigate();\n const { teams } = useCrewFoundryStore();\n const addTeam = useCrewFoundryStore((state) => state.addTeam);\n const createModal = useFormModal();\n const { page, pageSize, setPage } = usePagination({ initialPageSize: 12 });\n\n const pageTeams = teams.slice((page - 1) * pageSize, (page - 1) * pageSize + pageSize);\n\n const openTeam = (team: Team) =>\n navigate(`../teams/team-detail-page?id=${encodeURIComponent(team.id)}`);\n\n const handleCreate = async (values: FormValues) => {\n const payload: Partial<Team> = {\n name: String(values.name ?? '').trim(),\n description: String(values.description ?? '').trim(),\n department: String(values.department ?? '').trim() || 'operations',\n leadName: String(values.leadName ?? '').trim(),\n status: (String(values.status ?? 'forming') as Team['status']) || 'forming',\n members: [],\n };\n await addTeam(payload as Team);\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Team Channels</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{teams.length} active team channels</p>\n <PagePurpose className=\"mt-1\">\n Jump into team channels to collaborate with your groups — a focused place for each\n team's ongoing discussion.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => createModal.openModal()}>\n <Plus className=\"h-4 w-4 mr-1\" />\n New Channel\n </Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {teams.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No team channels\"\n description=\"Create a channel to give a team a focused place to collaborate.\"\n />\n </div>\n ) : (\n pageTeams.map((team, _idx) => (\n <GlassCard\n key={team.id}\n treatment={_idx === 0 && page === 1 ? 'glass' : 'plain'}\n glow={_idx === 0 && page === 1}\n role=\"button\"\n tabIndex={0}\n aria-label={`Open ${team.name} channel`}\n onClick={() => openTeam(team)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openTeam(team);\n }\n }}\n className=\"cursor-pointer hover:shadow-md transition-shadow focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{team.name}</CardTitle>\n <Badge\n variant={team.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(team.status)}\n </Badge>\n </div>\n <CardDescription>{team.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {team.memberCount} members\n </span>\n <span className=\"flex items-center gap-1\">\n <FolderKanban className=\"h-3 w-3\" />\n {team.projectCount} projects\n </span>\n </div>\n <div className=\"mt-2 text-xs text-text-secondary\">\n <span>Lead: {team.leadName}</span> · <span>{team.department}</span>\n </div>\n </CardContent>\n </GlassCard>\n ))\n )}\n </div>\n\n {teams.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={teams.length}\n onPageChange={setPage}\n />\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title=\"New Channel\"\n description=\"Give a team a focused place to collaborate.\"\n fields={CHANNEL_FIELDS}\n submitLabel=\"Create Channel\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { FormModal as te, useFormModal as i } from "../components/forms/FormModa
|
|
|
8
8
|
import { thisQuarterRevenue as a, totalContractValue as o } from "../lib/companyFinance.js";
|
|
9
9
|
import { useState as s } from "react";
|
|
10
10
|
import { MoreHorizontal as c, Pencil as l, Plus as u, Search as ne, Trash2 as re } from "lucide-react";
|
|
11
|
-
import { useNavigate as ie } from "react-router
|
|
11
|
+
import { useNavigate as ie } from "react-router";
|
|
12
12
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
13
13
|
import { AlertDialog as ae, AlertDialogAction as oe, AlertDialogCancel as se, AlertDialogContent as ce, AlertDialogDescription as le, AlertDialogFooter as p, AlertDialogHeader as m, AlertDialogTitle as h, Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x, DropdownMenu as S, DropdownMenuContent as C, DropdownMenuItem as w, DropdownMenuSeparator as T, DropdownMenuTrigger as E, GradientText as D, IllustratedEmptyState as O, Input as k, PagePurpose as A, Pagination as j, ResponsiveTable as M, Select as N, SelectContent as P, SelectItem as F, SelectTrigger as I, SelectValue as ue } from "@burdenoff/fe-libs/ui";
|
|
14
14
|
import { usePagination as L } from "@burdenoff/fe-libs/shared/hooks";
|