|
1 | | -import React from 'react' |
2 | | -import { useParams } from "react-router-dom" |
| 1 | +import React, { useState } from 'react' |
| 2 | +import { Link, useParams, useNavigate } from "react-router-dom" |
3 | 3 |
|
4 | | -import { useGetExam, useGetCurriculum } from '../modules/engine' |
| 4 | +import { useGetExam, useGetCurriculum, useDeleteCurriculum } from '../modules/engine' |
5 | 5 | import Card from '../components/Card' |
6 | 6 | import LoadingMessage from '../components/LoadingMessage' |
7 | 7 | import { displayAcademicYears } from '../modules/utils' |
| 8 | +import { useEngine } from '../modules/engine' |
| 9 | + |
| 10 | +export default function CurriculumPage() { |
| 11 | + const { id } = useParams() |
| 12 | + const query = useGetCurriculum(id || '') |
| 13 | + const deleter = useDeleteCurriculum(id || '') |
| 14 | + const engine = useEngine() |
| 15 | + const navigate = useNavigate() |
| 16 | + |
| 17 | + const curriculum = query.data |
| 18 | + |
| 19 | + if (query.isError) return <div>errore caricamento curriculum</div> |
| 20 | + if (query.isLoading || !curriculum) return <LoadingMessage>caricamento curriculum...</LoadingMessage> |
| 21 | + |
| 22 | + const degree = curriculum.degree |
| 23 | + |
| 24 | + return <> |
| 25 | + <h1>{ curriculum.name }</h1> |
| 26 | + <Card> |
| 27 | + <div className="d-flex mb-2"> |
| 28 | + <Link to="/degrees"> |
| 29 | + <button type="button" className="btn btn-sm mr-2 btn-primary"> |
| 30 | + <i className="fas fa-arrow-left mr-2"></i> |
| 31 | + Tutti i curricula |
| 32 | + </button> |
| 33 | + </Link> |
| 34 | + <a href={`/curricula/edit/${id}`}> |
| 35 | + <button type="button" className="btn btn-sm mr-2 btn-primary"> |
| 36 | + Modifica |
| 37 | + </button> |
| 38 | + </a> |
| 39 | + <a href="#" onClick={ () => deleteCurriculum() }> |
| 40 | + <button type="button" className="btn btn-sm mr-2 btn-danger">Elimina</button> |
| 41 | + </a> |
| 42 | + |
| 43 | + <div className="flex-fill"></div> |
| 44 | + |
| 45 | + <div className="btn btn-sm btn-primary mr-2" > |
| 46 | + <i className="fas fa-download mr-2"></i> Esporta in CSV |
| 47 | + </div> |
| 48 | + </div> |
| 49 | + </Card> |
| 50 | + <h3>{ degree?.name } { degree.academic_year ? displayAcademicYears(degree.academic_year) : '????-????'}</h3> |
| 51 | + { curriculum.years.map((year_section, year_count) => |
| 52 | + <Card key={`year-${year_count}`} title={`${ordinal(year_count+1)} anno`}> |
| 53 | + Crediti: { `${year_section.credits}` } <br /> |
| 54 | + <table> |
| 55 | + <tbody> |
| 56 | + { year_section.exams.map((entry,i) => <ExamEntry key={i} entry={entry} />)} |
| 57 | + </tbody> |
| 58 | + </table> |
| 59 | + </Card> |
| 60 | + )} |
| 61 | + </> |
| 62 | + |
| 63 | + function deleteCurriculum() { |
| 64 | + if (!confirm("Sei sicuro di voler cancellare questo curriculum?")) |
| 65 | + return false; |
| 66 | + |
| 67 | + debugger |
| 68 | + |
| 69 | + deleter.mutate(id, { |
| 70 | + onSuccess: () => { |
| 71 | + console.log("Curriculum cancellato con successo") |
| 72 | + engine.flashSuccess("Curriculum cancellato con successo") |
| 73 | + navigate('/curricula') |
| 74 | + }, |
| 75 | + onError: (err) => { |
| 76 | + console.error("Errore durante la cancellazione del curriculum", err) |
| 77 | + engine.flashError(`${err}`) |
| 78 | + } |
| 79 | + }) |
| 80 | + } |
| 81 | + |
| 82 | + |
| 83 | +} |
8 | 84 |
|
9 | | -const degree_path = "/degrees/" |
10 | 85 |
|
11 | 86 | function CompulsoryExam({ exam_id }) { |
12 | 87 | const query = useGetExam(exam_id); |
@@ -45,34 +120,6 @@ function ExamEntry({ entry }) { |
45 | 120 | else return <tr><td>???</td></tr> |
46 | 121 | } |
47 | 122 |
|
48 | | -export default function CurriculumPage() { |
49 | | - const { id } = useParams() |
50 | | - const query = useGetCurriculum(id || '') |
51 | | - const curriculum = query.data |
52 | | - |
53 | | - if (query.isError) return <div>errore caricamento curriculum</div> |
54 | | - if (!curriculum) return <LoadingMessage>caricamento curriculum...</LoadingMessage> |
55 | | - |
56 | | - const degree = curriculum.degree |
57 | | - |
58 | | - console.log(`curriculum: ${JSON.stringify(curriculum)}`) |
59 | | - |
60 | | - return <> |
61 | | - <h1>{ curriculum.name }</h1> |
62 | | - <h3>{ degree?.name } { degree.academic_year ? displayAcademicYears(degree.academic_year) : '????-????'}</h3> |
63 | | - { curriculum.years.map((year_section, year_count) => |
64 | | - <Card key={`year-${year_count}`} title={`${ordinal(year_count+1)} anno`}> |
65 | | - Crediti: { `${year_section.credits}` } <br /> |
66 | | - <table> |
67 | | - <tbody> |
68 | | - { year_section.exams.map((entry,i) => <ExamEntry key={i} entry={entry} />)} |
69 | | - </tbody> |
70 | | - </table> |
71 | | - </Card> |
72 | | - )} |
73 | | - </> |
74 | | -} |
75 | | - |
76 | 123 | function ordinal(n) { |
77 | 124 | const ordinals = [ "zero", |
78 | 125 | "primo", "secondo", "terzo", "quarto", "quinto", |
|
0 commit comments