Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 8042 | Rev 8152 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
6680 stevensc 1
import React, { useCallback, useState } from 'react'
2
import { Link } from 'react-router-dom';
3
 
4
const sortData = ({ tableData, sortKey, reverse }) => {
5
    let sortedData
6
 
7
    if (!sortKey) return tableData;
8
 
9
    if (sortKey !== "name") {
10
        sortedData = tableData.sort((a, b) => {
11
            return a[sortKey] - b[sortKey];
12
        });
13
    } else {
14
        sortedData = tableData.sort((a, b) => {
15
            return a[sortKey] > b[sortKey] ? 1 : -1;
16
        });
17
    }
18
 
19
 
20
    if (reverse) {
21
        return sortedData.reverse();
22
    }
23
 
24
    return sortedData;
25
}
26
 
27
const SortButton = ({ sortOrder, columnKey, sortKey, onClick }) => {
28
    return (
29
        <button onClick={onClick} className="btn">
30
            {
31
                (sortKey === columnKey) && (sortOrder === "desc")
32
                    ? <i className='fa fa-angle-up' />
33
                    : <i className='fa fa-angle-down' />
34
            }
35
        </button>
36
    );
37
}
38
 
7774 stevensc 39
const Table = ({ data, headers, onDelete, allowEdit, allowDelete, onEdit, allowUsersWhoApplied }) => {
6680 stevensc 40
 
6794 stevensc 41
    const initialSortKey = Object.values(headers)[0]
42
    const [sortKey, setSortKey] = useState(initialSortKey);
6680 stevensc 43
    const [sortOrder, setSortOrder] = useState("ascn");
44
 
45
    const sortedData = useCallback(
46
        () => sortData({ tableData: data, sortKey, reverse: sortOrder === "desc" }),
47
        [data, sortKey, sortOrder]
48
    );
49
 
50
    const changeSort = (key) => {
51
        setSortOrder(sortOrder === "ascn" ? "desc" : "ascn");
52
 
53
        setSortKey(key);
54
    }
55
 
56
    return (
57
        <table className="table table-hover dataTable no-footer dtr-inline">
58
            <thead>
59
                <tr>
60
                    {headers.map((row) => {
61
                        return (
62
                            <th
63
                                key={row.key}
64
                                className="text-vertical-middle"
65
                            >
66
                                {row.label}
67
                                {
68
                                    row.isSorteable
69
                                    &&
70
                                    <SortButton
71
                                        columnKey={row.key}
72
                                        onClick={() => changeSort(row.key)}
73
                                        {...{
74
                                            sortOrder,
75
                                            sortKey,
76
                                        }}
77
                                    />
78
                                }
79
                            </th>
80
                        );
81
                    })}
82
                </tr>
83
            </thead>
84
 
85
            <tbody>
86
                {sortedData().map((item, index) => {
87
                    const entries = Object.entries(item)
88
 
89
                    return (
90
                        < tr key={item.id} >
91
                            {
92
                                entries.map((element) => {
93
 
94
                                    if (element[0] !== "id") {
95
 
6794 stevensc 96
                                        if (element[0] === "details") {
6680 stevensc 97
                                            return (
6795 stevensc 98
                                                <td>
6848 stevensc 99
                                                    <ul style={{ listStyle: 'none' }}>
6795 stevensc 100
                                                        <li>Estatus: {element[1]["status"]}</li>
101
                                                        <li>Tipo de empleo: {element[1]["employment_type"]}</li>
102
                                                        <li>Aplicantes: {element[1]["users_who_applied"]}</li>
103
                                                    </ul>
6680 stevensc 104
                                                </td>
105
                                            )
106
                                        }
107
 
108
                                        if (element[0] === "actions") {
109
                                            return (
110
                                                <td style={{ display: 'flex', gap: '5px' }}>
111
                                                    {
112
                                                        (allowEdit === "1")
113
                                                        &&
114
                                                        <Link
115
                                                            to="/jobs/edit"
116
                                                            style={{ textDecoration: 'none' }}
6848 stevensc 117
                                                            onClick={() => onEdit(element[1]['link_edit'])}
6680 stevensc 118
                                                        >
119
                                                            <button
120
                                                                className="btn btn-primary btn-edit"
121
                                                            >
122
                                                                <i className="fa fa-pencil" />
123
                                                                Editar
124
                                                            </button>
125
                                                        </Link>
126
                                                    }
127
                                                    {
128
                                                        (allowDelete === "1")
129
                                                        &&
130
                                                        <button
131
                                                            className="btn btn-danger btn-delete"
132
                                                            onClick={() => onDelete(item)}
133
                                                        >
134
                                                            <i className="fa fa-trash" />
135
                                                            Borrar
136
                                                        </button>
137
                                                    }
7774 stevensc 138
                                                    {
139
                                                        (allowUsersWhoApplied === "1")
140
                                                        &&
8063 stevensc 141
                                                        <button className="btn btn-primary btn-users-who-applied mt-2">
7774 stevensc 142
                                                            <i className="fa fa-users" />
8042 stevensc 143
                                                            Quien aplicó
7774 stevensc 144
                                                        </button>
145
                                                    }
6680 stevensc 146
                                                </td>
147
                                            )
148
                                        }
149
 
150
                                        return (
151
                                            <td
152
                                                className="text-vertical-middle sorting_1 dtr-control">
153
                                                {element[1]}
154
                                            </td>
155
                                        )
156
                                    }
157
                                })
158
                            }
159
                        </tr>
160
                    );
161
                })}
162
            </tbody>
163
        </table >
164
    );
165
}
166
 
167
export default Table;