@burdenoff/microfe-crewfoundry 2026.1029.2 → 2026.1030.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/lib/useFocusedRecordParam.d.ts +51 -0
- package/dist/crewfoundry/lib/useFocusedRecordParam.d.ts.map +1 -0
- package/dist/crewfoundry/lib/useFocusedRecordParam.js +38 -0
- package/dist/crewfoundry/lib/useFocusedRecordParam.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +119 -112
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +78 -71
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +88 -81
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +133 -126
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +150 -143
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +110 -103
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +173 -162
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +169 -158
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.d.ts.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +179 -163
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/utils/pageContext.d.ts +43 -4
- package/dist/utils/pageContext.d.ts.map +1 -1
- package/dist/utils/pageContext.js +10 -3
- package/dist/utils/pageContext.js.map +1 -1
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Pagination,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { ArrowRightLeft, LayoutGrid, Pencil, Plus, Search, Table2, Trash2 } from 'lucide-react';\nimport { useCrewFoundryStore, type Candidate } from '../store/crewfoundryStore';\nimport { FormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { ConfirmDialog } from '../components/forms/ConfirmDialog';\nimport { getNumber, getTags, getText, newClientId } from '../components/forms/formValues';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { KanbanBoard, RatingStars, getInitials, type KanbanColumnData } from '../components/viz';\n\nconst CANDIDATE_STATUS_OPTIONS: FieldConfig['options'] = [\n { label: 'New', value: 'new' },\n { label: 'Screening', value: 'screening' },\n { label: 'Interview', value: 'interview' },\n { label: 'Assessment', value: 'assessment' },\n { label: 'Offer', value: 'offer' },\n { label: 'Hired', value: 'hired' },\n { label: 'Rejected', value: 'rejected' },\n];\n\n// Ordered pipeline stages (mock: New → Screening → Interview → Assessment → Offer → Hired),\n// with Rejected kept as a terminal column so rejected candidates stay visible.\nconst PIPELINE_STAGES: { key: Candidate['status']; label: string; accent: string }[] = [\n { key: 'new', label: 'New', accent: 'var(--color-status-info-text)' },\n { key: 'screening', label: 'Screening', accent: 'var(--color-accent-blue)' },\n { key: 'interview', label: 'Interview', accent: 'var(--color-accent-purple)' },\n { key: 'assessment', label: 'Assessment', accent: 'var(--color-status-warning-text)' },\n { key: 'offer', label: 'Offer', accent: 'var(--color-accent-teal)' },\n { key: 'hired', label: 'Hired', accent: 'var(--color-status-success-text)' },\n { key: 'rejected', label: 'Rejected', accent: 'var(--color-status-error-text)' },\n];\n\nconst CANDIDATE_FIELDS: FieldConfig[] = [\n { name: 'firstName', label: 'First Name', type: 'text', required: true },\n { name: 'lastName', label: 'Last Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'phone', label: 'Phone', type: 'text', required: true },\n { name: 'position', label: 'Position', type: 'text', required: true },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n required: true,\n options: CANDIDATE_STATUS_OPTIONS,\n },\n { name: 'source', label: 'Source', type: 'text', required: true, placeholder: 'e.g. LinkedIn' },\n { name: 'experience', label: 'Experience (years)', type: 'number', required: true },\n { name: 'currentCompany', label: 'Current Company', type: 'text' },\n { name: 'rating', label: 'Rating (out of 5)', type: 'number' },\n { name: 'appliedDate', label: 'Applied Date', type: 'date' },\n { name: 'resumeUrl', label: 'Resume URL', type: 'text' },\n { name: 'skills', label: 'Skills', type: 'tags', colSpan: 2 },\n { name: 'notes', label: 'Notes', type: 'textarea', colSpan: 2 },\n];\n\nconst candidateToValues = (candidate: Candidate): FormValues => ({\n firstName: candidate.firstName,\n lastName: candidate.lastName,\n email: candidate.email,\n phone: candidate.phone,\n position: candidate.position,\n status: candidate.status,\n source: candidate.source,\n experience: candidate.experience,\n currentCompany: candidate.currentCompany,\n rating: candidate.rating,\n appliedDate: candidate.appliedDate,\n resumeUrl: candidate.resumeUrl ?? '',\n skills: candidate.skills,\n notes: candidate.notes,\n});\n\nconst valuesToCandidateFields = (values: FormValues): Omit<Candidate, 'id'> => {\n const appliedDate = getText(values, 'appliedDate');\n return {\n firstName: getText(values, 'firstName'),\n lastName: getText(values, 'lastName'),\n email: getText(values, 'email'),\n phone: getText(values, 'phone'),\n position: getText(values, 'position'),\n status: values.status as Candidate['status'],\n source: getText(values, 'source'),\n experience: getNumber(values, 'experience'),\n currentCompany: getText(values, 'currentCompany'),\n rating: getNumber(values, 'rating'),\n appliedDate: appliedDate.trim() !== '' ? appliedDate : new Date().toISOString().slice(0, 10),\n resumeUrl: getText(values, 'resumeUrl'),\n skills: getTags(values, 'skills'),\n notes: getText(values, 'notes'),\n };\n};\n\n/** Initials avatar (CrewCandidate has no photo field — initials fallback). */\nfunction InitialsAvatar({ name, size = 36 }: { name: string; size?: number }) {\n return (\n <span\n className=\"inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border-subtle bg-bg-sunken font-medium text-text-secondary\"\n style={{ width: size, height: size, fontSize: Math.round(size * 0.36) }}\n aria-hidden=\"true\"\n >\n {getInitials(name)}\n </span>\n );\n}\n\nconst CANDIDATE_COLUMNS: ResponsiveTableColumn<Candidate>[] = [\n {\n key: 'name',\n header: 'Name',\n priority: 'primary',\n cell: (candidate) => (\n <div className=\"flex items-center gap-2\">\n <InitialsAvatar name={`${candidate.firstName} ${candidate.lastName}`} size={30} />\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 </div>\n ),\n },\n {\n key: 'position',\n header: 'Position',\n priority: 'secondary',\n cell: (candidate) => <span className=\"text-text-secondary\">{candidate.position}</span>,\n },\n {\n key: 'source',\n header: 'Source',\n priority: 'secondary',\n cell: (candidate) => (\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {candidate.source}\n </Badge>\n ),\n },\n {\n key: 'experience',\n header: 'Experience',\n priority: 'secondary',\n cell: (candidate) => <span>{candidate.experience} yrs</span>,\n },\n {\n key: 'rating',\n header: 'Rating',\n priority: 'secondary',\n cell: (candidate) => <RatingStars value={candidate.rating} size={13} />,\n },\n {\n key: 'applied',\n header: 'Applied',\n priority: 'hidden-on-mobile',\n cell: (candidate) => (\n <span className=\"text-text-secondary text-xs\">{candidate.appliedDate}</span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'secondary',\n cell: (candidate) => (\n <Badge\n variant={\n candidate.status === 'hired' || candidate.status === 'offer'\n ? 'default'\n : candidate.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(candidate.status)}\n </Badge>\n ),\n },\n];\n\nexport function HiringCandidatesPagePage() {\n const { showToast } = useGlobalUi();\n const { candidates, addCandidate, updateCandidate, removeCandidate } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [view, setView] = useState<'board' | 'table'>('board');\n const [filterStatus, setFilterStatus] = useState<string>('all');\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 25 });\n const [createOpen, setCreateOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<Candidate | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<Candidate | null>(null);\n\n const handleCreate = async (values: FormValues) => {\n await addCandidate({ id: newClientId(), ...valuesToCandidateFields(values) });\n showToast('Candidate added', 'success');\n };\n\n const handleEdit = async (values: FormValues) => {\n if (!editTarget) {\n return;\n }\n await updateCandidate(editTarget.id, valuesToCandidateFields(values));\n showToast('Candidate updated', 'success');\n };\n\n const handleDelete = async () => {\n if (!deleteTarget) {\n return;\n }\n await removeCandidate(deleteTarget.id);\n showToast('Candidate removed', 'success');\n };\n\n const handleMove = async (candidate: Candidate, status: Candidate['status']) => {\n if (candidate.status === status) {\n return;\n }\n try {\n await updateCandidate(candidate.id, { status });\n showToast(\n `${candidate.firstName} ${candidate.lastName} moved to ${formatEnumLabel(status)}`,\n 'success'\n );\n } catch {\n showToast('Could not move candidate', 'error');\n }\n };\n\n const searchLower = search.toLowerCase();\n const searched = useMemo(\n () =>\n candidates.filter((c) =>\n `${c.firstName} ${c.lastName} ${c.position} ${c.email}`.toLowerCase().includes(searchLower)\n ),\n [candidates, searchLower]\n );\n\n const tableFiltered = searched.filter((c) => filterStatus === 'all' || c.status === filterStatus);\n const paged = tableFiltered.slice(offset, offset + pageSize);\n\n const columns: KanbanColumnData[] = PIPELINE_STAGES.map((stage) => {\n const stageCandidates = searched\n .filter((c) => c.status === stage.key)\n .sort((a, b) => b.rating - a.rating);\n return {\n id: stage.key,\n title: stage.label,\n accent: stage.accent,\n items: stageCandidates.map((candidate) => (\n <CandidateCard\n key={candidate.id}\n candidate={candidate}\n onMove={handleMove}\n onEdit={() => setEditTarget(candidate)}\n onDelete={() => setDeleteTarget(candidate)}\n />\n )),\n };\n });\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Candidate Pipeline</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{candidates.length} candidates in pipeline</p>\n <PagePurpose className=\"mt-1\">\n Track every candidate as they move through your hiring stages — drag work through New,\n Screening, Interview, Assessment, Offer, and Hired to keep the pipeline flowing.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Candidate\n </Button>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative flex-1 min-w-[12rem] 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) => {\n setSearch(e.target.value);\n setPage(1);\n }}\n />\n </div>\n <div className=\"inline-flex items-center gap-1 rounded-full border border-border-subtle bg-bg-sunken p-1\">\n <Button\n variant={view === 'board' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-full\"\n onClick={() => setView('board')}\n >\n <LayoutGrid className=\"h-4 w-4 mr-1\" />\n Board\n </Button>\n <Button\n variant={view === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-full\"\n onClick={() => setView('table')}\n >\n <Table2 className=\"h-4 w-4 mr-1\" />\n Table\n </Button>\n </div>\n </div>\n\n {candidates.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <CardContent className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates yet\"\n description=\"Add your first candidate to start building the pipeline.\"\n />\n </CardContent>\n </GlassCard>\n ) : view === 'board' ? (\n <KanbanBoard columns={columns} emptyColumnHint=\"No candidates in this stage\" />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex flex-wrap gap-1\">\n <Button\n variant={filterStatus === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => {\n setFilterStatus('all');\n setPage(1);\n }}\n >\n All\n </Button>\n {PIPELINE_STAGES.map((stage) => (\n <Button\n key={stage.key}\n variant={filterStatus === stage.key ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => {\n setFilterStatus(stage.key);\n setPage(1);\n }}\n >\n {stage.label}\n </Button>\n ))}\n </div>\n <ResponsiveTable\n data={paged}\n rowKey={(candidate) => candidate.id}\n columns={CANDIDATE_COLUMNS}\n emptyState={\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates match\"\n description=\"Try a different search term or status filter.\"\n />\n }\n rowActions={(candidate) => (\n <div className=\"flex items-center justify-end gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Edit ${candidate.firstName} ${candidate.lastName}`}\n onClick={() => setEditTarget(candidate)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Delete ${candidate.firstName} ${candidate.lastName}`}\n onClick={() => setDeleteTarget(candidate)}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-status-error-fg\" />\n </Button>\n </div>\n )}\n />\n {tableFiltered.length > pageSize && (\n <div className=\"mt-4\">\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={tableFiltered.length}\n onPageChange={setPage}\n />\n </div>\n )}\n </CardContent>\n </GlassCard>\n )}\n\n <FormModal\n open={createOpen}\n onOpenChange={setCreateOpen}\n title=\"Add Candidate\"\n description=\"Add someone to your hiring pipeline.\"\n fields={CANDIDATE_FIELDS}\n submitLabel=\"Add candidate\"\n onSubmit={handleCreate}\n />\n <FormModal\n open={editTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setEditTarget(null);\n }\n }}\n title=\"Edit Candidate\"\n description={editTarget ? `${editTarget.firstName} ${editTarget.lastName}` : undefined}\n fields={CANDIDATE_FIELDS}\n initialValues={editTarget ? candidateToValues(editTarget) : undefined}\n submitLabel=\"Save changes\"\n onSubmit={handleEdit}\n />\n <ConfirmDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n title=\"Remove candidate\"\n description={\n deleteTarget\n ? `Remove ${deleteTarget.firstName} ${deleteTarget.lastName} from the pipeline?`\n : undefined\n }\n confirmLabel=\"Remove\"\n destructive\n onConfirm={handleDelete}\n />\n </div>\n );\n}\n\ninterface CandidateCardProps {\n candidate: Candidate;\n onMove: (candidate: Candidate, status: Candidate['status']) => void;\n onEdit: () => void;\n onDelete: () => void;\n}\n\nfunction CandidateCard({ candidate, onMove, onEdit, onDelete }: CandidateCardProps) {\n const fullName = `${candidate.firstName} ${candidate.lastName}`;\n return (\n <div className=\"group rounded-[var(--radius-input)] border border-border-subtle bg-bg-surface p-3 shadow-elevation-1 transition-shadow hover:shadow-elevation-2\">\n <div className=\"flex items-start gap-2.5\">\n <InitialsAvatar name={fullName} size={36} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-text-primary\">{fullName}</p>\n <p className=\"truncate text-xs text-text-secondary\">{candidate.position}</p>\n </div>\n </div>\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <RatingStars value={candidate.rating} size={13} />\n <Badge variant=\"outline\" className=\"shrink-0 text-[9px]\">\n {candidate.source}\n </Badge>\n </div>\n {candidate.skills.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {candidate.skills.slice(0, 3).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[9px]\">\n {skill}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"mt-2.5 flex items-center justify-between gap-1 border-t border-border-subtle pt-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 px-2 text-xs\">\n <ArrowRightLeft className=\"mr-1 h-3.5 w-3.5\" />\n Move\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel>Move to stage</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {PIPELINE_STAGES.filter((stage) => stage.key !== candidate.status).map((stage) => (\n <DropdownMenuItem key={stage.key} onSelect={() => onMove(candidate, stage.key)}>\n <span\n aria-hidden=\"true\"\n className=\"mr-2 inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: stage.accent }}\n />\n {stage.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label={`Edit ${fullName}`}\n onClick={onEdit}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label={`Delete ${fullName}`}\n onClick={onDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-status-error-fg\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HiringCandidatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCandidatesPagePage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Pagination,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { ArrowRightLeft, LayoutGrid, Pencil, Plus, Search, Table2, Trash2 } from 'lucide-react';\nimport { useCrewFoundryStore, type Candidate } from '../store/crewfoundryStore';\nimport { FormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { ConfirmDialog } from '../components/forms/ConfirmDialog';\nimport { getNumber, getTags, getText, newClientId } from '../components/forms/formValues';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\nimport { useFocusedRecordParam } from '../lib/useFocusedRecordParam';\nimport { KanbanBoard, RatingStars, getInitials, type KanbanColumnData } from '../components/viz';\n\nconst CANDIDATE_STATUS_OPTIONS: FieldConfig['options'] = [\n { label: 'New', value: 'new' },\n { label: 'Screening', value: 'screening' },\n { label: 'Interview', value: 'interview' },\n { label: 'Assessment', value: 'assessment' },\n { label: 'Offer', value: 'offer' },\n { label: 'Hired', value: 'hired' },\n { label: 'Rejected', value: 'rejected' },\n];\n\n// Ordered pipeline stages (mock: New → Screening → Interview → Assessment → Offer → Hired),\n// with Rejected kept as a terminal column so rejected candidates stay visible.\nconst PIPELINE_STAGES: { key: Candidate['status']; label: string; accent: string }[] = [\n { key: 'new', label: 'New', accent: 'var(--color-status-info-text)' },\n { key: 'screening', label: 'Screening', accent: 'var(--color-accent-blue)' },\n { key: 'interview', label: 'Interview', accent: 'var(--color-accent-purple)' },\n { key: 'assessment', label: 'Assessment', accent: 'var(--color-status-warning-text)' },\n { key: 'offer', label: 'Offer', accent: 'var(--color-accent-teal)' },\n { key: 'hired', label: 'Hired', accent: 'var(--color-status-success-text)' },\n { key: 'rejected', label: 'Rejected', accent: 'var(--color-status-error-text)' },\n];\n\nconst CANDIDATE_FIELDS: FieldConfig[] = [\n { name: 'firstName', label: 'First Name', type: 'text', required: true },\n { name: 'lastName', label: 'Last Name', type: 'text', required: true },\n { name: 'email', label: 'Email', type: 'email', required: true },\n { name: 'phone', label: 'Phone', type: 'text', required: true },\n { name: 'position', label: 'Position', type: 'text', required: true },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n required: true,\n options: CANDIDATE_STATUS_OPTIONS,\n },\n { name: 'source', label: 'Source', type: 'text', required: true, placeholder: 'e.g. LinkedIn' },\n { name: 'experience', label: 'Experience (years)', type: 'number', required: true },\n { name: 'currentCompany', label: 'Current Company', type: 'text' },\n { name: 'rating', label: 'Rating (out of 5)', type: 'number' },\n { name: 'appliedDate', label: 'Applied Date', type: 'date' },\n { name: 'resumeUrl', label: 'Resume URL', type: 'text' },\n { name: 'skills', label: 'Skills', type: 'tags', colSpan: 2 },\n { name: 'notes', label: 'Notes', type: 'textarea', colSpan: 2 },\n];\n\nconst candidateToValues = (candidate: Candidate): FormValues => ({\n firstName: candidate.firstName,\n lastName: candidate.lastName,\n email: candidate.email,\n phone: candidate.phone,\n position: candidate.position,\n status: candidate.status,\n source: candidate.source,\n experience: candidate.experience,\n currentCompany: candidate.currentCompany,\n rating: candidate.rating,\n appliedDate: candidate.appliedDate,\n resumeUrl: candidate.resumeUrl ?? '',\n skills: candidate.skills,\n notes: candidate.notes,\n});\n\nconst valuesToCandidateFields = (values: FormValues): Omit<Candidate, 'id'> => {\n const appliedDate = getText(values, 'appliedDate');\n return {\n firstName: getText(values, 'firstName'),\n lastName: getText(values, 'lastName'),\n email: getText(values, 'email'),\n phone: getText(values, 'phone'),\n position: getText(values, 'position'),\n status: values.status as Candidate['status'],\n source: getText(values, 'source'),\n experience: getNumber(values, 'experience'),\n currentCompany: getText(values, 'currentCompany'),\n rating: getNumber(values, 'rating'),\n appliedDate: appliedDate.trim() !== '' ? appliedDate : new Date().toISOString().slice(0, 10),\n resumeUrl: getText(values, 'resumeUrl'),\n skills: getTags(values, 'skills'),\n notes: getText(values, 'notes'),\n };\n};\n\n/** Initials avatar (CrewCandidate has no photo field — initials fallback). */\nfunction InitialsAvatar({ name, size = 36 }: { name: string; size?: number }) {\n return (\n <span\n className=\"inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full border border-border-subtle bg-bg-sunken font-medium text-text-secondary\"\n style={{ width: size, height: size, fontSize: Math.round(size * 0.36) }}\n aria-hidden=\"true\"\n >\n {getInitials(name)}\n </span>\n );\n}\n\nconst CANDIDATE_COLUMNS: ResponsiveTableColumn<Candidate>[] = [\n {\n key: 'name',\n header: 'Name',\n priority: 'primary',\n cell: (candidate) => (\n <div className=\"flex items-center gap-2\">\n <InitialsAvatar name={`${candidate.firstName} ${candidate.lastName}`} size={30} />\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 </div>\n ),\n },\n {\n key: 'position',\n header: 'Position',\n priority: 'secondary',\n cell: (candidate) => <span className=\"text-text-secondary\">{candidate.position}</span>,\n },\n {\n key: 'source',\n header: 'Source',\n priority: 'secondary',\n cell: (candidate) => (\n <Badge variant=\"outline\" className=\"w-fit h-fit text-[10px]\">\n {candidate.source}\n </Badge>\n ),\n },\n {\n key: 'experience',\n header: 'Experience',\n priority: 'secondary',\n cell: (candidate) => <span>{candidate.experience} yrs</span>,\n },\n {\n key: 'rating',\n header: 'Rating',\n priority: 'secondary',\n cell: (candidate) => <RatingStars value={candidate.rating} size={13} />,\n },\n {\n key: 'applied',\n header: 'Applied',\n priority: 'hidden-on-mobile',\n cell: (candidate) => (\n <span className=\"text-text-secondary text-xs\">{candidate.appliedDate}</span>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'secondary',\n cell: (candidate) => (\n <Badge\n variant={\n candidate.status === 'hired' || candidate.status === 'offer'\n ? 'default'\n : candidate.status === 'rejected'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {formatEnumLabel(candidate.status)}\n </Badge>\n ),\n },\n];\n\nexport function HiringCandidatesPagePage() {\n const { showToast } = useGlobalUi();\n const { candidates, addCandidate, updateCandidate, removeCandidate } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [view, setView] = useState<'board' | 'table'>('board');\n const [filterStatus, setFilterStatus] = useState<string>('all');\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 25 });\n const [createOpen, setCreateOpen] = useState(false);\n const [editTarget, setEditTarget] = useState<Candidate | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<Candidate | null>(null);\n\n // The candidate open in the edit dialog is \"this candidate\" for the assistant.\n useFocusedRecordParam({\n records: candidates,\n activeId: editTarget?.id ?? null,\n onRestore: setEditTarget,\n });\n\n const handleCreate = async (values: FormValues) => {\n await addCandidate({ id: newClientId(), ...valuesToCandidateFields(values) });\n showToast('Candidate added', 'success');\n };\n\n const handleEdit = async (values: FormValues) => {\n if (!editTarget) {\n return;\n }\n await updateCandidate(editTarget.id, valuesToCandidateFields(values));\n showToast('Candidate updated', 'success');\n };\n\n const handleDelete = async () => {\n if (!deleteTarget) {\n return;\n }\n await removeCandidate(deleteTarget.id);\n showToast('Candidate removed', 'success');\n };\n\n const handleMove = async (candidate: Candidate, status: Candidate['status']) => {\n if (candidate.status === status) {\n return;\n }\n try {\n await updateCandidate(candidate.id, { status });\n showToast(\n `${candidate.firstName} ${candidate.lastName} moved to ${formatEnumLabel(status)}`,\n 'success'\n );\n } catch {\n showToast('Could not move candidate', 'error');\n }\n };\n\n const searchLower = search.toLowerCase();\n const searched = useMemo(\n () =>\n candidates.filter((c) =>\n `${c.firstName} ${c.lastName} ${c.position} ${c.email}`.toLowerCase().includes(searchLower)\n ),\n [candidates, searchLower]\n );\n\n const tableFiltered = searched.filter((c) => filterStatus === 'all' || c.status === filterStatus);\n const paged = tableFiltered.slice(offset, offset + pageSize);\n\n const columns: KanbanColumnData[] = PIPELINE_STAGES.map((stage) => {\n const stageCandidates = searched\n .filter((c) => c.status === stage.key)\n .sort((a, b) => b.rating - a.rating);\n return {\n id: stage.key,\n title: stage.label,\n accent: stage.accent,\n items: stageCandidates.map((candidate) => (\n <CandidateCard\n key={candidate.id}\n candidate={candidate}\n onMove={handleMove}\n onEdit={() => setEditTarget(candidate)}\n onDelete={() => setDeleteTarget(candidate)}\n />\n )),\n };\n });\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Candidate Pipeline</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{candidates.length} candidates in pipeline</p>\n <PagePurpose className=\"mt-1\">\n Track every candidate as they move through your hiring stages — drag work through New,\n Screening, Interview, Assessment, Offer, and Hired to keep the pipeline flowing.\n </PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => setCreateOpen(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Candidate\n </Button>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-3\">\n <div className=\"relative flex-1 min-w-[12rem] 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) => {\n setSearch(e.target.value);\n setPage(1);\n }}\n />\n </div>\n <div className=\"inline-flex items-center gap-1 rounded-full border border-border-subtle bg-bg-sunken p-1\">\n <Button\n variant={view === 'board' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-full\"\n onClick={() => setView('board')}\n >\n <LayoutGrid className=\"h-4 w-4 mr-1\" />\n Board\n </Button>\n <Button\n variant={view === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"rounded-full\"\n onClick={() => setView('table')}\n >\n <Table2 className=\"h-4 w-4 mr-1\" />\n Table\n </Button>\n </div>\n </div>\n\n {candidates.length === 0 ? (\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <CardContent className=\"p-4\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates yet\"\n description=\"Add your first candidate to start building the pipeline.\"\n />\n </CardContent>\n </GlassCard>\n ) : view === 'board' ? (\n <KanbanBoard columns={columns} emptyColumnHint=\"No candidates in this stage\" />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-4\">\n <div className=\"mb-3 flex flex-wrap gap-1\">\n <Button\n variant={filterStatus === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => {\n setFilterStatus('all');\n setPage(1);\n }}\n >\n All\n </Button>\n {PIPELINE_STAGES.map((stage) => (\n <Button\n key={stage.key}\n variant={filterStatus === stage.key ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => {\n setFilterStatus(stage.key);\n setPage(1);\n }}\n >\n {stage.label}\n </Button>\n ))}\n </div>\n <ResponsiveTable\n data={paged}\n rowKey={(candidate) => candidate.id}\n columns={CANDIDATE_COLUMNS}\n emptyState={\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No candidates match\"\n description=\"Try a different search term or status filter.\"\n />\n }\n rowActions={(candidate) => (\n <div className=\"flex items-center justify-end gap-1\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Edit ${candidate.firstName} ${candidate.lastName}`}\n onClick={() => setEditTarget(candidate)}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Delete ${candidate.firstName} ${candidate.lastName}`}\n onClick={() => setDeleteTarget(candidate)}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-status-error-fg\" />\n </Button>\n </div>\n )}\n />\n {tableFiltered.length > pageSize && (\n <div className=\"mt-4\">\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={tableFiltered.length}\n onPageChange={setPage}\n />\n </div>\n )}\n </CardContent>\n </GlassCard>\n )}\n\n <FormModal\n open={createOpen}\n onOpenChange={setCreateOpen}\n title=\"Add Candidate\"\n description=\"Add someone to your hiring pipeline.\"\n fields={CANDIDATE_FIELDS}\n submitLabel=\"Add candidate\"\n onSubmit={handleCreate}\n />\n <FormModal\n open={editTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setEditTarget(null);\n }\n }}\n title=\"Edit Candidate\"\n description={editTarget ? `${editTarget.firstName} ${editTarget.lastName}` : undefined}\n fields={CANDIDATE_FIELDS}\n initialValues={editTarget ? candidateToValues(editTarget) : undefined}\n submitLabel=\"Save changes\"\n onSubmit={handleEdit}\n />\n <ConfirmDialog\n open={deleteTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setDeleteTarget(null);\n }\n }}\n title=\"Remove candidate\"\n description={\n deleteTarget\n ? `Remove ${deleteTarget.firstName} ${deleteTarget.lastName} from the pipeline?`\n : undefined\n }\n confirmLabel=\"Remove\"\n destructive\n onConfirm={handleDelete}\n />\n </div>\n );\n}\n\ninterface CandidateCardProps {\n candidate: Candidate;\n onMove: (candidate: Candidate, status: Candidate['status']) => void;\n onEdit: () => void;\n onDelete: () => void;\n}\n\nfunction CandidateCard({ candidate, onMove, onEdit, onDelete }: CandidateCardProps) {\n const fullName = `${candidate.firstName} ${candidate.lastName}`;\n return (\n <div className=\"group rounded-[var(--radius-input)] border border-border-subtle bg-bg-surface p-3 shadow-elevation-1 transition-shadow hover:shadow-elevation-2\">\n <div className=\"flex items-start gap-2.5\">\n <InitialsAvatar name={fullName} size={36} />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-semibold text-text-primary\">{fullName}</p>\n <p className=\"truncate text-xs text-text-secondary\">{candidate.position}</p>\n </div>\n </div>\n <div className=\"mt-2 flex items-center justify-between gap-2\">\n <RatingStars value={candidate.rating} size={13} />\n <Badge variant=\"outline\" className=\"shrink-0 text-[9px]\">\n {candidate.source}\n </Badge>\n </div>\n {candidate.skills.length > 0 && (\n <div className=\"mt-2 flex flex-wrap gap-1\">\n {candidate.skills.slice(0, 3).map((skill) => (\n <Badge key={skill} variant=\"secondary\" className=\"text-[9px]\">\n {skill}\n </Badge>\n ))}\n </div>\n )}\n <div className=\"mt-2.5 flex items-center justify-between gap-1 border-t border-border-subtle pt-2\">\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\" className=\"h-7 px-2 text-xs\">\n <ArrowRightLeft className=\"mr-1 h-3.5 w-3.5\" />\n Move\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\">\n <DropdownMenuLabel>Move to stage</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {PIPELINE_STAGES.filter((stage) => stage.key !== candidate.status).map((stage) => (\n <DropdownMenuItem key={stage.key} onSelect={() => onMove(candidate, stage.key)}>\n <span\n aria-hidden=\"true\"\n className=\"mr-2 inline-block h-2 w-2 rounded-full\"\n style={{ backgroundColor: stage.accent }}\n />\n {stage.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n <div className=\"flex items-center gap-0.5\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label={`Edit ${fullName}`}\n onClick={onEdit}\n >\n <Pencil className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label={`Delete ${fullName}`}\n onClick={onDelete}\n >\n <Trash2 className=\"h-3.5 w-3.5 text-status-error-fg\" />\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA+BA,IAAM,IAAmD;CACvD;EAAE,OAAO;EAAO,OAAO;EAAO;CAC9B;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAc,OAAO;EAAc;CAC5C;EAAE,OAAO;EAAS,OAAO;EAAS;CAClC;EAAE,OAAO;EAAS,OAAO;EAAS;CAClC;EAAE,OAAO;EAAY,OAAO;EAAY;CACzC,EAIK,IAAiF;CACrF;EAAE,KAAK;EAAO,OAAO;EAAO,QAAQ;EAAiC;CACrE;EAAE,KAAK;EAAa,OAAO;EAAa,QAAQ;EAA4B;CAC5E;EAAE,KAAK;EAAa,OAAO;EAAa,QAAQ;EAA8B;CAC9E;EAAE,KAAK;EAAc,OAAO;EAAc,QAAQ;EAAoC;CACtF;EAAE,KAAK;EAAS,OAAO;EAAS,QAAQ;EAA4B;CACpE;EAAE,KAAK;EAAS,OAAO;EAAS,QAAQ;EAAoC;CAC5E;EAAE,KAAK;EAAY,OAAO;EAAY,QAAQ;EAAkC;CACjF,EAEK,IAAkC;CACtC;EAAE,MAAM;EAAa,OAAO;EAAc,MAAM;EAAQ,UAAU;EAAM;CACxE;EAAE,MAAM;EAAY,OAAO;EAAa,MAAM;EAAQ,UAAU;EAAM;CACtE;EAAE,MAAM;EAAS,OAAO;EAAS,MAAM;EAAS,UAAU;EAAM;CAChE;EAAE,MAAM;EAAS,OAAO;EAAS,MAAM;EAAQ,UAAU;EAAM;CAC/D;EAAE,MAAM;EAAY,OAAO;EAAY,MAAM;EAAQ,UAAU;EAAM;CACrE;EACE,MAAM;EACN,OAAO;EACP,MAAM;EACN,UAAU;EACV,SAAS;EACV;CACD;EAAE,MAAM;EAAU,OAAO;EAAU,MAAM;EAAQ,UAAU;EAAM,aAAa;EAAiB;CAC/F;EAAE,MAAM;EAAc,OAAO;EAAsB,MAAM;EAAU,UAAU;EAAM;CACnF;EAAE,MAAM;EAAkB,OAAO;EAAmB,MAAM;EAAQ;CAClE;EAAE,MAAM;EAAU,OAAO;EAAqB,MAAM;EAAU;CAC9D;EAAE,MAAM;EAAe,OAAO;EAAgB,MAAM;EAAQ;CAC5D;EAAE,MAAM;EAAa,OAAO;EAAc,MAAM;EAAQ;CACxD;EAAE,MAAM;EAAU,OAAO;EAAU,MAAM;EAAQ,SAAS;EAAG;CAC7D;EAAE,MAAM;EAAS,OAAO;EAAS,MAAM;EAAY,SAAS;EAAG;CAChE,EAEK,KAAqB,OAAsC;CAC/D,WAAW,EAAU;CACrB,UAAU,EAAU;CACpB,OAAO,EAAU;CACjB,OAAO,EAAU;CACjB,UAAU,EAAU;CACpB,QAAQ,EAAU;CAClB,QAAQ,EAAU;CAClB,YAAY,EAAU;CACtB,gBAAgB,EAAU;CAC1B,QAAQ,EAAU;CAClB,aAAa,EAAU;CACvB,WAAW,EAAU,aAAa;CAClC,QAAQ,EAAU;CAClB,OAAO,EAAU;CAClB,GAEK,KAA2B,MAA8C;CAC7E,IAAM,IAAc,EAAQ,GAAQ,cAAc;AAClD,QAAO;EACL,WAAW,EAAQ,GAAQ,YAAY;EACvC,UAAU,EAAQ,GAAQ,WAAW;EACrC,OAAO,EAAQ,GAAQ,QAAQ;EAC/B,OAAO,EAAQ,GAAQ,QAAQ;EAC/B,UAAU,EAAQ,GAAQ,WAAW;EACrC,QAAQ,EAAO;EACf,QAAQ,EAAQ,GAAQ,SAAS;EACjC,YAAY,EAAU,GAAQ,aAAa;EAC3C,gBAAgB,EAAQ,GAAQ,iBAAiB;EACjD,QAAQ,EAAU,GAAQ,SAAS;EACnC,aAAa,EAAY,MAAM,KAAK,sBAAmB,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,GAAG,GAAG,GAAnD;EACzC,WAAW,EAAQ,GAAQ,YAAY;EACvC,QAAQ,EAAQ,GAAQ,SAAS;EACjC,OAAO,EAAQ,GAAQ,QAAQ;EAChC;;AAIH,SAAS,EAAe,EAAE,SAAM,UAAO,MAAuC;AAC5E,QACE,kBAAC,QAAD;EACE,WAAU;EACV,OAAO;GAAE,OAAO;GAAM,QAAQ;GAAM,UAAU,KAAK,MAAM,IAAO,IAAK;GAAE;EACvE,eAAY;YAEX,EAAY,EAAK;EACb,CAAA;;AAIX,IAAM,IAAwD;CAC5D;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MACL,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD;IAAgB,MAAM,GAAG,EAAU,UAAU,GAAG,EAAU;IAAY,MAAM;IAAM,CAAA,EAClF,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;IAAG,WAAU;cAAb;KACG,EAAU;KAAU;KAAE,EAAU;KAC/B;OACJ,kBAAC,KAAD;IAAG,WAAU;cAA+B,EAAU;IAAU,CAAA,CAC5D,EAAA,CAAA,CACF;;EAET;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MAAc,kBAAC,QAAD;GAAM,WAAU;aAAuB,EAAU;GAAgB,CAAA;EACvF;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MACL,kBAAC,GAAD;GAAO,SAAQ;GAAU,WAAU;aAChC,EAAU;GACL,CAAA;EAEX;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MAAc,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAU,YAAW,OAAW,EAAA,CAAA;EAC7D;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MAAc,kBAAC,GAAD;GAAa,OAAO,EAAU;GAAQ,MAAM;GAAM,CAAA;EACxE;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MACL,kBAAC,QAAD;GAAM,WAAU;aAA+B,EAAU;GAAmB,CAAA;EAE/E;CACD;EACE,KAAK;EACL,QAAQ;EACR,UAAU;EACV,OAAO,MACL,kBAAC,GAAD;GACE,SACE,EAAU,WAAW,WAAW,EAAU,WAAW,UACjD,YACA,EAAU,WAAW,aACnB,gBACA;GAER,WAAU;aAET,EAAgB,EAAU,OAAO;GAC5B,CAAA;EAEX;CACF;AAED,SAAgB,IAA2B;CACzC,IAAM,EAAE,iBAAc,IAAa,EAC7B,EAAE,eAAY,iBAAc,oBAAiB,uBAAoB,GAAqB,EACtF,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,CAAC,GAAM,KAAW,EAA4B,QAAQ,EACtD,CAAC,GAAc,KAAmB,EAAiB,MAAM,EACzD,EAAE,SAAM,aAAU,WAAQ,eAAY,GAAc,EAAE,iBAAiB,IAAI,CAAC,EAC5E,CAAC,GAAY,KAAiB,EAAS,GAAM,EAC7C,CAAC,GAAY,KAAiB,EAA2B,KAAK,EAC9D,CAAC,GAAc,KAAmB,EAA2B,KAAK;AAGxE,GAAsB;EACpB,SAAS;EACT,UAAU,GAAY,MAAM;EAC5B,WAAW;EACZ,CAAC;CAEF,IAAM,KAAe,OAAO,MAAuB;AAEjD,EADA,MAAM,EAAa;GAAE,IAAI,GAAa;GAAE,GAAG,EAAwB,EAAO;GAAE,CAAC,EAC7E,EAAU,mBAAmB,UAAU;IAGnC,KAAa,OAAO,MAAuB;AAC1C,QAGL,MAAM,EAAgB,EAAW,IAAI,EAAwB,EAAO,CAAC,EACrE,EAAU,qBAAqB,UAAU;IAGrC,KAAe,YAAY;AAC1B,QAGL,MAAM,EAAgB,EAAa,GAAG,EACtC,EAAU,qBAAqB,UAAU;IAGrC,KAAa,OAAO,GAAsB,MAAgC;AAC1E,QAAU,WAAW,EAGzB,KAAI;AAEF,GADA,MAAM,EAAgB,EAAU,IAAI,EAAE,WAAQ,CAAC,EAC/C,EACE,GAAG,EAAU,UAAU,GAAG,EAAU,SAAS,YAAY,EAAgB,EAAO,IAChF,UACD;UACK;AACN,KAAU,4BAA4B,QAAQ;;IAI5C,IAAc,EAAO,aAAa,EAClC,IAAW,QAEb,EAAW,QAAQ,MACjB,GAAG,EAAE,UAAU,GAAG,EAAE,SAAS,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,aAAa,CAAC,SAAS,EAAY,CAC5F,EACH,CAAC,GAAY,EAAY,CAC1B,EAEK,IAAgB,EAAS,QAAQ,MAAM,MAAiB,SAAS,EAAE,WAAW,EAAa,EAC3F,KAAQ,EAAc,MAAM,GAAQ,IAAS,EAAS,EAEtD,IAA8B,EAAgB,KAAK,MAAU;EACjE,IAAM,IAAkB,EACrB,QAAQ,MAAM,EAAE,WAAW,EAAM,IAAI,CACrC,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,OAAO;AACtC,SAAO;GACL,IAAI,EAAM;GACV,OAAO,EAAM;GACb,QAAQ,EAAM;GACd,OAAO,EAAgB,KAAK,MAC1B,kBAAC,GAAD;IAEa;IACX,QAAQ;IACR,cAAc,EAAc,EAAU;IACtC,gBAAgB,EAAgB,EAAU;IAC1C,EALK,EAAU,GAKf,CACF;GACH;GACD;AAEF,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,sBAAiC,CAAA;MAC5C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAAb,CAA4C,EAAW,QAAO,0BAA2B;;KACzF,kBAAC,IAAD;MAAa,WAAU;gBAAO;MAGhB,CAAA;KACV,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAAe,EAAc,GAAK;eAApD,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,gBAE1B;OACL;;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;AAEf,OADA,EAAU,EAAE,OAAO,MAAM,EACzB,EAAQ,EAAE;;MAEZ,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAS,MAAS,UAAU,YAAY;MACxC,MAAK;MACL,WAAU;MACV,eAAe,EAAQ,QAAQ;gBAJjC,CAME,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,EAAA,QAEhC;SACT,kBAAC,GAAD;MACE,SAAS,MAAS,UAAU,YAAY;MACxC,MAAK;MACL,WAAU;MACV,eAAe,EAAQ,QAAQ;gBAJjC,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,QAE5B;QACL;OACF;;GAEL,EAAW,WAAW,IACrB,kBAAC,GAAD;IAAW,WAAU;IAAQ,WAAU;cACrC,kBAAC,GAAD;KAAa,WAAU;eACrB,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA;KACU,CAAA;IACJ,CAAA,GACV,MAAS,UACX,kBAAC,GAAD;IAAsB;IAAS,iBAAgB;IAAgC,CAAA,GAE/E,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAC1C,kBAAC,GAAD;KAAa,WAAU;eAAvB;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,SAAS,MAAiB,QAAQ,YAAY;QAC9C,MAAK;QACL,eAAe;AAEb,SADA,EAAgB,MAAM,EACtB,EAAQ,EAAE;;kBAEb;QAEQ,CAAA,EACR,EAAgB,KAAK,MACpB,kBAAC,GAAD;QAEE,SAAS,MAAiB,EAAM,MAAM,YAAY;QAClD,MAAK;QACL,eAAe;AAEb,SADA,EAAgB,EAAM,IAAI,EAC1B,EAAQ,EAAE;;kBAGX,EAAM;QACA,EATF,EAAM,IASJ,CACT,CACE;;MACN,kBAAC,IAAD;OACE,MAAM;OACN,SAAS,MAAc,EAAU;OACjC,SAAS;OACT,YACE,kBAAC,GAAD;QACE,cAAa;QACb,OAAM;QACN,aAAY;QACZ,CAAA;OAEJ,aAAa,MACX,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,cAAY,QAAQ,EAAU,UAAU,GAAG,EAAU;SACrD,eAAe,EAAc,EAAU;mBAEvC,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA;SAC3B,CAAA,EACT,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,cAAY,UAAU,EAAU,UAAU,GAAG,EAAU;SACvD,eAAe,EAAgB,EAAU;mBAEzC,kBAAC,GAAD,EAAQ,WAAU,oCAAqC,CAAA;SAChD,CAAA,CACL;;OAER,CAAA;MACD,EAAc,SAAS,KACtB,kBAAC,OAAD;OAAK,WAAU;iBACb,kBAAC,IAAD;QACQ;QACI;QACV,YAAY,EAAc;QAC1B,cAAc;QACd,CAAA;OACE,CAAA;MAEI;;IACJ,CAAA;GAGd,kBAAC,GAAD;IACE,MAAM;IACN,cAAc;IACd,OAAM;IACN,aAAY;IACZ,QAAQ;IACR,aAAY;IACZ,UAAU;IACV,CAAA;GACF,kBAAC,GAAD;IACE,MAAM,MAAe;IACrB,eAAe,MAAS;AACtB,KAAK,KACH,EAAc,KAAK;;IAGvB,OAAM;IACN,aAAa,IAAa,GAAG,EAAW,UAAU,GAAG,EAAW,aAAa,KAAA;IAC7E,QAAQ;IACR,eAAe,IAAa,EAAkB,EAAW,GAAG,KAAA;IAC5D,aAAY;IACZ,UAAU;IACV,CAAA;GACF,kBAAC,GAAD;IACE,MAAM,MAAiB;IACvB,eAAe,MAAS;AACtB,KAAK,KACH,EAAgB,KAAK;;IAGzB,OAAM;IACN,aACE,IACI,UAAU,EAAa,UAAU,GAAG,EAAa,SAAS,uBAC1D,KAAA;IAEN,cAAa;IACb,aAAA;IACA,WAAW;IACX,CAAA;GACE;;;AAWV,SAAS,EAAc,EAAE,cAAW,WAAQ,WAAQ,eAAgC;CAClF,IAAM,IAAW,GAAG,EAAU,UAAU,GAAG,EAAU;AACrD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAgB,MAAM;KAAU,MAAM;KAAM,CAAA,EAC5C,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,KAAD;MAAG,WAAU;gBAAoD;MAAa,CAAA,EAC9E,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAU;MAAa,CAAA,CACxE;OACF;;GACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KAAa,OAAO,EAAU;KAAQ,MAAM;KAAM,CAAA,EAClD,kBAAC,GAAD;KAAO,SAAQ;KAAU,WAAU;eAChC,EAAU;KACL,CAAA,CACJ;;GACL,EAAU,OAAO,SAAS,KACzB,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAU,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK,MACjC,kBAAC,GAAD;KAAmB,SAAQ;KAAY,WAAU;eAC9C;KACK,EAFI,EAEJ,CACR;IACE,CAAA;GAER,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAqB,SAAA;eACnB,kBAAC,GAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD,EAAgB,WAAU,oBAAqB,CAAA,EAAA,OAExC;;KACW,CAAA,EACtB,kBAAC,GAAD;KAAqB,OAAM;eAA3B;MACE,kBAAC,GAAD,EAAA,UAAmB,iBAAiC,CAAA;MACpD,kBAAC,GAAD,EAAyB,CAAA;MACxB,EAAgB,QAAQ,MAAU,EAAM,QAAQ,EAAU,OAAO,CAAC,KAAK,MACtE,kBAAC,GAAD;OAAkC,gBAAgB,EAAO,GAAW,EAAM,IAAI;iBAA9E,CACE,kBAAC,QAAD;QACE,eAAY;QACZ,WAAU;QACV,OAAO,EAAE,iBAAiB,EAAM,QAAQ;QACxC,CAAA,EACD,EAAM,MACU;SAPI,EAAM,IAOV,CACnB;MACkB;OACT,EAAA,CAAA,EACf,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAQ;MACR,MAAK;MACL,WAAU;MACV,cAAY,QAAQ;MACpB,SAAS;gBAET,kBAAC,GAAD,EAAQ,WAAU,eAAgB,CAAA;MAC3B,CAAA,EACT,kBAAC,GAAD;MACE,SAAQ;MACR,MAAK;MACL,WAAU;MACV,cAAY,UAAU;MACtB,SAAS;gBAET,kBAAC,GAAD,EAAQ,WAAU,oCAAqC,CAAA;MAChD,CAAA,CACL;OACF;;GACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringInterviewsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HiringInterviewsPagePage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"HiringInterviewsPagePage.d.ts","sourceRoot":"","sources":["../../../src/crewfoundry/pages/HiringInterviewsPagePage.tsx"],"names":[],"mappings":"AAkKA,wBAAgB,wBAAwB,gCAiSvC"}
|