2021-01-21 16:09:23 +01:00
|
|
|
import React from 'react';
|
|
|
|
|
|
|
|
|
|
import JobTable from '../../components/table/JobTable';
|
|
|
|
|
import { useSelector, useDispatch } from 'react-redux';
|
|
|
|
|
import { xhrDelete, xhrPut } from '../../services/xhr';
|
2025-09-02 20:18:37 +02:00
|
|
|
import { useNavigate } from 'react-router-dom';
|
2021-05-13 20:27:42 +02:00
|
|
|
import ProcessingTimes from './ProcessingTimes';
|
2023-03-20 08:52:13 +01:00
|
|
|
import { Button, Toast } from '@douyinfe/semi-ui';
|
|
|
|
|
import { IconPlusCircle } from '@douyinfe/semi-icons';
|
2021-01-21 16:09:23 +01:00
|
|
|
import './Jobs.less';
|
|
|
|
|
|
|
|
|
|
export default function Jobs() {
|
|
|
|
|
const jobs = useSelector((state) => state.jobs.jobs);
|
2021-05-13 20:27:42 +02:00
|
|
|
const processingTimes = useSelector((state) => state.jobs.processingTimes);
|
2025-09-02 20:18:37 +02:00
|
|
|
const navigate = useNavigate();
|
2021-01-21 16:09:23 +01:00
|
|
|
const dispatch = useDispatch();
|
|
|
|
|
|
|
|
|
|
const onJobRemoval = async (jobId) => {
|
|
|
|
|
try {
|
|
|
|
|
await xhrDelete('/api/jobs', { jobId });
|
2023-03-20 08:52:13 +01:00
|
|
|
Toast.success('Job successfully remove');
|
2021-01-21 16:09:23 +01:00
|
|
|
await dispatch.jobs.getJobs();
|
|
|
|
|
} catch (error) {
|
2023-03-20 08:52:13 +01:00
|
|
|
Toast.error(error);
|
2021-01-21 16:09:23 +01:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const onJobStatusChanged = async (jobId, status) => {
|
|
|
|
|
try {
|
|
|
|
|
await xhrPut(`/api/jobs/${jobId}/status`, { status });
|
2023-03-20 08:52:13 +01:00
|
|
|
Toast.success('Job status successfully changed');
|
2021-01-21 16:09:23 +01:00
|
|
|
await dispatch.jobs.getJobs();
|
|
|
|
|
} catch (error) {
|
2023-03-20 08:52:13 +01:00
|
|
|
Toast.error(error);
|
2021-01-21 16:09:23 +01:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<div>
|
2021-05-13 20:27:42 +02:00
|
|
|
<div>
|
|
|
|
|
{processingTimes != null && <ProcessingTimes processingTimes={processingTimes} />}
|
2023-03-20 08:52:13 +01:00
|
|
|
<Button
|
|
|
|
|
type="primary"
|
|
|
|
|
icon={<IconPlusCircle />}
|
|
|
|
|
className="jobs__newButton"
|
2025-09-02 20:18:37 +02:00
|
|
|
onClick={() => navigate('/jobs/new')}
|
2023-03-20 08:52:13 +01:00
|
|
|
>
|
2021-05-13 20:27:42 +02:00
|
|
|
New Job
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
2021-01-21 16:09:23 +01:00
|
|
|
|
|
|
|
|
<JobTable
|
|
|
|
|
jobs={jobs || []}
|
|
|
|
|
onJobRemoval={onJobRemoval}
|
|
|
|
|
onJobStatusChanged={onJobStatusChanged}
|
2025-09-02 20:18:37 +02:00
|
|
|
onJobInsight={(jobId) => navigate(`/jobs/insights/${jobId}`)}
|
|
|
|
|
onJobEdit={(jobId) => navigate(`/jobs/edit/${jobId}`)}
|
2021-01-21 16:09:23 +01:00
|
|
|
/>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|