Projekt

Obecné

Profil

Stáhnout (5.4 KB) Statistiky
| Větev: | Tag: | Revize:
1
import {
2
    Button,
3
    Grid,
4
    Checkbox,
5
    Paper,
6
    Typography,
7
    FormGroup,
8
    FormControlLabel, Container
9
} from '@mui/material'
10
import React, {Fragment, useEffect, useState} from 'react'
11
import axiosInstance from "../../api/api"
12
import 'react-quill/dist/quill.snow.css'
13
import {PermissionDto, UserDto} from "../../swagger/data-contracts"
14
import ClearIcon from "@mui/icons-material/Clear"
15
import CheckIcon from '@mui/icons-material/Check';
16
import {useDispatch, useSelector} from "react-redux"
17
import {fetchUsers, savePermissions} from "./userDetailThunks"
18
import {RootState} from "../redux/store"
19
import {setSelectedUserPermissions} from "./userDetailSlice"
20

    
21
export interface UserDetailProps {
22
    user: UserDto,
23
    onClose: () => void
24
}
25

    
26
const UserDetail = (props: UserDetailProps) => {
27
    const selectedUser = useSelector((state: RootState) => state.usersDetail.selectedUser)
28
    const [canRead, setCanRead] = useState(selectedUser?.permissions?.canRead)
29
    const [canWrite, setCanWrite] = useState(selectedUser?.permissions?.canWrite)
30
    const [canDelete, setCanDelete] = useState(selectedUser?.permissions?.canDelete)
31

    
32
    const dispatch = useDispatch()
33

    
34
    useEffect(()=> {
35
        console.log("user updated:")
36
        setCanRead(selectedUser?.permissions?.canRead)
37
        setCanWrite(selectedUser?.permissions?.canWrite)
38
        setCanDelete(selectedUser?.permissions?.canDelete)
39
    }, [selectedUser]);
40

    
41
    // Maps user property to corresponding table row
42
    const mapToRow = (rowName: string, item: string) => (
43
        <Fragment>
44
            <Grid sx={{my: 2}} container justifyContent="space-around">
45
                <Grid item xs={6} sx={{px: 1}}>
46
                    <Typography fontWeight={500}>{rowName}</Typography>
47
                </Grid>
48
                <Grid item xs={6} sx={{ml: 'auto'}}>
49
                    <Typography key={item}>{item}</Typography>
50
                </Grid>
51
            </Grid>
52
        </Fragment>
53
    )
54

    
55
    const rows = [
56
        {
57
            rowName: 'Name:',
58
            item: [props.user?.name],
59
        },
60
        {
61
            rowName: 'E-mail:',
62
            item: selectedUser?.email,
63
        }
64
    ]
65
    const rights = {
66
        canWrite: 'Add and edit locations',
67
        canDelete: 'Delete locations',
68
        canRead: 'Access to tracking tool',
69
    }
70

    
71

    
72
    const deleteUser = async () => {
73
        const { data, status } = await axiosInstance.delete(
74
            `/users/${selectedUser?.email}`
75
        )
76
        if (status !== 200) {
77
            // TODO dodělat zpracování erroru
78
            return
79
        }
80
        props.onClose();
81
    }
82

    
83
    const prepareSavePermissions = () => {
84
        dispatch(setSelectedUserPermissions({canRead: canRead, canWrite: canWrite, canDelete: canDelete}))
85
        dispatch(savePermissions())
86
        dispatch(fetchUsers())
87
    }
88

    
89
    return (
90
        <Fragment>
91
            <Paper style={{minHeight: '80vh'}} variant="outlined">
92
                <Grid container justifyContent="space-around">
93
                    <Grid item xs={12} md={6} sx={{p: 2}}>
94
                        <Typography fontWeight={800}>Information</Typography>
95
                        {rows.map((row) => (
96

    
97
                            <Fragment>
98
                                {mapToRow(
99
                                    row.rowName as string,
100
                                    row.item as string
101
                                )}
102
                            </Fragment>
103
                        ))}
104
                    </Grid>
105
                    <Grid item xs={12} md={6} sx={{p: 2}}>
106
                        <Typography fontWeight={800}>Rights</Typography>
107
                        <FormGroup>
108
                            <FormControlLabel
109
                                control={
110
                                    <Checkbox
111
                                        checked={canWrite}
112
                                        onChange={e => setCanWrite(e.target.checked)}
113
                                    />}
114
                                label={rights.canWrite}/>
115
                            <FormControlLabel
116
                                control={
117
                                    <Checkbox
118
                                        checked={canRead}
119
                                        onChange={e => setCanRead(e.target.checked)}
120
                                    />}
121
                                label={rights.canRead}/>
122
                            <FormControlLabel
123
                                control={
124
                                    <Checkbox
125
                                        checked={canDelete}
126
                                        onChange={e => setCanDelete(e.target.checked)}
127
                                    />}
128
                                label={rights.canDelete}/>
129
                        </FormGroup>
130
                    </Grid>
131
                </Grid>
132
                <Button startIcon={<CheckIcon />}
133
                        variant="contained"
134
                        color="primary"
135
                        onClick={prepareSavePermissions}
136
                        sx={{ m: 2 }} >
137
                    Save
138
                </Button>
139
                <Button startIcon={<ClearIcon />}
140
                        variant="contained"
141
                        color="primary"
142
                        onClick={deleteUser}
143
                        sx={{ m: 2 }} >
144
                    Delete
145
                </Button>
146
            </Paper>
147
        </Fragment>
148
    )
149
}
150

    
151
export default UserDetail
(2-2/4)