@burdenoff/microfe-crewfoundry 2026.625.1 → 2026.626.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/pages/AdminAdminPagePage.js +37 -29
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +50 -42
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +39 -31
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +52 -44
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +46 -38
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +30 -22
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +86 -67
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +37 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +42 -35
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +41 -33
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +142 -108
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +177 -136
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +44 -36
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +49 -38
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +53 -46
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +31 -23
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +129 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +96 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +47 -35
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +33 -25
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +36 -28
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +27 -19
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +27 -19
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +111 -70
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +65 -53
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +35 -19
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +33 -25
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +26 -18
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +80 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +31 -23
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +35 -27
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +147 -112
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +31 -23
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +75 -56
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +133 -92
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +93 -52
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +28 -20
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +41 -33
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +103 -72
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +28 -20
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +103 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n BookOpen,\n ChevronRight,\n Code2,\n Copy,\n ExternalLink,\n Lock,\n Search,\n Server,\n Zap,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nconst methodColors: Record<string, string> = {\n GET: 'bg-status-success-bg text-status-success-text',\n POST: 'bg-status-info-bg text-status-info-text',\n PATCH: 'bg-status-warning-bg text-status-warning-text',\n DELETE: 'bg-status-error-bg text-status-error-text',\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const apiSections = useMemo(\n () => [\n {\n name: 'Employees',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/employees',\n description: `List all employees (${employees.length} records) with pagination and filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/employees',\n description: 'Create a new employee record',\n },\n {\n method: 'GET',\n path: '/api/v2/employees/:id',\n description: 'Get employee details by ID',\n },\n {\n method: 'PATCH',\n path: '/api/v2/employees/:id',\n description: 'Update employee information',\n },\n {\n method: 'DELETE',\n path: '/api/v2/employees/:id',\n description: 'Deactivate an employee record',\n },\n ],\n },\n {\n name: 'Hiring',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/jobs',\n description: `List all job postings (${jobPostings.length} total)`,\n },\n { method: 'POST', path: '/api/v2/jobs', description: 'Create a new job posting' },\n {\n method: 'GET',\n path: '/api/v2/candidates',\n description: `List candidates (${candidates.length}) with pipeline filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/candidates',\n description: 'Add a new candidate to the pipeline',\n },\n ],\n },\n {\n name: 'Payroll',\n version: 'v1',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v1/payroll/records',\n description: `List payroll records by period (${payrollRecords.length} loaded)`,\n },\n {\n method: 'POST',\n path: '/api/v1/payroll/run',\n description: 'Trigger payroll processing',\n },\n {\n method: 'GET',\n path: '/api/v1/payroll/reports',\n description: 'Generate payroll reports',\n },\n ],\n },\n {\n name: 'Leave',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/leave/requests',\n description: `List leave requests with status filters (${leaveRequests.length} total)`,\n },\n {\n method: 'POST',\n path: '/api/v2/leave/requests',\n description: 'Submit a new leave request',\n },\n {\n method: 'PATCH',\n path: '/api/v2/leave/requests/:id/approve',\n description: 'Approve a leave request',\n },\n ],\n },\n ],\n [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]\n );\n\n const handleCopy = (path: string) => {\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 1500);\n };\n\n const filteredSections = apiSections\n .map((section) => ({\n ...section,\n endpoints: section.endpoints.filter(\n (ep) =>\n ep.path.toLowerCase().includes(search.toLowerCase()) ||\n ep.description.toLowerCase().includes(search.toLowerCase())\n ),\n }))\n .filter((s) => s.endpoints.length > 0);\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>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry REST API reference for integrations\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant=\"secondary\">Base URL: api.crewfoundry.com</Badge>\n <Button size=\"sm\" variant=\"outline\">\n <ExternalLink className=\"h-3 w-3 mr-1\" />\n OpenAPI Spec\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n { icon: Server, label: 'REST API', value: 'v2.1.0', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'GraphQL',\n value: 'Federation v2',\n color: 'text-action-primary-bg',\n },\n {\n icon: Lock,\n label: 'Auth',\n value: 'OAuth 2.0 + JWT',\n color: 'text-status-success-text',\n },\n {\n icon: Zap,\n label: 'Rate Limit',\n value: '1,000 req/min',\n color: 'text-status-warning-text',\n },\n ].map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Quick Start</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {[\n { icon: BookOpen, label: 'Authentication Guide' },\n { icon: Code2, label: 'SDK Reference' },\n { icon: Zap, label: 'Webhooks' },\n { icon: Server, label: 'Rate Limiting' },\n ].map((link) => (\n <button\n key={link.label}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-bg-sunken transition-colors\"\n >\n <link.icon className=\"h-3 w-3 text-text-secondary\" />\n <span>{link.label}</span>\n <ChevronRight className=\"h-3 w-3 ml-auto text-text-secondary\" />\n </button>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"text-xs font-mono\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n All API requests require a valid JWT token obtained through the OAuth 2.0 flow.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"lg:col-span-3 space-y-4\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search endpoints...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {filteredSections.map((section) => (\n <Card key={section.name}>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-base\">{section.name}</CardTitle>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {section.version}\n </Badge>\n </div>\n <CardDescription>{section.endpoints.length} endpoints</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {section.endpoints.map((ep, i) => (\n <div\n key={ep.path + ep.method}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 cursor-pointer ${i < section.endpoints.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${methodColors[ep.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`}\n >\n {ep.method}\n </Badge>\n <code className=\"text-sm font-mono flex-1\">{ep.path}</code>\n <span className=\"text-xs text-text-secondary hidden lg:block max-w-[250px] truncate\">\n {ep.description}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => handleCopy(ep.path)}\n >\n <Copy\n className={`h-3 w-3 ${copiedPath === ep.path ? 'text-status-success-text' : 'text-text-secondary'}`}\n />\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredSections.length === 0 && (\n <div className=\"rounded-lg border p-8 text-center text-sm text-text-secondary\">\n No endpoints match your search criteria.\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;AAyBA,IAAM,IAAuC;CAC3C,KAAK;CACL,MAAM;CACN,OAAO;CACP,QAAQ;CACT;AAED,SAAgB,IAA+B;CAC7C,IAAM,EAAE,cAAW,gBAAa,eAAY,mBAAgB,qBAC1D,GAAqB,EACjB,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAY,KAAiB,EAAwB,KAAK,EAE3D,IAAc,QACZ;EACJ;GACE,MAAM;GACN,SAAS;GACT,WAAW;IACT;KACE,QAAQ;KACR,MAAM;KACN,aAAa,uBAAuB,EAAU,OAAO;KACtD;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACF;GACF;EACD;GACE,MAAM;GACN,SAAS;GACT,WAAW;IACT;KACE,QAAQ;KACR,MAAM;KACN,aAAa,0BAA0B,EAAY,OAAO;KAC3D;IACD;KAAE,QAAQ;KAAQ,MAAM;KAAgB,aAAa;KAA4B;IACjF;KACE,QAAQ;KACR,MAAM;KACN,aAAa,oBAAoB,EAAW,OAAO;KACpD;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACF;GACF;EACD;GACE,MAAM;GACN,SAAS;GACT,WAAW;IACT;KACE,QAAQ;KACR,MAAM;KACN,aAAa,mCAAmC,EAAe,OAAO;KACvE;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACF;GACF;EACD;GACE,MAAM;GACN,SAAS;GACT,WAAW;IACT;KACE,QAAQ;KACR,MAAM;KACN,aAAa,4CAA4C,EAAc,OAAO;KAC/E;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACD;KACE,QAAQ;KACR,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF,EACD;EACE,EAAW;EACX,EAAU;EACV,EAAY;EACZ,EAAc;EACd,EAAe;EAChB,CACF,EAEK,KAAc,MAAiB;AAEnC,EADA,EAAc,EAAK,EACnB,iBAAiB,EAAc,KAAK,EAAE,KAAK;IAGvC,IAAmB,EACtB,KAAK,OAAa;EACjB,GAAG;EACH,WAAW,EAAQ,UAAU,QAC1B,MACC,EAAG,KAAK,aAAa,CAAC,SAAS,EAAO,aAAa,CAAC,IACpD,EAAG,YAAY,aAAa,CAAC,SAAS,EAAO,aAAa,CAAC,CAC9D;EACF,EAAE,CACF,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE;AAExC,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,qBAAgC,CAAA;KAC3C,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAEvC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAO,SAAQ;gBAAY;MAAqC,CAAA,EAChE,kBAAC,GAAD;MAAQ,MAAK;MAAK,SAAQ;gBAA1B,CACE,kBAAC,GAAD,EAAc,WAAU,gBAAiB,CAAA,EAAA,eAElC;QACL;OACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,MAAM;MAAQ,OAAO;MAAY,OAAO;MAAU,OAAO;MAAyB;KACpF;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;MACR;KACD;MACE,MAAM;MACN,OAAO;MACP,OAAO;MACP,OAAO;MACR;KACF,CAAC,KAAK,MACL,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACE,kBAAC,EAAK,MAAN,EAAW,WAAW,WAAW,EAAK,SAAW,CAAA,EACjD,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;MAAG,WAAU;gBAA+B,EAAK;MAAU,CAAA,EAC3D,kBAAC,KAAD;MAAG,WAAU;gBAAuB,EAAK;MAAU,CAAA,CAC/C,EAAA,CAAA,CACM;QACT,EARI,EAAK,MAQT,CACP;IACE,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAW,WAAU;gBAAU;MAAuB,CAAA,EAC3C,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBACpB;OACC;QAAE,MAAM;QAAU,OAAO;QAAwB;OACjD;QAAE,MAAM;QAAO,OAAO;QAAiB;OACvC;QAAE,MAAM;QAAK,OAAO;QAAY;OAChC;QAAE,MAAM;QAAQ,OAAO;QAAiB;OACzC,CAAC,KAAK,MACL,kBAAC,UAAD;OAEE,WAAU;iBAFZ;QAIE,kBAAC,EAAK,MAAN,EAAW,WAAU,+BAAgC,CAAA;QACrD,kBAAC,QAAD,EAAA,UAAO,EAAK,OAAa,CAAA;QACzB,kBAAC,GAAD,EAAc,WAAU,uCAAwC,CAAA;QACzD;SANF,EAAK,MAMH,CACT;MACU,CAAA,CACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAW,WAAU;gBAAU;MAA0B,CAAA,EAC9C,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAAoC,0BAAuB,UAAiB;;OACxE,CAAA,EACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAEvC,CAAA,CACQ;QACT,EAAA,CAAA,CACH;QAEN,kBAAC,OAAD;KAAK,WAAU;eAAf;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;QACE,aAAY;QACZ,WAAU;QACV,OAAO;QACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;QAC1C,CAAA,CACE;;MAEL,EAAiB,KAAK,MACrB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAa,EAAQ;QAAiB,CAAA,EAC3D,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAQ;QACH,CAAA,CACJ;UACN,kBAAC,GAAD,EAAA,UAAA,CAAkB,EAAQ,UAAU,QAAO,aAA4B,EAAA,CAAA,CAC5D,EAAA,CAAA,EACb,kBAAC,GAAD;OAAa,WAAU;iBACpB,EAAQ,UAAU,KAAK,GAAI,MAC1B,kBAAC,OAAD;QAEE,WAAW,0EAA0E,IAAI,EAAQ,UAAU,SAAS,IAAI,aAAa;kBAFvI;SAIE,kBAAC,GAAD;UACE,WAAW,GAAG,EAAa,EAAG,QAAQ;oBAErC,EAAG;UACE,CAAA;SACR,kBAAC,QAAD;UAAM,WAAU;oBAA4B,EAAG;UAAY,CAAA;SAC3D,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAG;UACC,CAAA;SACP,kBAAC,GAAD;UACE,SAAQ;UACR,MAAK;UACL,WAAU;UACV,eAAe,EAAW,EAAG,KAAK;oBAElC,kBAAC,GAAD,EACE,WAAW,WAAW,MAAe,EAAG,OAAO,6BAA6B,yBAC5E,CAAA;UACK,CAAA;SACL;UAtBC,EAAG,OAAO,EAAG,OAsBd,CACN;OACU,CAAA,CACT,EAAA,EAtCI,EAAQ,KAsCZ,CACP;MAED,EAAiB,WAAW,KAC3B,kBAAC,OAAD;OAAK,WAAU;iBAAgE;OAEzE,CAAA;MAEJ;OACF;;GACF"}
|
|
1
|
+
{"version":3,"file":"HelpApiDocumentationPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HelpApiDocumentationPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport {\n BookOpen,\n ChevronRight,\n Code2,\n Copy,\n ExternalLink,\n Lock,\n Search,\n Server,\n Zap,\n} from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nconst methodColors: Record<string, string> = {\n GET: 'bg-status-success-bg text-status-success-text',\n POST: 'bg-status-info-bg text-status-info-text',\n PATCH: 'bg-status-warning-bg text-status-warning-text',\n DELETE: 'bg-status-error-bg text-status-error-text',\n};\n\nexport function HelpApiDocumentationPagePage() {\n const { employees, jobPostings, candidates, payrollRecords, leaveRequests } =\n useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [copiedPath, setCopiedPath] = useState<string | null>(null);\n\n const apiSections = useMemo(\n () => [\n {\n name: 'Employees',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/employees',\n description: `List all employees (${employees.length} records) with pagination and filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/employees',\n description: 'Create a new employee record',\n },\n {\n method: 'GET',\n path: '/api/v2/employees/:id',\n description: 'Get employee details by ID',\n },\n {\n method: 'PATCH',\n path: '/api/v2/employees/:id',\n description: 'Update employee information',\n },\n {\n method: 'DELETE',\n path: '/api/v2/employees/:id',\n description: 'Deactivate an employee record',\n },\n ],\n },\n {\n name: 'Hiring',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/jobs',\n description: `List all job postings (${jobPostings.length} total)`,\n },\n { method: 'POST', path: '/api/v2/jobs', description: 'Create a new job posting' },\n {\n method: 'GET',\n path: '/api/v2/candidates',\n description: `List candidates (${candidates.length}) with pipeline filters`,\n },\n {\n method: 'POST',\n path: '/api/v2/candidates',\n description: 'Add a new candidate to the pipeline',\n },\n ],\n },\n {\n name: 'Payroll',\n version: 'v1',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v1/payroll/records',\n description: `List payroll records by period (${payrollRecords.length} loaded)`,\n },\n {\n method: 'POST',\n path: '/api/v1/payroll/run',\n description: 'Trigger payroll processing',\n },\n {\n method: 'GET',\n path: '/api/v1/payroll/reports',\n description: 'Generate payroll reports',\n },\n ],\n },\n {\n name: 'Leave',\n version: 'v2',\n endpoints: [\n {\n method: 'GET',\n path: '/api/v2/leave/requests',\n description: `List leave requests with status filters (${leaveRequests.length} total)`,\n },\n {\n method: 'POST',\n path: '/api/v2/leave/requests',\n description: 'Submit a new leave request',\n },\n {\n method: 'PATCH',\n path: '/api/v2/leave/requests/:id/approve',\n description: 'Approve a leave request',\n },\n ],\n },\n ],\n [\n candidates.length,\n employees.length,\n jobPostings.length,\n leaveRequests.length,\n payrollRecords.length,\n ]\n );\n\n const handleCopy = (path: string) => {\n setCopiedPath(path);\n setTimeout(() => setCopiedPath(null), 1500);\n };\n\n const filteredSections = apiSections\n .map((section) => ({\n ...section,\n endpoints: section.endpoints.filter(\n (ep) =>\n ep.path.toLowerCase().includes(search.toLowerCase()) ||\n ep.description.toLowerCase().includes(search.toLowerCase())\n ),\n }))\n .filter((s) => s.endpoints.length > 0);\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>API Documentation</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n CrewFoundry REST API reference for integrations\n </p>\n <PagePurpose className=\"mt-1\">Browse the CrewFoundry API reference — use it to find endpoints, understand request formats, and integrate CrewFoundry with your own tools.</PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Badge variant=\"secondary\">Base URL: api.crewfoundry.com</Badge>\n <Button size=\"sm\" variant=\"outline\">\n <ExternalLink className=\"h-3 w-3 mr-1\" />\n OpenAPI Spec\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n {[\n { icon: Server, label: 'REST API', value: 'v2.1.0', color: 'text-status-info-text' },\n {\n icon: Code2,\n label: 'GraphQL',\n value: 'Federation v2',\n color: 'text-action-primary-bg',\n },\n {\n icon: Lock,\n label: 'Auth',\n value: 'OAuth 2.0 + JWT',\n color: 'text-status-success-text',\n },\n {\n icon: Zap,\n label: 'Rate Limit',\n value: '1,000 req/min',\n color: 'text-status-warning-text',\n },\n ].map((item) => (\n <Card key={item.label}>\n <CardContent className=\"flex items-center gap-3 pt-6\">\n <item.icon className={`h-5 w-5 ${item.color}`} />\n <div>\n <p className=\"text-xs text-text-secondary\">{item.label}</p>\n <p className=\"text-sm font-medium\">{item.value}</p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-4\">\n <div className=\"space-y-4\">\n <EmphasisPanel>\n <div className=\"mb-2 text-sm font-semibold\">Quick Start</div>\n <div className=\"space-y-2\">\n {[\n { icon: BookOpen, label: 'Authentication Guide' },\n { icon: Code2, label: 'SDK Reference' },\n { icon: Zap, label: 'Webhooks' },\n { icon: Server, label: 'Rate Limiting' },\n ].map((link) => (\n <button\n key={link.label}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm hover:bg-bg-sunken transition-colors\"\n >\n <link.icon className=\"h-3 w-3 text-text-secondary\" />\n <span>{link.label}</span>\n <ChevronRight className=\"h-3 w-3 ml-auto text-text-secondary\" />\n </button>\n ))}\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm\">Authentication</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n <div className=\"rounded-md bg-bg-sunken p-3\">\n <code className=\"text-xs font-mono\">Authorization: Bearer {'<token>'}</code>\n </div>\n <p className=\"text-xs text-text-secondary\">\n All API requests require a valid JWT token obtained through the OAuth 2.0 flow.\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"lg:col-span-3 space-y-4\">\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search endpoints...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n\n {filteredSections.map((section) => (\n <Card key={section.name}>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <CardTitle className=\"text-base\">{section.name}</CardTitle>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {section.version}\n </Badge>\n </div>\n <CardDescription>{section.endpoints.length} endpoints</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n {section.endpoints.map((ep, i) => (\n <div\n key={ep.path + ep.method}\n className={`flex items-center gap-3 px-6 py-3 hover:bg-bg-sunken/50 cursor-pointer ${i < section.endpoints.length - 1 ? 'border-b' : ''}`}\n >\n <Badge\n className={`${methodColors[ep.method]} text-[10px] font-mono border-0 min-w-[50px] justify-center`}\n >\n {ep.method}\n </Badge>\n <code className=\"text-sm font-mono flex-1\">{ep.path}</code>\n <span className=\"text-xs text-text-secondary hidden lg:block max-w-[250px] truncate\">\n {ep.description}\n </span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onClick={() => handleCopy(ep.path)}\n >\n <Copy\n className={`h-3 w-3 ${copiedPath === ep.path ? 'text-status-success-text' : 'text-text-secondary'}`}\n />\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n ))}\n\n {filteredSections.length === 0 && (\n <div className=\"py-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No endpoints match\"\n description=\"Try a different search term to find the API you need.\"\n />\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,28 +1,36 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { Clock as t, FileText as n, Star as r, UserCheck as i, Users as a } from "lucide-react";
|
|
3
3
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/HiringApplicationsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { candidates:
|
|
6
|
+
function _() {
|
|
7
|
+
let { candidates: _, jobPostings: v } = e(), y = _.filter((e) => e.status === "new"), b = _.filter((e) => e.status === "screening"), x = _.filter((e) => e.status === "interview"), S = v.reduce((e, t) => e + t.applicants, 0);
|
|
8
8
|
return /* @__PURE__ */ s("div", {
|
|
9
9
|
className: "space-y-6 p-6",
|
|
10
10
|
children: [
|
|
11
11
|
/* @__PURE__ */ o("div", {
|
|
12
12
|
className: "flex items-center justify-between",
|
|
13
|
-
children: /* @__PURE__ */ s("div", { children: [
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
children: /* @__PURE__ */ s("div", { children: [
|
|
14
|
+
/* @__PURE__ */ o("h1", {
|
|
15
|
+
className: "text-2xl font-semibold",
|
|
16
|
+
children: /* @__PURE__ */ o(h, { children: "Applications" })
|
|
17
|
+
}),
|
|
18
|
+
/* @__PURE__ */ s("p", {
|
|
19
|
+
className: "text-sm text-text-secondary",
|
|
20
|
+
children: [S, " total applications across all positions"]
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ o(g, {
|
|
23
|
+
className: "mt-1",
|
|
24
|
+
children: "Review and triage incoming job applications — move candidates through your pipeline and decide who to interview next."
|
|
25
|
+
})
|
|
26
|
+
] })
|
|
20
27
|
}),
|
|
21
28
|
/* @__PURE__ */ s("div", {
|
|
22
29
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
23
30
|
children: [
|
|
24
31
|
/* @__PURE__ */ s(m, {
|
|
25
|
-
treatment: "
|
|
32
|
+
treatment: "glass",
|
|
33
|
+
glow: !0,
|
|
26
34
|
className: "border-border-seam",
|
|
27
35
|
children: [/* @__PURE__ */ s(f, {
|
|
28
36
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
@@ -32,7 +40,7 @@ function g() {
|
|
|
32
40
|
}), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-info-text" })]
|
|
33
41
|
}), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
|
|
34
42
|
className: "text-2xl font-bold tabular-nums",
|
|
35
|
-
children:
|
|
43
|
+
children: y.length
|
|
36
44
|
}), /* @__PURE__ */ o("p", {
|
|
37
45
|
className: "text-xs text-text-secondary",
|
|
38
46
|
children: "Unreviewed applications"
|
|
@@ -49,7 +57,7 @@ function g() {
|
|
|
49
57
|
}), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-status-warning-text" })]
|
|
50
58
|
}), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
|
|
51
59
|
className: "text-2xl font-bold tabular-nums",
|
|
52
|
-
children:
|
|
60
|
+
children: b.length
|
|
53
61
|
}), /* @__PURE__ */ o("p", {
|
|
54
62
|
className: "text-xs text-text-secondary",
|
|
55
63
|
children: "Under review"
|
|
@@ -66,7 +74,7 @@ function g() {
|
|
|
66
74
|
}), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-action-primary-bg" })]
|
|
67
75
|
}), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
|
|
68
76
|
className: "text-2xl font-bold tabular-nums",
|
|
69
|
-
children:
|
|
77
|
+
children: x.length
|
|
70
78
|
}), /* @__PURE__ */ o("p", {
|
|
71
79
|
className: "text-xs text-text-secondary",
|
|
72
80
|
children: "Moving forward"
|
|
@@ -93,8 +101,8 @@ function g() {
|
|
|
93
101
|
}),
|
|
94
102
|
/* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, { children: "Applications by Position" }), /* @__PURE__ */ o(d, { children: "Applicant count per open role" })] }), /* @__PURE__ */ o(u, {
|
|
95
103
|
className: "space-y-3",
|
|
96
|
-
children:
|
|
97
|
-
let t = Math.max(...
|
|
104
|
+
children: v.sort((e, t) => t.applicants - e.applicants).map((e) => {
|
|
105
|
+
let t = Math.max(...v.map((e) => e.applicants));
|
|
98
106
|
return /* @__PURE__ */ s("div", {
|
|
99
107
|
className: "flex items-center gap-3",
|
|
100
108
|
children: [
|
|
@@ -142,7 +150,7 @@ function g() {
|
|
|
142
150
|
children: "Status"
|
|
143
151
|
})
|
|
144
152
|
]
|
|
145
|
-
}),
|
|
153
|
+
}), _.map((e) => /* @__PURE__ */ s("div", {
|
|
146
154
|
className: "grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm",
|
|
147
155
|
children: [
|
|
148
156
|
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("p", {
|
|
@@ -194,6 +202,6 @@ function g() {
|
|
|
194
202
|
});
|
|
195
203
|
}
|
|
196
204
|
//#endregion
|
|
197
|
-
export {
|
|
205
|
+
export { _ as HiringApplicationsPagePage };
|
|
198
206
|
|
|
199
207
|
//# sourceMappingURL=HiringApplicationsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringApplicationsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringApplicationsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Clock, FileText, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringApplicationsPagePage() {\n const { candidates, jobPostings } = useCrewFoundryStore();\n\n const newApps = candidates.filter((c) => c.status === 'new');\n const screeningApps = candidates.filter((c) => c.status === 'screening');\n const interviewApps = candidates.filter((c) => c.status === 'interview');\n const totalApps = jobPostings.reduce((s, j) => s + j.applicants, 0);\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>Applications</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {totalApps} total applications across all positions\n </p>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">New</CardTitle>\n <FileText className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{newApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Unreviewed applications</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Screening</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{screeningApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Under review</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Interview Stage</CardTitle>\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{interviewApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Moving forward</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Conversion Rate</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">4.8%</div>\n <p className=\"text-xs text-text-secondary\">Application to hire</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Applications by Position</CardTitle>\n <CardDescription>Applicant count per open role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {jobPostings\n .sort((a, b) => b.applicants - a.applicants)\n .map((job) => {\n const maxApplicants = Math.max(...jobPostings.map((j) => j.applicants));\n return (\n <div key={job.id} className=\"flex items-center gap-3\">\n <span className=\"w-56 text-sm font-medium truncate\">{job.title}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((job.applicants / maxApplicants) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{job.applicants}</span>\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>All Candidates</CardTitle>\n <CardDescription>Complete candidate pipeline</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Candidate</span>\n <span>Position</span>\n <span>Company</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Skills</span>\n <span className=\"text-center\">Status</span>\n </div>\n {candidates.map((c) => (\n <div key={c.id} className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\">\n <div>\n <p className=\"font-medium\">\n {c.firstName} {c.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{c.email}</p>\n </div>\n <span className=\"text-text-secondary truncate\">{c.position}</span>\n <span className=\"text-text-secondary\">{c.currentCompany}</span>\n <span className=\"text-right\">{c.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {c.rating}\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {c.skills.slice(0, 2).map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n c.status === 'hired'\n ? 'default'\n : c.status === 'offer'\n ? 'default'\n : c.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {c.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HiringApplicationsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringApplicationsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Clock, FileText, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringApplicationsPagePage() {\n const { candidates, jobPostings } = useCrewFoundryStore();\n\n const newApps = candidates.filter((c) => c.status === 'new');\n const screeningApps = candidates.filter((c) => c.status === 'screening');\n const interviewApps = candidates.filter((c) => c.status === 'interview');\n const totalApps = jobPostings.reduce((s, j) => s + j.applicants, 0);\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>Applications</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {totalApps} total applications across all positions\n </p>\n <PagePurpose className=\"mt-1\">Review and triage incoming job applications — move candidates through your pipeline and decide who to interview next.</PagePurpose>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">New</CardTitle>\n <FileText className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{newApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Unreviewed applications</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Screening</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{screeningApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Under review</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Interview Stage</CardTitle>\n <Users className=\"h-4 w-4 text-action-primary-bg\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{interviewApps.length}</div>\n <p className=\"text-xs text-text-secondary\">Moving forward</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Conversion Rate</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">4.8%</div>\n <p className=\"text-xs text-text-secondary\">Application to hire</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Applications by Position</CardTitle>\n <CardDescription>Applicant count per open role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {jobPostings\n .sort((a, b) => b.applicants - a.applicants)\n .map((job) => {\n const maxApplicants = Math.max(...jobPostings.map((j) => j.applicants));\n return (\n <div key={job.id} className=\"flex items-center gap-3\">\n <span className=\"w-56 text-sm font-medium truncate\">{job.title}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((job.applicants / maxApplicants) * 100)}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{job.applicants}</span>\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>All Candidates</CardTitle>\n <CardDescription>Complete candidate pipeline</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Candidate</span>\n <span>Position</span>\n <span>Company</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Skills</span>\n <span className=\"text-center\">Status</span>\n </div>\n {candidates.map((c) => (\n <div key={c.id} className=\"grid grid-cols-7 gap-2 py-2 border-b last:border-0 text-sm\">\n <div>\n <p className=\"font-medium\">\n {c.firstName} {c.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{c.email}</p>\n </div>\n <span className=\"text-text-secondary truncate\">{c.position}</span>\n <span className=\"text-text-secondary\">{c.currentCompany}</span>\n <span className=\"text-right\">{c.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {c.rating}\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {c.skills.slice(0, 2).map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n c.status === 'hired'\n ? 'default'\n : c.status === 'offer'\n ? 'default'\n : c.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {c.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,124 +1,143 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { useState as t } from "react";
|
|
3
3
|
import { Search as n, Star as r } from "lucide-react";
|
|
4
|
-
import {
|
|
5
|
-
import { Badge as
|
|
4
|
+
import { Fragment as i, jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as s, Button as c, CardContent as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, Input as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/HiringCandidatesPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { candidates:
|
|
9
|
-
let t = `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(
|
|
7
|
+
function h() {
|
|
8
|
+
let { candidates: h } = e(), [g, _] = t(""), [v, y] = t("all"), b = [...new Set(h.map((e) => e.status))], x = h.filter((e) => {
|
|
9
|
+
let t = `${e.firstName} ${e.lastName} ${e.position} ${e.email}`.toLowerCase().includes(g.toLowerCase()), n = v === "all" || e.status === v;
|
|
10
10
|
return t && n;
|
|
11
11
|
});
|
|
12
|
-
return /* @__PURE__ */
|
|
12
|
+
return /* @__PURE__ */ o("div", {
|
|
13
13
|
className: "space-y-6 p-6",
|
|
14
14
|
children: [
|
|
15
|
-
/* @__PURE__ */
|
|
15
|
+
/* @__PURE__ */ a("div", {
|
|
16
16
|
className: "flex items-center justify-between",
|
|
17
|
-
children: /* @__PURE__ */
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
children: /* @__PURE__ */ o("div", { children: [
|
|
18
|
+
/* @__PURE__ */ a("h1", {
|
|
19
|
+
className: "text-2xl font-semibold",
|
|
20
|
+
children: /* @__PURE__ */ a(d, { children: "Candidates" })
|
|
21
|
+
}),
|
|
22
|
+
/* @__PURE__ */ o("p", {
|
|
23
|
+
className: "text-sm text-text-secondary",
|
|
24
|
+
children: [h.length, " candidates in pipeline"]
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ a(m, {
|
|
27
|
+
className: "mt-1",
|
|
28
|
+
children: "Your candidate pool — search, filter, and evaluate the people you're considering so you can fill open roles with the right talent."
|
|
29
|
+
})
|
|
30
|
+
] })
|
|
24
31
|
}),
|
|
25
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ o("div", {
|
|
26
33
|
className: "flex gap-3 flex-wrap",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
34
|
+
children: [/* @__PURE__ */ o("div", {
|
|
28
35
|
className: "relative flex-1 max-w-sm",
|
|
29
|
-
children: [/* @__PURE__ */
|
|
36
|
+
children: [/* @__PURE__ */ a(n, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ a(p, {
|
|
30
37
|
placeholder: "Search candidates...",
|
|
31
38
|
className: "pl-9",
|
|
32
|
-
value:
|
|
33
|
-
onChange: (e) =>
|
|
39
|
+
value: g,
|
|
40
|
+
onChange: (e) => _(e.target.value)
|
|
34
41
|
})]
|
|
35
|
-
}), /* @__PURE__ */
|
|
42
|
+
}), /* @__PURE__ */ o("div", {
|
|
36
43
|
className: "flex gap-1",
|
|
37
|
-
children: [/* @__PURE__ */
|
|
38
|
-
variant:
|
|
44
|
+
children: [/* @__PURE__ */ a(c, {
|
|
45
|
+
variant: v === "all" ? "default" : "outline",
|
|
39
46
|
size: "sm",
|
|
40
|
-
onClick: () =>
|
|
47
|
+
onClick: () => y("all"),
|
|
41
48
|
children: "All"
|
|
42
|
-
}),
|
|
43
|
-
variant:
|
|
49
|
+
}), b.map((e) => /* @__PURE__ */ a(c, {
|
|
50
|
+
variant: v === e ? "default" : "outline",
|
|
44
51
|
size: "sm",
|
|
45
|
-
onClick: () =>
|
|
52
|
+
onClick: () => y(e),
|
|
46
53
|
children: e
|
|
47
54
|
}, e))]
|
|
48
55
|
})]
|
|
49
56
|
}),
|
|
50
|
-
/* @__PURE__ */
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
/* @__PURE__ */
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
/* @__PURE__ */ i("span", {
|
|
63
|
-
className: "text-center",
|
|
64
|
-
children: "Rating"
|
|
65
|
-
}),
|
|
66
|
-
/* @__PURE__ */ i("span", { children: "Applied" }),
|
|
67
|
-
/* @__PURE__ */ i("span", {
|
|
68
|
-
className: "text-center",
|
|
69
|
-
children: "Status"
|
|
57
|
+
/* @__PURE__ */ a(u, {
|
|
58
|
+
treatment: "glass",
|
|
59
|
+
glow: !0,
|
|
60
|
+
className: "border-border-seam",
|
|
61
|
+
children: /* @__PURE__ */ a(l, {
|
|
62
|
+
className: "p-0",
|
|
63
|
+
children: x.length === 0 ? /* @__PURE__ */ a("div", {
|
|
64
|
+
className: "p-6",
|
|
65
|
+
children: /* @__PURE__ */ a(f, {
|
|
66
|
+
illustration: "empty-search",
|
|
67
|
+
title: "No candidates match",
|
|
68
|
+
description: "Try a different search term or status filter."
|
|
70
69
|
})
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}),
|
|
90
|
-
/* @__PURE__ */ i(o, {
|
|
91
|
-
variant: "outline",
|
|
92
|
-
className: "w-fit h-fit text-[10px]",
|
|
93
|
-
children: e.source
|
|
94
|
-
}),
|
|
95
|
-
/* @__PURE__ */ a("span", {
|
|
96
|
-
className: "text-right",
|
|
97
|
-
children: [e.experience, " yrs"]
|
|
98
|
-
}),
|
|
99
|
-
/* @__PURE__ */ a("div", {
|
|
100
|
-
className: "flex items-center justify-center gap-1",
|
|
101
|
-
children: [/* @__PURE__ */ i(r, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ i("span", { children: e.rating })]
|
|
102
|
-
}),
|
|
103
|
-
/* @__PURE__ */ i("span", {
|
|
104
|
-
className: "text-text-secondary text-xs",
|
|
105
|
-
children: e.appliedDate
|
|
106
|
-
}),
|
|
107
|
-
/* @__PURE__ */ i("div", {
|
|
108
|
-
className: "text-center",
|
|
109
|
-
children: /* @__PURE__ */ i(o, {
|
|
110
|
-
variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
|
|
111
|
-
className: "text-[10px]",
|
|
112
|
-
children: e.status
|
|
70
|
+
}) : /* @__PURE__ */ o(i, { children: [/* @__PURE__ */ o("div", {
|
|
71
|
+
className: "grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b",
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ a("span", { children: "Name" }),
|
|
74
|
+
/* @__PURE__ */ a("span", { children: "Position" }),
|
|
75
|
+
/* @__PURE__ */ a("span", { children: "Source" }),
|
|
76
|
+
/* @__PURE__ */ a("span", {
|
|
77
|
+
className: "text-right",
|
|
78
|
+
children: "Experience"
|
|
79
|
+
}),
|
|
80
|
+
/* @__PURE__ */ a("span", {
|
|
81
|
+
className: "text-center",
|
|
82
|
+
children: "Rating"
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ a("span", { children: "Applied" }),
|
|
85
|
+
/* @__PURE__ */ a("span", {
|
|
86
|
+
className: "text-center",
|
|
87
|
+
children: "Status"
|
|
113
88
|
})
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
89
|
+
]
|
|
90
|
+
}), x.map((e) => /* @__PURE__ */ o("div", {
|
|
91
|
+
className: "grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("p", {
|
|
94
|
+
className: "font-medium",
|
|
95
|
+
children: [
|
|
96
|
+
e.firstName,
|
|
97
|
+
" ",
|
|
98
|
+
e.lastName
|
|
99
|
+
]
|
|
100
|
+
}), /* @__PURE__ */ a("p", {
|
|
101
|
+
className: "text-xs text-text-secondary",
|
|
102
|
+
children: e.email
|
|
103
|
+
})] }),
|
|
104
|
+
/* @__PURE__ */ a("span", {
|
|
105
|
+
className: "text-text-secondary",
|
|
106
|
+
children: e.position
|
|
107
|
+
}),
|
|
108
|
+
/* @__PURE__ */ a(s, {
|
|
109
|
+
variant: "outline",
|
|
110
|
+
className: "w-fit h-fit text-[10px]",
|
|
111
|
+
children: e.source
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ o("span", {
|
|
114
|
+
className: "text-right",
|
|
115
|
+
children: [e.experience, " yrs"]
|
|
116
|
+
}),
|
|
117
|
+
/* @__PURE__ */ o("div", {
|
|
118
|
+
className: "flex items-center justify-center gap-1",
|
|
119
|
+
children: [/* @__PURE__ */ a(r, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ a("span", { children: e.rating })]
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ a("span", {
|
|
122
|
+
className: "text-text-secondary text-xs",
|
|
123
|
+
children: e.appliedDate
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ a("div", {
|
|
126
|
+
className: "text-center",
|
|
127
|
+
children: /* @__PURE__ */ a(s, {
|
|
128
|
+
variant: e.status === "hired" || e.status === "offer" ? "default" : e.status === "rejected" ? "destructive" : "secondary",
|
|
129
|
+
className: "text-[10px]",
|
|
130
|
+
children: e.status
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
]
|
|
134
|
+
}, e.id))] })
|
|
135
|
+
})
|
|
136
|
+
})
|
|
118
137
|
]
|
|
119
138
|
});
|
|
120
139
|
}
|
|
121
140
|
//#endregion
|
|
122
|
-
export {
|
|
141
|
+
export { h as HiringCandidatesPagePage };
|
|
123
142
|
|
|
124
143
|
//# sourceMappingURL=HiringCandidatesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n
|
|
1
|
+
{"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Search, Star } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringCandidatesPagePage() {\n const { candidates } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [filterStatus, setFilterStatus] = useState<string>('all');\n\n const statuses = [...new Set(candidates.map((c) => c.status))];\n const filtered = candidates.filter((c) => {\n const matchSearch = `${c.firstName} ${c.lastName} ${c.position} ${c.email}`\n .toLowerCase()\n .includes(search.toLowerCase());\n const matchStatus = filterStatus === 'all' || c.status === filterStatus;\n return matchSearch && matchStatus;\n });\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>Candidates</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{candidates.length} candidates in pipeline</p>\n <PagePurpose className=\"mt-1\">Your candidate pool — search, filter, and evaluate the people you're considering so you can fill open roles with the right talent.</PagePurpose>\n </div>\n </div>\n\n <div className=\"flex gap-3 flex-wrap\">\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search candidates...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\">\n <Button\n variant={filterStatus === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus('all')}\n >\n All\n </Button>\n {statuses.map((status) => (\n <Button\n key={status}\n variant={filterStatus === status ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterStatus(status)}\n >\n {status}\n </Button>\n ))}\n </div>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-0\">\n {filtered.length === 0 ? (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates match\"\n description=\"Try a different search term or status filter.\"\n />\n </div>\n ) : (\n <>\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary p-4 border-b\">\n <span>Name</span>\n <span>Position</span>\n <span>Source</span>\n <span className=\"text-right\">Experience</span>\n <span className=\"text-center\">Rating</span>\n <span>Applied</span>\n <span className=\"text-center\">Status</span>\n </div>\n {filtered.map((candidate) => (\n <div\n key={candidate.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <div>\n <p className=\"font-medium\">\n {candidate.firstName} {candidate.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{candidate.email}</p>\n </div>\n <span className=\"text-text-secondary\">{candidate.position}</span>\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {candidate.source}\n </Badge>\n <span className=\"text-right\">{candidate.experience} yrs</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span>{candidate.rating}</span>\n </div>\n <span className=\"text-text-secondary text-xs\">{candidate.appliedDate}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n candidate.status === 'hired'\n ? 'default'\n : candidate.status === 'offer'\n ? 'default'\n : candidate.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {candidate.status}\n </Badge>\n </div>\n </div>\n ))}\n </>\n )}\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,IAA2B;CACzC,IAAM,EAAE,kBAAe,GAAqB,EACtC,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAc,KAAmB,EAAiB,MAAM,EAEzD,IAAW,CAAC,GAAG,IAAI,IAAI,EAAW,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC,EACxD,IAAW,EAAW,QAAQ,MAAM;EACxC,IAAM,IAAc,GAAG,EAAE,UAAU,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,GAAG,EAAE,QACjE,aAAa,CACb,SAAS,EAAO,aAAa,CAAC,EAC3B,IAAc,MAAiB,SAAS,EAAE,WAAW;AAC3D,SAAO,KAAe;GACtB;AAEF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,cAAyB,CAAA;MACpC,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAAb,CAA4C,EAAW,QAAO,0BAA2B;;KACzF,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAAqJ,CAAA;KAC/K,EAAA,CAAA;IACF,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;MACE,aAAY;MACZ,WAAU;MACV,OAAO;MACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;MAC1C,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAS,MAAiB,QAAQ,YAAY;MAC9C,MAAK;MACL,eAAe,EAAgB,MAAM;gBACtC;MAEQ,CAAA,EACR,EAAS,KAAK,MACb,kBAAC,GAAD;MAEE,SAAS,MAAiB,IAAS,YAAY;MAC/C,MAAK;MACL,eAAe,EAAgB,EAAO;gBAErC;MACM,EANF,EAME,CACT,CACE;OACF;;GAEN,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAC1C,kBAAC,GAAD;KAAa,WAAU;eACpB,EAAS,WAAW,IACnB,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA;MACE,CAAA,GAEN,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAM,QAAW,CAAA;OACjB,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;OACrB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;OACnB,kBAAC,QAAD;QAAM,WAAU;kBAAa;QAAiB,CAAA;OAC9C,kBAAC,QAAD;QAAM,WAAU;kBAAc;QAAa,CAAA;OAC3C,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;OACpB,kBAAC,QAAD;QAAM,WAAU;kBAAc;QAAa,CAAA;OACvC;SACL,EAAS,KAAK,MACjB,kBAAC,OAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAU;SAAU;SAAE,EAAU;SAC/B;WACJ,kBAAC,KAAD;QAAG,WAAU;kBAA+B,EAAU;QAAU,CAAA,CAC5D,EAAA,CAAA;OACN,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAU;QAAgB,CAAA;OACjE,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAU;QACL,CAAA;OACR,kBAAC,QAAD;QAAM,WAAU;kBAAhB,CAA8B,EAAU,YAAW,OAAW;;OAC9D,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,EACrD,kBAAC,QAAD,EAAA,UAAO,EAAU,QAAc,CAAA,CAC3B;;OACN,kBAAC,QAAD;QAAM,WAAU;kBAA+B,EAAU;QAAmB,CAAA;OAC5E,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD;SACE,SACE,EAAU,WAAW,WAEjB,EAAU,WAAW,UADrB,YAGE,EAAU,WAAW,aACnB,gBACA;SAEV,WAAU;mBAET,EAAU;SACL,CAAA;QACJ,CAAA;OACF;QAnCC,EAAU,GAmCX,CACF,CACD,EAAA,CAAA;KAEO,CAAA;IACJ,CAAA;GACR"}
|