All files / components/Commons CommonsTable.js

100% Statements 21/21
100% Branches 2/2
100% Functions 11/11
100% Lines 21/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107                      33x   33x 1x       33x               33x 2x 2x     33x 1x     33x                     47x                 47x         47x         47x         47x           47x               47x         33x   33x             33x       33x        
import React from "react";
import OurTable, { ButtonColumn } from "main/components/OurTable";
import { useBackendMutation } from "main/utils/useBackend";
import {
    cellToAxiosParamsDelete,
    onDeleteSuccess,
} from "main/utils/commonsUtils";
import { useNavigate } from "react-router-dom";
import { hasRole } from "main/utils/currentUser";
 
export default function CommonsTable({ commons, currentUser }) {
    const navigate = useNavigate();
 
    const editCallback = (cell) => {
        navigate(`/admin/editcommons/${cell.row.values["commons.id"]}`);
    };
 
    // Stryker disable all : hard to test for query caching
    const deleteMutation = useBackendMutation(
        cellToAxiosParamsDelete,
        { onSuccess: onDeleteSuccess },
        ["/api/commons/allplus"]
    );
    // Stryker restore all
 
    // Stryker disable next-line all : TODO try to make a good test for this
    const deleteCallback = async (cell) => {
        console.log("deleteCallback cell=", cell);
        deleteMutation.mutate(cell);
    };
 
    const leaderboardCallback = (cell) => {
        navigate(`/leaderboard/${cell.row.values["commons.id"]}`);
    };
 
    const columns = [
        {
            Header: "id",
            accessor: "commons.id", // accessor is the "key" in the data
        },
        {
            Header: "Name",
            accessor: "commons.name",
        },
        {
            Header: "Cow Price",
            accessor: (row) => row.commons.cowPrice,
            id: "commons.cowPrice",
        },
        {
            Header: "Price Change",
            accessor: "priceChange",
        },
        {
            Header: "Milk Price",
            accessor: (row) => row.commons.milkPrice,
            id: "commons.milkPrice",
        },
        {
            Header: "Starting Balance",
            accessor: (row) => row.commons.startingBalance,
            id: "commons.startingBalance",
        },
        {
            Header: "Starting Date",
            accessor: (row) => String(row.commons.startingDate).slice(0, 10),
            id: "commons.startingDate",
        },
        {
            Header: "Degradation Rate",
            accessor: (row) => row.commons.degradationRate,
            id: "commons.degradationRate",
        },
        {
            Header: "Show Leaderboard?",
            id: "commons.showLeaderboard", // needed for tests
            accessor: (row, _rowIndex) => String(row.commons.showLeaderboard), // hack needed for boolean values to show up
        },
        {
            Header: "Cows",
            accessor: "totalCows",
        },
        {
            Header: "Carrying Capacity",
            accessor: (row) => row.commons.carryingCapacity,
            id: "commons.carryingCapacity",
        },
    ];
 
    const testid = "CommonsTable";
 
    const columnsIfAdmin = [
        ...columns,
        ButtonColumn("Edit", "primary", editCallback, testid),
        ButtonColumn("Delete", "danger", deleteCallback, testid),
        ButtonColumn("Leaderboard", "secondary", leaderboardCallback, testid),
    ];
 
    const columnsToDisplay = hasRole(currentUser, "ROLE_ADMIN")
        ? columnsIfAdmin
        : columns;
 
    return (
        <OurTable data={commons} columns={columnsToDisplay} testid={testid} />
    );
}