Projekt

Obecné

Profil

Stáhnout (6.2 KB) Statistiky
| Větev: | Tag: | Revize:
1
import 'antd/dist/antd.css';
2
import React, { useContext, useEffect, useState } from 'react';
3

    
4
import { useUnauthRedirect } from '../../../hooks';
5
import { useRouter } from 'next/router';
6
import { Button, Space, Table, Typography } from 'antd';
7
import { faFileLines, faUser } from '@fortawesome/free-solid-svg-icons';
8
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
import { LoggedUserContext } from '../../../contexts/LoggedUserContext';
10
import { MainLayout } from '../../../layouts/MainLayout';
11
import AddDocumentModal from '../../../components/modals/AddDocumentModal';
12
import { DocumentListInfo, UserInfo } from '../../../api';
13
import { documentController, userController } from '../../../controllers';
14
import AssignDocumentModal from '../../../components/modals/AssignDocumentModal';
15
import { ShowConfirmDelete, ShowToast } from '../../../utils/alerts';
16
import { TableDocInfo } from '../../../components/types/TableDocInfo';
17
import { UserFilter } from '../../../components/types/UserFilter';
18
import { getColumnSearchProps, getLocaleProps } from '../../../utils/tableUtils';
19
import { UserOutlined } from '@ant-design/icons';
20
import Swal from 'sweetalert2';
21

    
22
function AdminDocumentPage() {
23
    const redirecting = useUnauthRedirect('/login');
24
    const { logout, role } = useContext(LoggedUserContext);
25
    const [visibleAdd, setVisibleAdd] = React.useState(false);
26
    const [visibleAssign, setVisibleAssign] = React.useState(false);
27
    const router = useRouter();
28

    
29
    const [documents, setDocuments] = useState<TableDocInfo[]>([]);
30
    const [userFilters, setUserFilters] = useState<UserFilter[]>([]);
31
    const [selectedDocs, setSelectedDocs] = useState<string[] | undefined[]>([]);
32

    
33
    async function fetchData() {
34
        const docs = (await documentController.documentsGet(0, 1000)).data.documents;
35
        // @ts-ignore
36
        const tableDocs: TableDocInfo[] = docs?.map((doc, index) => {
37
            return { key: index, ...doc };
38
        });
39

    
40
        const users = (await userController.usersGet()).data.users;
41
        // @ts-ignore
42
        const filters: UserFilter[] = users?.map((user) => {
43
            return {
44
                text: user.name + ' ' + user.surname,
45
                value: user.username,
46
            };
47
        });
48
        setUserFilters(filters);
49

    
50
        if (!docs) {
51
            setDocuments([]);
52
        } else {
53
            setDocuments(tableDocs);
54
        }
55
    }
56

    
57
    useEffect(() => {
58
        if (!redirecting && role === 'ADMINISTRATOR') {
59
            fetchData();
60
        }
61
    }, [logout, redirecting, role, router]);
62

    
63
    const showAssignModal = () => {
64
        if (selectedDocs.length == 0) {
65
            ShowToast('Vyberte dokument pro přiřazení', 'warning', 3000, 'top-end');
66
        } else {
67
            setVisibleAssign(true);
68
        }
69
    };
70

    
71
    const showAddModal = () => {
72
        setVisibleAdd(true);
73
    };
74

    
75
    const hideModal = () => {
76
        fetchData();
77
        setVisibleAdd(false);
78
        setVisibleAssign(false);
79
    };
80

    
81
    const columns = [
82
        {
83
            title: 'Název dokumentu',
84
            dataIndex: 'name',
85
            key: 'name',
86
            ...getColumnSearchProps('name', 'název'),
87
            sorter: {
88
                // @ts-ignore
89
                compare: (a, b) => a.name.localeCompare(b.name),
90
                multiple: 2,
91
            },
92
        },
93
        {
94
            title: 'Délka',
95
            dataIndex: 'length',
96
            key: 'length',
97
            sorter: {
98
                // @ts-ignore
99
                compare: (a, b) => a.length - b.length,
100
                multiple: 1,
101
            },
102
        },
103
        {
104
            title: 'Anotátoři',
105
            dataIndex: 'annotatingUsers',
106
            key: 'annotatingUsers',
107
            render: (columnData: UserInfo[], record: DocumentListInfo, index: number) => {
108
                return (
109
                    <div>
110
                        <Space>
111
                            {columnData.map((e) => (
112
                                <span
113
                                    key={e.username + '.' + record.id}
114
                                    title={e.username ?? ''}
115
                                >
116
                                    <FontAwesomeIcon
117
                                        icon={faUser}
118
                                        title={e.username ?? ''}
119
                                        className={'me-2'}
120
                                    />
121
                                </span>
122
                            ))}
123
                        </Space>
124
                    </div>
125
                );
126
            },
127
            filters: userFilters,
128
            filterSearch: true,
129
            // @ts-ignore
130
            onFilter: (value, record) =>
131
                // @ts-ignore
132
                record.annotatingUsers.find((user) => user['username'] === value),
133
            sorter: {
134
                // @ts-ignore
135
                compare: (a, b) => a.annotatingUsers.length - b.annotatingUsers.length,
136
                multiple: 3,
137
            },
138
        },
139
    ];
140

    
141
    const rowSelection = {
142
        onChange: (selectedRowKeys: React.Key[], selectedRows: DocumentListInfo[]) => {
143
            // @ts-ignore
144
            setSelectedDocs(selectedRows.map((row) => row.id));
145
        },
146
    };
147

    
148
    return redirecting || role !== 'ADMINISTRATOR' ? null : (
149
        <MainLayout>
150
            <Typography.Title level={2}>
151
                <FontAwesomeIcon icon={faFileLines} /> Dokumenty
152
            </Typography.Title>
153
            <Button type={'primary'} onClick={showAddModal}>
154
                Nahrát dokument
155
            </Button>
156
            <Button onClick={showAssignModal}>Přiřadit dokumenty</Button>
157
            {visibleAdd && <AddDocumentModal onCancel={hideModal} />}
158
            {visibleAssign && (
159
                <AssignDocumentModal documentsIds={selectedDocs} onCancel={hideModal} />
160
            )}
161

    
162
            <Table
163
                locale={{ ...getLocaleProps() }}
164
                rowSelection={{
165
                    type: 'checkbox',
166
                    ...rowSelection,
167
                }}
168
                // @ts-ignore
169
                columns={columns}
170
                dataSource={documents}
171
                size="middle"
172
                scroll={{ y: 600 }}
173
            />
174
        </MainLayout>
175
    );
176
}
177

    
178
export default AdminDocumentPage;
    (1-1/1)