Projekt

Obecné

Profil

Stáhnout (5.17 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, Table, Tag, 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 {
13
    AnnotationListInfo,
14
    DocumentListInfo,
15
    DocumentUserInfo,
16
    EState,
17
    UserInfo,
18
} from '../../../api';
19
import { documentController, userController } from '../../../controllers';
20
import AssignDocumentModal from '../../../components/modals/AssignDocumentModal';
21
import { ShowToast } from '../../../utils/alerts';
22
import { TableDocInfo } from '../../../components/types/TableDocInfo';
23
import {
24
    getAnnotationStateColor,
25
    getNameTruncated,
26
    getUserInfoAlt,
27
} from '../../../utils/strings';
28

    
29
function AdminDocumentPage() {
30
    const redirecting = useUnauthRedirect('/login');
31
    const { logout, role } = useContext(LoggedUserContext);
32
    const [visibleAdd, setVisibleAdd] = React.useState(false);
33
    const [visibleAssign, setVisibleAssign] = React.useState(false);
34
    const router = useRouter();
35

    
36
    const [documents, setDocuments] = useState<TableDocInfo[]>([]);
37
    const [selectedDocs, setSelectedDocs] = useState<string[] | undefined[]>([]);
38

    
39
    async function fetchData() {
40
        const docs = (await documentController.documentsGet(0, 1000)).data.documents;
41

    
42
        // @ts-ignore
43
        const tableDocs: TableDocInfo[] = docs?.map((doc, index) => {
44
            return { key: index, ...doc };
45
        });
46

    
47
        if (!docs) {
48
            setDocuments([]);
49
        } else {
50
            setDocuments(tableDocs);
51
        }
52
    }
53

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

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

    
68
    const showAddModal = () => {
69
        setVisibleAdd(true);
70
    };
71

    
72
    const hideModal = () => {
73
        fetchData();
74
        setVisibleAdd(false);
75
        setVisibleAssign(false);
76
    };
77

    
78
    const columns = [
79
        {
80
            title: 'Název dokumentu',
81
            dataIndex: 'name',
82
            key: 'name',
83
        },
84
        {
85
            title: 'Délka',
86
            dataIndex: 'length',
87
            key: 'length',
88
        },
89
        {
90
            title: 'Anotátoři',
91
            dataIndex: 'annotatingUsers',
92
            key: 'annotatingUsers',
93
            render: (
94
                columnData: DocumentUserInfo[],
95
                record: DocumentListInfo,
96
                index: number
97
            ) => {
98
                return (
99
                    <div>
100
                        {columnData.map((e) => (
101
                            <span
102
                                key={e.username + '.' + record.id}
103
                                title={getUserInfoAlt(e) + '\nStav: ' + e.state}
104
                                style={{
105
                                    color: getAnnotationStateColor(e.state),
106
                                    padding: 3,
107
                                }}
108
                                className={'me-3'}
109
                            >
110
                                <FontAwesomeIcon
111
                                    icon={faUser}
112
                                    title={getUserInfoAlt(e)}
113
                                    className={'me-2'}
114
                                />
115
                                {getNameTruncated(e)}
116
                            </span>
117
                        ))}
118
                    </div>
119
                );
120
            },
121
        },
122
    ];
123

    
124
    const rowSelection = {
125
        onChange: (selectedRowKeys: React.Key[], selectedRows: DocumentListInfo[]) => {
126
            // @ts-ignore
127
            setSelectedDocs(selectedRows.map((row) => row.id));
128
        },
129
    };
130

    
131
    return redirecting || role !== 'ADMINISTRATOR' ? null : (
132
        <MainLayout>
133
            <Typography.Title level={2}>
134
                <FontAwesomeIcon icon={faFileLines} /> Dokumenty
135
            </Typography.Title>
136
            <Button type={'primary'} onClick={showAddModal}>
137
                Nahrát dokument
138
            </Button>
139
            <Button onClick={showAssignModal}>Přiřadit dokumenty</Button>
140
            {visibleAdd && <AddDocumentModal onCancel={hideModal} />}
141
            {visibleAssign && (
142
                <AssignDocumentModal documentsIds={selectedDocs} onCancel={hideModal} />
143
            )}
144

    
145
            <Table
146
                rowSelection={{
147
                    type: 'checkbox',
148
                    ...rowSelection,
149
                }}
150
                columns={columns}
151
                dataSource={documents}
152
                size="middle"
153
                scroll={{ y: 600 }}
154
            />
155
        </MainLayout>
156
    );
157
}
158

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