import React, { useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { change_done, remove_todo, edit_todo, set_sort_todo, sort_todo, refresh_filtered_todos, select_todos, select_current_sorting, } from "../features/todo/reducer"; function sort_table_header(prefix, current_sorting) { if (prefix.toLowerCase().startsWith(current_sorting.substr(0, 3))) { switch (current_sorting.substr(-1)) { case "^": // Write Prefix and an arrow pointing up. return ( <> {prefix} ); case "v": // Write Prefix and an arrow pointing down. return ( <> {prefix} ); } } else { // Write Prefix and four dots. No sorting. return ( <> {prefix} ); } } function list_of_todos(edit_button, delete_button) { const dispatch = useDispatch(); const my_todos = useSelector(select_todos); const my_sorting = useSelector(select_current_sorting); function handle_sort_todos(where_clicked) { dispatch( set_sort_todo({ where_clicked: where_clicked, }) ); dispatch(sort_todo()); dispatch(refresh_filtered_todos()); } // Table contents var table_head = ( Done Name handle_sort_todos("priority")}> {sort_table_header("Priority", my_sorting)} { handle_sort_todos("due_date"); }} > {sort_table_header("Due Date", my_sorting)} Actions ); var table_body = ( {my_todos.map((item) => (
{ dispatch( change_done({ id: item.id, done: e.target.checked, }) ), dispatch(refresh_filtered_todos()); }} >
{item.text} {item.priority} {item.due_date}
{edit_button(item)} {delete_button(item)}
))} ); return (
{table_head} {table_body}
); } function new_modal(modal_id, modal_header, modal_body, modal_footer) { return ( ); } export function ListToDos() { const dispatch = useDispatch(); const [edit_id, set_edit_id] = useState(-1); const [edit_text, set_edit_text] = useState(""); const [edit_due_date, set_edit_due_date] = useState(""); const [edit_done, set_edit_done] = useState(false); const [edit_priority, set_edit_priority] = useState("Low"); function handle_open_modal(id, text, due_date, done, priority) { set_edit_id(id); set_edit_text(text); set_edit_due_date(due_date); set_edit_done(done); set_edit_priority(priority); } function handle_exit_modal() { // https://stackoverflow.com/questions/27826381/clearing-form-input-fields-in-bootstrap $("form").get(0).reset(); // Reset form set_edit_id(-1); set_edit_text(""); set_edit_done(false); set_edit_priority("Low"); } function handle_edit_todo() { dispatch( edit_todo({ id: edit_id, text: edit_text, due_date: edit_due_date, done: edit_done, priority: edit_priority, }) ); dispatch(sort_todo()); dispatch(refresh_filtered_todos()); handle_exit_modal(); } // Define Edit and Remove buttons function edit_button(item) { return ( ); } function delete_button(item) { return ( ); } // Define modal to edit a to do. var modal_header = (
Edit a to do
); var modal_footer = (
); var modal_body = (
set_edit_text(e.target.value)} />
{ set_edit_due_date(e.target.value); }} />
set_edit_done(e.target.checked)} checked={edit_done} />
); return ( <> {list_of_todos(edit_button, delete_button)} {new_modal("EditToDo", modal_header, modal_body, modal_footer)} ); }