import {Button, Card, Space, Switch, Table} from "antd"; import queryString from "query-string"; import React, {useCallback, useState} from "react"; import {useTranslation} from "react-i18next"; import {Link, useLocation, useNavigate} from "react-router-dom"; import {pageLimit} from "../../utils/config"; import dayjs from "../../utils/day"; import { CheckCircleFilled, CheckCircleOutlined, DeleteFilled, DeleteOutlined, EditFilled, ExclamationCircleFilled, PlusCircleFilled, SyncOutlined } from "@ant-design/icons"; import {DateFormatter} from "../../utils/DateFormatter.jsx"; import {connect} from 'react-redux'; import {setModalContext} from '../../redux/modals/modals.actions'; /** * Task List Component * @param dueDate * @returns {Element} * @constructor */ const DueDateRecord = ({dueDate}) => { if (dueDate) { const dueDateDayjs = dayjs(dueDate); const relativeDueDate = dueDateDayjs.fromNow(); const today = dayjs(); if (dueDateDayjs.isAfter(today)) { return
{dueDate}
; } else { return
{dueDate}
; } } else { return
N/A
; } } /** * Priority Label Component * @param priority * @returns {Element} * @constructor */ const PriorityLabel = ({priority}) => { switch(priority) { case 1: return
High
; case 2: return
Medium
; case 3: return
Low
; default: return
None
; } } const mapDispatchToProps = (dispatch) => ({ // Existing dispatch props... setTaskUpsertContext: (context) => dispatch(setModalContext({context, modal: 'taskUpsert'})), }); const mapStateToProps = (state) => ({ // Existing state props... }); export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent); function TaskListComponent({ loading, tasks, total, refetch, toggleCompletedStatus, setTaskUpsertContext, }) { const {t} = useTranslation(); const search = queryString.parse(useLocation().search); // Extract Query Params const { page, sortcolumn, sortorder, deleted, completed } = search; const history = useNavigate(); const columns = [ { title: t("tasks.fields.job.ro_number"), dataIndex: ["job", "ro_number"], key: "job.ro_number", width: '5%', render: (text, record) => ( {record.job.ro_number} ), }, { title: t("tasks.fields.title"), dataIndex: "title", key: "title", sorter: true, sortOrder: sortcolumn === "title" && sortorder, }, { title: t("tasks.fields.description"), dataIndex: "description", key: "description", sorter: true, sortOrder: sortcolumn === "description" && sortorder, }, { title: t("tasks.fields.due_date"), dataIndex: "due_date", key: "due_date", sorter: true, sortOrder: sortcolumn === "due_date" && sortorder, width: '5%', render: (text, record) => , }, { title: t("tasks.fields.priority"), dataIndex: "priority", key: "priority", sorter: true, sortOrder: sortcolumn === "priority" && sortorder, width: '5%', render: (text, record) => }, { title: t("tasks.fields.actions"), key: "toggleCompleted", width: '5%', render: (text, record) => ( ), }, ]; const [state, setState] = useState({ sortedInfo: {}, filteredInfo: {text: ""}, }); const handleCreateTask = () => { setTaskUpsertContext({ actions: {}, context: {}, }); }; const handleTableChange = (pagination, filters, sorter) => { setState({...state, filteredInfo: filters, sortedInfo: sorter}); search.page = pagination.current; search.sortcolumn = sorter.columnKey; search.sortorder = sorter.order; history({search: queryString.stringify(search)}); }; const handleSwitchChange = (param, value) => { if (value) { search[param] = "true"; } else { delete search[param]; } history({search: queryString.stringify(search)}); }; /** * Extra actions for the tasks * @type {Function} */ const tasksExtra = useCallback(() => { return ( } unCheckedChildren={} title={t('tasks.titles.completed')} checked={completed === "true"} onChange={(value) => handleSwitchChange('completed', value)} /> } unCheckedChildren={} title={t('tasks.titles.deleted')} checked={deleted === "true"} onChange={(value) => handleSwitchChange('deleted', value)} /> ); }, [refetch, deleted, completed]); return ( ); }