update position page design
This commit is contained in:
@@ -1,9 +1,14 @@
|
||||
import React, { useMemo, useState } from 'react';
|
||||
import { Button, SearchInput } from '@/components/ds';
|
||||
import { useApplications, useInterviews, useJobPostings } from '@/lib/krowHooks';
|
||||
import { useApplications, useInterviews, useJobPostings, useUpdateApplication, useHireCandidate } from '@/lib/krowHooks';
|
||||
import { base44 } from '@/api/base44Client';
|
||||
import { toast } from 'react-hot-toast';
|
||||
import { AdminPage, Toolbar } from '@/pages/admin/_shell';
|
||||
import { FilterSelect } from '@/pages/admin/Positions';
|
||||
import CandidateCard from '@/components/krow/CandidateCard';
|
||||
import AIInterviewModal from '@/components/krow/AIInterviewModal';
|
||||
import ScheduleInterviewModal from '@/components/krow/ScheduleInterviewModal';
|
||||
import MessageCandidateModal from '@/components/krow/MessageCandidateModal';
|
||||
|
||||
const SCORE_BANDS = {
|
||||
all: () => true,
|
||||
@@ -24,6 +29,8 @@ export default function AdminCandidates() {
|
||||
const { data: applications = [], isLoading } = useApplications();
|
||||
const { data: postings = [] } = useJobPostings();
|
||||
const { data: interviews = [] } = useInterviews();
|
||||
const updateApp = useUpdateApplication();
|
||||
const hireCandidate = useHireCandidate();
|
||||
|
||||
const [search, setSearch] = useState('');
|
||||
const [position, setPosition] = useState('all');
|
||||
@@ -31,6 +38,46 @@ export default function AdminCandidates() {
|
||||
const [band, setBand] = useState('all');
|
||||
const [sort, setSort] = useState('score');
|
||||
|
||||
const [interviewApp, setInterviewApp] = useState(null);
|
||||
const [scheduleApp, setScheduleApp] = useState(null);
|
||||
const [messageApp, setMessageApp] = useState(null);
|
||||
|
||||
const handleDecline = async (app) => {
|
||||
try {
|
||||
await updateApp.mutateAsync({ id: app.id, data: { status: 'rejected' } });
|
||||
toast.success(`${app.applicant_name} declined`);
|
||||
} catch (e) {
|
||||
toast.error('Failed to decline candidate');
|
||||
}
|
||||
};
|
||||
|
||||
const handleDelete = async (app) => {
|
||||
try {
|
||||
await base44.entities.JobApplication.delete(app.id);
|
||||
toast.success(`${app.applicant_name} deleted`);
|
||||
} catch (e) {
|
||||
toast.error('Failed to delete candidate');
|
||||
}
|
||||
};
|
||||
|
||||
const handleHire = async (app) => {
|
||||
try {
|
||||
const job = postings.find(p => p.id === app.job_posting_id);
|
||||
await hireCandidate.mutateAsync({ application: app, job });
|
||||
toast.success(`${app.applicant_name} hired!`);
|
||||
} catch (e) {
|
||||
toast.error('Failed to hire candidate');
|
||||
}
|
||||
};
|
||||
|
||||
const handleAction = (app) => {
|
||||
if (app.status === 'interview') {
|
||||
setInterviewApp(app);
|
||||
} else {
|
||||
setScheduleApp(app);
|
||||
}
|
||||
};
|
||||
|
||||
const positions = useMemo(
|
||||
() => [...new Set(applications.map((a) => a.job_title).filter(Boolean))].sort(),
|
||||
[applications]
|
||||
@@ -106,11 +153,28 @@ export default function AdminCandidates() {
|
||||
application={app}
|
||||
jobTitle={resolveTitle(app)}
|
||||
rank={idx + 1}
|
||||
onAction={handleAction}
|
||||
onMessage={setMessageApp}
|
||||
onCall={setMessageApp}
|
||||
onSchedule={setScheduleApp}
|
||||
onDecline={handleDecline}
|
||||
onDelete={handleDelete}
|
||||
onHire={handleHire}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* Modals */}
|
||||
{interviewApp && (
|
||||
<AIInterviewModal open={true} onClose={() => setInterviewApp(null)} application={interviewApp} job={postings.find(p => p.id === interviewApp.job_posting_id)} />
|
||||
)}
|
||||
{scheduleApp && (
|
||||
<ScheduleInterviewModal open={true} onClose={() => setScheduleApp(null)} application={scheduleApp} />
|
||||
)}
|
||||
{messageApp && (
|
||||
<MessageCandidateModal open={true} onClose={() => setMessageApp(null)} application={messageApp} />
|
||||
)}
|
||||
</AdminPage>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user