浏览代码

cleaver start mokup

amenpunk 2 年之前
父节点
当前提交
8091680dbe
共有 6 个文件被更改,包括 442 次插入184 次删除
  1. 7 0
      src/App.css
  2. 74 0
      src/Components/Test/Cleaver/Question.jsx
  3. 85 0
      src/Components/Test/Cleaver/Response.jsx
  4. 163 159
      src/Pages/Logincs.jsx
  5. 42 25
      src/Pages/Prueba.jsx
  6. 71 0
      src/Pages/Pruebas/Cleaver.jsx

+ 7 - 0
src/App.css

@@ -299,4 +299,11 @@
299 299
   align-content: space-around;
300 300
 }
301 301
 
302
+.quiz_title_text{
303
+  display: flex;
304
+  flex-direction: row;
305
+  flex-wrap: nowrap;
306
+  align-items: baseline !important;
307
+  justify-content: flex-start;
308
+}
302 309
 

+ 74 - 0
src/Components/Test/Cleaver/Question.jsx

@@ -0,0 +1,74 @@
1
+import * as React from 'react';
2
+import Box from '@mui/material/Box';
3
+import Card from '@mui/material/Card';
4
+import CardActions from '@mui/material/CardActions';
5
+import CardContent from '@mui/material/CardContent';
6
+import Button from '@mui/material/Button';
7
+import Typography from '@mui/material/Typography';
8
+import Avatar from '@mui/material/Avatar';
9
+// import Stack from '@mui/material/Stack';
10
+// import Radio from '@mui/material/Radio';
11
+import RadioGroup from '@mui/material/RadioGroup';
12
+import FormControlLabel from '@mui/material/FormControlLabel';
13
+import FormControl from '@mui/material/FormControl';
14
+import FormLabel from '@mui/material/FormLabel';
15
+import Checkbox from '@mui/material/Checkbox';
16
+import { deepPurple } from '@mui/material/colors';
17
+const label = { inputProps: { 'aria-label': 'Checkbox demo' } };
18
+
19
+
20
+function Radio() {
21
+  return(
22
+    <div>
23
+    <Checkbox {...label} defaultChecked />
24
+      <Checkbox {...label} />
25
+    </div>
26
+  )
27
+}
28
+
29
+
30
+function Response ({resp}) {
31
+  return (
32
+    <FormControl>
33
+      <RadioGroup
34
+        aria-labelledby="demo-radio-buttons-group-label"
35
+        defaultValue="female"
36
+        name="radio-buttons-group"
37
+      >
38
+        {
39
+        resp.map(a => <FormControlLabel value="female" control={<Radio />} label={a.nombre} />)
40
+        }
41
+      </RadioGroup>
42
+    </FormControl>
43
+  )
44
+}
45
+
46
+export function Question({ quiz }) {
47
+  let { instrucciondepregunta, id, respuestas } = quiz
48
+  return (
49
+    <Card sx={{ minWidth: 275, margin: 5 }}>
50
+      <CardContent>
51
+
52
+        <Typography sx={{ fontSize: 17 }} color="text.secondary" gutterBottom>
53
+          <div className="quiz_title_text">
54
+            <Avatar sx={{ bgcolor: deepPurple[500] }}>{id}</Avatar>
55
+            <p style={{ paddingLeft: 15 }}>
56
+              {instrucciondepregunta}
57
+            </p>
58
+          </div>
59
+        </Typography>
60
+
61
+
62
+        <Typography variant="body2">
63
+          <Response resp={respuestas}/>
64
+        </Typography>
65
+
66
+      </CardContent>
67
+
68
+      <CardActions>
69
+        <Button size="small">Learn More</Button>
70
+      </CardActions>
71
+
72
+    </Card>
73
+  );
74
+}

+ 85 - 0
src/Components/Test/Cleaver/Response.jsx

@@ -0,0 +1,85 @@
1
+import * as React from 'react';
2
+import Box from '@mui/material/Box';
3
+import FormLabel from '@mui/material/FormLabel';
4
+import FormControl from '@mui/material/FormControl';
5
+import FormGroup from '@mui/material/FormGroup';
6
+import FormControlLabel from '@mui/material/FormControlLabel';
7
+import FormHelperText from '@mui/material/FormHelperText';
8
+import Checkbox from '@mui/material/Checkbox';
9
+
10
+export function Radios() {
11
+  const [state, setState] = React.useState({
12
+    gilad: true,
13
+    jason: false,
14
+    antoine: false,
15
+  });
16
+
17
+  const handleChange = (event) => {
18
+    setState({
19
+      ...state,
20
+      [event.target.name]: event.target.checked,
21
+    });
22
+  };
23
+
24
+  const { gilad, jason, antoine } = state;
25
+  const error = [gilad, jason, antoine].filter((v) => v).length !== 2;
26
+
27
+  return (
28
+    <Box sx={{ display: 'flex' }}>
29
+      <FormControl sx={{ m: 3 }} component="fieldset" variant="standard">
30
+        <FormLabel component="legend">Assign responsibility</FormLabel>
31
+        <FormGroup>
32
+          <FormControlLabel
33
+            control={
34
+              <Checkbox checked={gilad} onChange={handleChange} name="gilad" />
35
+            }
36
+            label="Gilad Gray"
37
+          />
38
+          <FormControlLabel
39
+            control={
40
+              <Checkbox checked={jason} onChange={handleChange} name="jason" />
41
+            }
42
+            label="Jason Killian"
43
+          />
44
+          <FormControlLabel
45
+            control={
46
+              <Checkbox checked={antoine} onChange={handleChange} name="antoine" />
47
+            }
48
+            label="Antoine Llorca"
49
+          />
50
+        </FormGroup>
51
+        <FormHelperText>Be careful</FormHelperText>
52
+      </FormControl>
53
+      <FormControl
54
+        required
55
+        error={error}
56
+        component="fieldset"
57
+        sx={{ m: 3 }}
58
+        variant="standard"
59
+      >
60
+        <FormLabel component="legend">Pick two</FormLabel>
61
+        <FormGroup>
62
+          <FormControlLabel
63
+            control={
64
+              <Checkbox checked={gilad} onChange={handleChange} name="gilad" />
65
+            }
66
+            label="Gilad Gray"
67
+          />
68
+          <FormControlLabel
69
+            control={
70
+              <Checkbox checked={jason} onChange={handleChange} name="jason" />
71
+            }
72
+            label="Jason Killian"
73
+          />
74
+          <FormControlLabel
75
+            control={
76
+              <Checkbox checked={antoine} onChange={handleChange} name="antoine" />
77
+            }
78
+            label="Antoine Llorca"
79
+          />
80
+        </FormGroup>
81
+        <FormHelperText>You can display an error</FormHelperText>
82
+      </FormControl>
83
+    </Box>
84
+  );
85
+}

+ 163 - 159
src/Pages/Logincs.jsx

@@ -4,9 +4,9 @@ import { useNavigate } from 'react-router-dom'
4 4
 import jwt_decode from "jwt-decode";
5 5
 
6 6
 import {
7
-    Paper, Box, Grid, Typography,
8
-    TextField, Button, Avatar,
9
-    Backdrop, CircularProgress,
7
+  Paper, Box, Grid, Typography,
8
+  TextField, Button, Avatar,
9
+  Backdrop, CircularProgress,
10 10
 } from '@mui/material'
11 11
 
12 12
 import { createTheme, ThemeProvider } from '@mui/material/styles';
@@ -23,166 +23,170 @@ import * as Yup from 'yup';
23 23
 import { Service } from '../Utils/HTTP.js'
24 24
 
25 25
 const LoginSchema = Yup.object().shape({
26
-    email: Yup
27
-        .string()
28
-        .email('El correo debe ser válido')
29
-        .required('El correo o usuario es requerido'),
30
-    password: Yup
31
-        .string()
32
-        .required('El campo contraseña es requerido')
33
-        .min(5, 'La contraseña debe contener mínimo 5 caracteres')
26
+  email: Yup
27
+    .string()
28
+    .email('El correo debe ser válido')
29
+    .required('El correo o usuario es requerido'),
30
+  password: Yup
31
+    .string()
32
+    .required('El campo contraseña es requerido')
33
+    .min(5, 'La contraseña debe contener mínimo 5 caracteres')
34 34
 })
35 35
 
36 36
 const theme = createTheme();
37 37
 
38 38
 export function LoginCs() {
39 39
 
40
-    let auth = useAuth();
41
-    let navigate = useNavigate()
42
-
43
-    const [open, setOpen] = React.useState(false);
44
-    const handleClose = () => false
45
-
46
-    const formik = useFormik({
47
-        initialValues: {
48
-            email: '',
49
-            password: '',
50
-        },
51
-        validationSchema: LoginSchema,
52
-        onSubmit: async (values) => {
53
-
54
-            //
55
-            // QW5hbGlzdGEgZGUgY29tcHJhcw==
56
-            //
57
-            
58
-            let { email, password } = values
59
-            setOpen(true)
60
-
61
-            let request = new Service(`/user?user=${email}&password=${password}&typeusr=iscandidato`)
62
-            request
63
-                .post({})
64
-                .then(response => {
65
-
66
-                    console.log("Service Response :: ", response)
67
-                    let { token, nombre, apelidos, id : pass_id} = response;
68
-                    toast.success(`Bienvenido ${nombre} ${apelidos}!!`)
69
-                    token = token.replace("Bearer ", "")
70
-                    console.log(token);
71
-
72
-                    // let { exp } = jwt_decode(token);
73
-                    let body_token = jwt_decode(token);
74
-                    body_token['pass'] = password;
75
-                    body_token['passid'] = pass_id;
76
-                    console.log("BODY TOKEN: ", body_token)
77
-                    // let timestamp = exp * 1000;
78
-                    // let restante = timestamp - Date.now();
79
-
80
-                    // setTimeout(() => alert("Token Expirado"), restante)
81
-                    auth.setProfile({
82
-                        email, password
83
-                    })
84
-                    auth.setRole(body_token)
85
-
86
-                    setTimeout(() => {
87
-                        setOpen(false)
88
-                        auth.login(token)
89
-                    }, 2000)
90
-
91
-                })
92
-                .catch(err => {
93
-                    setOpen(false)
94
-                    toast.error("Ups! usuario o contraseña incorrectos")
95
-                    console.log("ERROR ", err)
96
-                })
97
-
98
-        },
99
-    });
100
-
101
-    React.useEffect(() => {
102
-        if(auth.isLogged()){
103
-            return navigate('/user/home')
104
-        }
105
-    }, [auth,navigate])
106
-
107
-    return (
108
-        <ThemeProvider theme={theme}>
109
-            <Grid container component="main" sx={{ height: '100vh' }}>
110
-                <Grid item xs={12} sm={12} md={12} component={Paper} elevation={6} square>
111
-
112
-                    <Box
113
-                        sx={{
114
-                            my: 8,
115
-                            mx: 4,
116
-                            marginTop:25,
117
-                            display: 'flex',
118
-                            flexDirection: 'column',
119
-                            // alignItems:true?'flex-start': 'center',
120
-                            alignItems:'center'
121
-                        }}
122
-                    >
123
-                        <Avatar sx={{ m: 1, bgcolor: 'var(--second)' }}>
124
-                            <PersonIcon />
125
-                        </Avatar>
126
-                        <Typography component="h1" variant="h5">
127
-                            Ingresar
128
-                        </Typography>
129
-
130
-                        <Box component="form" noValidate onSubmit={formik.handleSubmit} sx={{ mt: 1 }}>
131
-                            <TextField
132
-                                value={formik.values.email}
133
-                                onChange={formik.handleChange}
134
-                                error={formik.touched.email && Boolean(formik.errors.email)}
135
-                                helperText={formik.touched.email && formik.errors.email}
136
-                                margin="normal"
137
-                                required
138
-                                fullWidth
139
-                                id="email"
140
-                                name="email"
141
-                                label="Correo Electrónico"
142
-                                autoComplete="email"
143
-                                autoFocus
144
-                            />
145
-                            <TextField
146
-                                value={formik.values.password}
147
-                                onChange={formik.handleChange}
148
-                                error={formik.touched.password && Boolean(formik.errors.password)}
149
-                                helperText={formik.touched.password && formik.errors.password}
150
-                                margin="normal"
151
-                                required
152
-                                fullWidth
153
-                                label="Contraseña"
154
-                                name="password"
155
-                                type="password"
156
-                                id="password"
157
-                                autoComplete="current-password"
158
-                            />
159
-                            <Button
160
-                                id="login_btn_fn"
161
-                                type="submit"
162
-                                fullWidth
163
-                                variant="contained"
164
-                                sx={{ mt: 3, mb: 2, bgcolor: 'var(--second)' }}
165
-                            >
166
-                                Ingresar
167
-                            </Button>
168
-                            <Copyright sx={{ mt: 5 }} />
169
-                        </Box>
170
-                    </Box>
171
-                </Grid>
172
-            </Grid>
173
-            <Toaster
174
-                position="top-left"
175
-                reverseOrder={false}
176
-            />
177
-            <Backdrop
178
-                sx={{ color: '#fd4b4b', zIndex: (theme) => theme.zIndex.drawer + 1 }}
179
-                open={open}
180
-                onClick={handleClose}
181
-            >
182
-                <CircularProgress color="inherit" />
183
-            </Backdrop>
184
-
185
-        </ThemeProvider>
186
-
187
-    );
40
+  let auth = useAuth();
41
+  let navigate = useNavigate()
42
+
43
+  const [open, setOpen] = React.useState(false);
44
+  const handleClose = () => false
45
+
46
+  const formik = useFormik({
47
+    initialValues: {
48
+      email: '',
49
+      password: '',
50
+    },
51
+    validationSchema: LoginSchema,
52
+    onSubmit: async (values) => {
53
+
54
+      //
55
+      // QW5hbGlzdGEgZGUgY29tcHJhcw==
56
+      //
57
+
58
+      let { email, password } = values
59
+      setOpen(true)
60
+
61
+      let request = new Service(`/user?user=${email}&password=${password}&typeusr=iscandidato`)
62
+      request
63
+        .post({})
64
+        .then(response => {
65
+
66
+          console.log("Service Response :: ", response)
67
+          let { token, nombre, apelidos, id: pass_id } = response;
68
+          toast.success(`Bienvenido ${nombre} ${apelidos}!!`)
69
+          token = token.replace("Bearer ", "")
70
+          console.log(token);
71
+
72
+          // let { exp } = jwt_decode(token);
73
+          let body_token = jwt_decode(token);
74
+          body_token['pass'] = password;
75
+          body_token['passid'] = pass_id;
76
+          console.log("BODY TOKEN: ", body_token)
77
+          // let timestamp = exp * 1000;
78
+          // let restante = timestamp - Date.now();
79
+
80
+          // setTimeout(() => alert("Token Expirado"), restante)
81
+          auth.setProfile({
82
+            email,
83
+            password,
84
+            passid: pass_id,
85
+            pass: password,
86
+            assingid: 'ok'
87
+          })
88
+          auth.setRole(body_token)
89
+
90
+          setTimeout(() => {
91
+            setOpen(false)
92
+            auth.login(token)
93
+          }, 2000)
94
+
95
+        })
96
+        .catch(err => {
97
+          setOpen(false)
98
+          toast.error("Ups! usuario o contraseña incorrectos")
99
+          console.log("ERROR ", err)
100
+        })
101
+
102
+    },
103
+  });
104
+
105
+  React.useEffect(() => {
106
+    if (auth.isLogged()) {
107
+      return navigate('/user/home')
108
+    }
109
+  }, [auth, navigate])
110
+
111
+  return (
112
+    <ThemeProvider theme={theme}>
113
+      <Grid container component="main" sx={{ height: '100vh' }}>
114
+        <Grid item xs={12} sm={12} md={12} component={Paper} elevation={6} square>
115
+
116
+          <Box
117
+            sx={{
118
+              my: 8,
119
+              mx: 4,
120
+              marginTop: 25,
121
+              display: 'flex',
122
+              flexDirection: 'column',
123
+              // alignItems:true?'flex-start': 'center',
124
+              alignItems: 'center'
125
+            }}
126
+          >
127
+            <Avatar sx={{ m: 1, bgcolor: 'var(--second)' }}>
128
+              <PersonIcon />
129
+            </Avatar>
130
+            <Typography component="h1" variant="h5">
131
+              Ingresar
132
+            </Typography>
133
+
134
+            <Box component="form" noValidate onSubmit={formik.handleSubmit} sx={{ mt: 1 }}>
135
+              <TextField
136
+                value={formik.values.email}
137
+                onChange={formik.handleChange}
138
+                error={formik.touched.email && Boolean(formik.errors.email)}
139
+                helperText={formik.touched.email && formik.errors.email}
140
+                margin="normal"
141
+                required
142
+                fullWidth
143
+                id="email"
144
+                name="email"
145
+                label="Correo Electrónico"
146
+                autoComplete="email"
147
+                autoFocus
148
+              />
149
+              <TextField
150
+                value={formik.values.password}
151
+                onChange={formik.handleChange}
152
+                error={formik.touched.password && Boolean(formik.errors.password)}
153
+                helperText={formik.touched.password && formik.errors.password}
154
+                margin="normal"
155
+                required
156
+                fullWidth
157
+                label="Contraseña"
158
+                name="password"
159
+                type="password"
160
+                id="password"
161
+                autoComplete="current-password"
162
+              />
163
+              <Button
164
+                id="login_btn_fn"
165
+                type="submit"
166
+                fullWidth
167
+                variant="contained"
168
+                sx={{ mt: 3, mb: 2, bgcolor: 'var(--second)' }}
169
+              >
170
+                Ingresar
171
+              </Button>
172
+              <Copyright sx={{ mt: 5 }} />
173
+            </Box>
174
+          </Box>
175
+        </Grid>
176
+      </Grid>
177
+      <Toaster
178
+        position="top-left"
179
+        reverseOrder={false}
180
+      />
181
+      <Backdrop
182
+        sx={{ color: '#fd4b4b', zIndex: (theme) => theme.zIndex.drawer + 1 }}
183
+        open={open}
184
+        onClick={handleClose}
185
+      >
186
+        <CircularProgress color="inherit" />
187
+      </Backdrop>
188
+
189
+    </ThemeProvider>
190
+
191
+  );
188 192
 }

+ 42 - 25
src/Pages/Prueba.jsx

@@ -1,49 +1,62 @@
1 1
 import React, { useMemo, useState } from 'react';
2
-import { useParams } from 'react-router-dom'
3 2
 import { Service } from '../Utils/HTTP'
4
-import useAuth from '../Auth/useAuth.js';
5 3
 import { Box, Paper, Divider, Typography, Button } from '@mui/material'
6 4
 
5
+import toast, { Toaster } from 'react-hot-toast';
6
+import { useParams } from 'react-router-dom'
7
+import useAuth from '../Auth/useAuth.js';
8
+import { Cleaver } from './Pruebas/Cleaver';
9
+
7 10
 export function Prueba() {
8 11
 
9 12
   let { id } = useParams();
10 13
   let auth = useAuth();
11
-  let token = useMemo(() => auth.getToken())
14
+  let token = useMemo(() => auth.getToken(), [auth])
12 15
   let [data, setData] = useState({});
16
+  // let profile = auth.getProfile();
17
+  let [profile, setProfile] = useState(auth.getProfile)
13 18
 
14 19
   useState(() => {
15 20
     let rest = new Service(`/prueba/findid/${id}`)
16
-    rest.get(token)
17
-      .then(resp => setData(resp.data))
18
-      .catch( _e => setData({}))
21
+    rest.get(token.toString())
22
+      .then(resp => { 
23
+          setData(resp.data)
24
+        })
25
+      .catch(_e => setData({}))
19 26
   }, [id])
20 27
 
21 28
   const CreateAssign = () => {
29
+
22 30
     let now = new Date().toISOString();
23
-    let user = auth.getProfile();
24 31
     let body = {
25 32
       "id": -1,
26 33
       "fechaasignacio": now,
27
-      "fechafinexamen": now, 
34
+      "fechafinexamen": now,
28 35
       "estado": "1",
29
-      "score" : "0",
30
-      "mensaje" : "0",
31
-      "mensaje2" : "0",
32
-      "idcontrasenia": user.passid,
36
+      "score": "0",
37
+      "mensaje": "0",
38
+      "mensaje2": "0",
39
+      "idcontrasenia": profile.passid,
33 40
       "nombre": "assing CLEVAERR"
34 41
 
35 42
     }
36
-    let rest = new Service("/prueba/asignacion");
37
-    rest.postQuery(body,token)
38
-      .then( ({ data: resp }) => {
39
-        let { id : assingid } = resp
40
-        let profile = auth.getProfile();
41 43
 
42
-        auth.setProfile({
43
-          ...profile, assingid
44
-        })
44
+    let rest = new Service("/prueba/asignacion");
45
+    rest.postQuery(body, token)
46
+      .then(({ data: resp }) => {
47
+        let { id: assingid } = resp
48
+        toast.success("Asignación creada: ", assingid)
49
+        let new_profile = { ...profile, assingid }
50
+        auth.setProfile(new_profile)
51
+        setProfile(new_profile)
45 52
       })
46
-      .catch(console.log)
53
+      .catch(() => {
54
+        toast.error("Error al crear la asignación")
55
+      })
56
+  }
57
+
58
+  if(profile.assingid){
59
+    return <Cleaver/>
47 60
   }
48 61
 
49 62
   return (
@@ -51,13 +64,17 @@ export function Prueba() {
51 64
       <div className="main">
52 65
         <Box >
53 66
           <Paper className="prueba_body" elevation={1}>
54
-            <h1>{data.nombre}</h1>
55
-            <Divider/>
56
-            <Typography style={{marginTop:15, textAlign: 'center'}}>{data.decription}</Typography>
57
-            <Divider style={{marginTop:15}}/>
67
+            <h1>{data?.nombre}</h1>
68
+            <Divider />
69
+            <Typography style={{ marginTop: 15, textAlign: 'center' }}>{data?.decription}</Typography>
70
+            <Divider style={{ marginTop: 15 }} />
58 71
             <Button onClick={CreateAssign}>Inicar Prueba</Button>
59 72
           </Paper>
60 73
         </Box>
74
+        <Toaster
75
+          position="top-left"
76
+          reverseOrder={false}
77
+        />
61 78
       </div>
62 79
     </div>
63 80
   );

+ 71 - 0
src/Pages/Pruebas/Cleaver.jsx

@@ -0,0 +1,71 @@
1
+import React, { useMemo} from 'react'
2
+import {
3
+  Box, 
4
+  // Paper,
5
+  LinearProgress
6
+} from '@mui/material'
7
+
8
+import { Service } from '../../Utils/HTTP'
9
+import useAuth from '../../Auth/useAuth.js';
10
+import {Question} from '../../Components/Test/Cleaver/Question.jsx'
11
+
12
+
13
+export function Cleaver() {
14
+
15
+  let auth = useAuth();
16
+  let token = useMemo(() => auth.getToken(), [auth])
17
+
18
+  const [progress, setProgress] = React.useState(0);
19
+  const [questions, setQuestions] = React.useState([]);
20
+  const [buffer, setBuffer] = React.useState(10);
21
+
22
+  const progressRef = React.useRef(() => {});
23
+
24
+  React.useEffect(() => {
25
+
26
+    let rest = new Service(`/prueba/findid/1`)
27
+    rest.get(token.toString())
28
+      .then(({data}) => { 
29
+        console.log("RESP: ", data)
30
+        setQuestions(data.questions)
31
+      })
32
+      .catch( e => console.log("ERROR: ", e))
33
+
34
+    const timer = setInterval(() => {
35
+      progressRef.current();
36
+    }, 500);
37
+
38
+    return () => {
39
+      clearInterval(timer);
40
+    };
41
+  }, []);
42
+
43
+
44
+  React.useEffect(() => {
45
+    progressRef.current = () => {
46
+      if (progress > 100) {
47
+        setProgress(0);
48
+        setBuffer(10);
49
+      } else {
50
+        const diff = Math.random() * 10;
51
+        const diff2 = Math.random() * 10;
52
+        setProgress(progress + diff);
53
+        setBuffer(progress + diff + diff2);
54
+      }
55
+    };
56
+  });
57
+
58
+  return (
59
+    <div className="content-section">
60
+      <div className="main">
61
+        <Box sx={{ width: '100%' , magin : 5}}>
62
+          <LinearProgress style={{ margin : 5}} variant="buffer" value={progress} valueBuffer={buffer} />
63
+        </Box>
64
+        {
65
+        questions.map( e => (<Question key={e.id} quiz={e}/>) )
66
+      }
67
+      </div>
68
+    </div>
69
+  )
70
+
71
+}