Commit c869049314e3e00516e27dbcfd7af8f107b832ef

Authored by Miguel Barão
1 parent f3635fa0
Exists in master and in 1 other branch dev

upgrade to bootstrap 5.1

remove fontawesome and use bootstrap-icons instead
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 2
3 ## BUGS 3 ## BUGS
4 4
  5 +- review por nome e numero no cabecalho jumbotron
5 - talvez a base de dados devesse ter como chave do teste um id que fosse único 6 - talvez a base de dados devesse ter como chave do teste um id que fosse único
6 desse teste particular (não um auto counter, nem ref do teste) 7 desse teste particular (não um auto counter, nem ref do teste)
7 - em caso de timeout na submissão (e.g. JOBE ou script nao responde) a correcção 8 - em caso de timeout na submissão (e.g. JOBE ou script nao responde) a correcção
@@ -3,7 +3,8 @@ @@ -3,7 +3,8 @@
3 "email": "mjsb@uevora.pt", 3 "email": "mjsb@uevora.pt",
4 "dependencies": { 4 "dependencies": {
5 "@fortawesome/fontawesome-free": "^5.15.3", 5 "@fortawesome/fontawesome-free": "^5.15.3",
6 - "bootstrap": "^4.6.0", 6 + "bootstrap": "^5.1.0",
  7 + "bootstrap-icons": "^1.7.2",
7 "codemirror": "^5.61.1", 8 "codemirror": "^5.61.1",
8 "datatables": "^1.10", 9 "datatables": "^1.10",
9 "jquery": "^3.6.0", 10 "jquery": "^3.6.0",
perguntations/app.py
@@ -156,7 +156,7 @@ class App(): @@ -156,7 +156,7 @@ class App():
156 156
157 # ------------------------------------------------------------------------ 157 # ------------------------------------------------------------------------
158 async def set_password(self, uid: str, password: str) -> None: 158 async def set_password(self, uid: str, password: str) -> None:
159 - '''change password on the database''' 159 + '''change password in the database'''
160 with Session(self._engine, future=True) as session: 160 with Session(self._engine, future=True) as session:
161 query = select(Student).where(Student.id == uid) 161 query = select(Student).where(Student.id == uid)
162 student = session.execute(query).scalar_one() 162 student = session.execute(query).scalar_one()
perguntations/serve.py
@@ -327,7 +327,7 @@ class AdminHandler(BaseHandler): @@ -327,7 +327,7 @@ class AdminHandler(BaseHandler):
327 ''' 327 '''
328 cmd = self.get_body_argument('cmd', None) 328 cmd = self.get_body_argument('cmd', None)
329 value = self.get_body_argument('value', None) 329 value = self.get_body_argument('value', None)
330 - logger.debug('POST /admin (cmd=%s, value=%s)') 330 + logger.debug('POST /admin (cmd=%s, value=%s)', cmd, value)
331 331
332 if cmd == 'allow': 332 if cmd == 'allow':
333 self.testapp.allow_student(value) 333 self.testapp.allow_student(value)
@@ -338,7 +338,7 @@ class AdminHandler(BaseHandler): @@ -338,7 +338,7 @@ class AdminHandler(BaseHandler):
338 elif cmd == 'deny_all': 338 elif cmd == 'deny_all':
339 self.testapp.deny_all_students() 339 self.testapp.deny_all_students()
340 elif cmd == 'reset_password': 340 elif cmd == 'reset_password':
341 - await self.testapp.set_password(uid=value, pw='') 341 + await self.testapp.set_password(uid=value, password='')
342 elif cmd == 'insert_student' and value is not None: 342 elif cmd == 'insert_student' and value is not None:
343 student = json.loads(value) 343 student = json.loads(value)
344 await self.testapp.insert_new_student(uid=student['number'], 344 await self.testapp.insert_new_student(uid=student['number'],
perguntations/static/bootstrap-icons 0 → 120000
@@ -0,0 +1 @@ @@ -0,0 +1 @@
  1 +../../node_modules/bootstrap-icons
0 \ No newline at end of file 2 \ No newline at end of file
perguntations/templates/admin.html
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 <!-- Scripts --> 22 <!-- Scripts -->
23 <script src="/static/jquery/jquery.min.js"></script> 23 <script src="/static/jquery/jquery.min.js"></script>
24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> --> 24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
25 - <script defer src="/static/fontawesome-free/js/all.min.js"></script> 25 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script> 26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
27 <script defer src="/static/datatables/js/jquery.dataTables.min.js"></script> 27 <script defer src="/static/datatables/js/jquery.dataTables.min.js"></script>
28 <script defer src="/static/underscore/underscore-min.js"></script> 28 <script defer src="/static/underscore/underscore-min.js"></script>
@@ -31,80 +31,80 @@ @@ -31,80 +31,80 @@
31 </head> 31 </head>
32 <!-- ===================================================================== --> 32 <!-- ===================================================================== -->
33 <body> 33 <body>
34 -<nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">  
35 - <a class="navbar-brand" href="#">  
36 - <img src="/static/logo_horizontal.png" height="30" alt="">  
37 - </a>  
38 - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">  
39 - <span class="navbar-toggler-icon"></span>  
40 - </button>  
41 -  
42 - <div class="collapse navbar-collapse" id="navbarNavDropdown">  
43 - <!-- left -->  
44 - <span class="navbar-text mr-auto"></span>  
45 -  
46 - <!-- center -->  
47 - <span class="navbar-text mr-auto"><span id="clock"> --:-- </span></span>  
48 -  
49 - <!-- right -->  
50 - <ul class="navbar-nav">  
51 - <li class="nav-item dropdown">  
52 - <a class="nav-link dropdown-toggle active" href="#" id="navbarDropdownAluno" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">  
53 - Acções  
54 - </a>  
55 - <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownAluno">  
56 - <a class="dropdown-item" href="#" id="novo_aluno" data-toggle="modal" data-target="#novo_aluno_modal">Novo aluno...</a>  
57 - <a class="dropdown-item" href="#" id="reset_password_menu" data-toggle="modal" data-target="#reset_password_modal">Limpar password...</a>  
58 - <a class="dropdown-item" href="#" id="allow_all">Autorizar todos</a>  
59 - <a class="dropdown-item" href="#" id="deny_all">Desautorizar todos</a>  
60 - <div class="dropdown-divider"></div>  
61 - <a class="dropdown-item" href="/logout">Sair</a>  
62 - </div>  
63 - </li>  
64 - </ul>  
65 - </div>  
66 -</nav> 34 + <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">
  35 + <div class="container-fluid">
  36 + <a class="navbar-brand" href="#">
  37 + <img src="/static/logo_horizontal.png" height="30" alt="">
  38 + </a>
  39 + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
  40 + <span class="navbar-toggler-icon"></span>
  41 + </button>
  42 + <div class="collapse navbar-collapse" id="navbarNavDropdown">
  43 + <!-- left -->
  44 + <span class="navbar-text mr-auto"></span>
  45 +
  46 + <!-- center -->
  47 + <span class="navbar-text mr-auto"><span id="clock"> --:-- </span></span>
  48 +
  49 + <!-- right -->
  50 + <ul class="navbar-nav">
  51 + <li class="nav-item dropdown">
  52 + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownAluno" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  53 + Acções
  54 + </a>
  55 + <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownAluno">
  56 + <li><a class="dropdown-item" href="#" id="novo_aluno" data-bs-toggle="modal" data-bs-target="#novo_aluno_modal">Novo aluno...</a></li>
  57 + <li><a class="dropdown-item" href="#" id="reset_password_menu" data-bs-toggle="modal" data-bs-target="#reset_password_modal">Limpar password...</a></li>
  58 + <li><a class="dropdown-item" href="#" id="allow_all">Autorizar todos</a></li>
  59 + <li><a class="dropdown-item" href="#" id="deny_all">Desautorizar todos</a></li>
  60 + <li><hr class="dropdown-divider"></hr></li>
  61 + <li><a class="dropdown-item" href="/logout">Sair</a></li>
  62 + </ul>
  63 + </li>
  64 + </ul>
  65 + </div>
  66 + </div>
  67 + </nav>
67 <!-- ===================================================================== --> 68 <!-- ===================================================================== -->
68 -<div class="container-fluid">  
69 -  
70 - <div class="jumbotron">  
71 - <h3 id="title"></h3>  
72 - <p>  
73 - Referência: <code id="ref">--</code><br>  
74 - Ficheiro de configuração do teste: <code id="filename">--</code><br>  
75 - Directório com os testes entregues: <code id="answers_dir">--</code><br>  
76 - Base de dados: <code id="database">--</code><br>  
77 - </p>  
78 - <p>  
79 - <a href="/adminwebservice?cmd=testcsv" class="btn btn-primary">Obter CSV das notas</a>  
80 - <a href="/adminwebservice?cmd=questionscsv" class="btn btn-primary">Obter CSV detalhado</a>  
81 - </p>  
82 - </div> <!-- jumbotron -->  
83 -  
84 - <table class="table table-sm table-striped" style="width:100%" id="students_table">  
85 - <thead class="thead thead-light">  
86 - <tr>  
87 - <th>#</th>  
88 - <th>Ok</th>  
89 - <th>Número</th>  
90 - <th>Nome</th>  
91 - <th>Estado</th>  
92 - <th>Nota</th>  
93 - </tr>  
94 - </thead>  
95 - </table>  
96 -  
97 -</div> <!-- container --> 69 + <div class="container-fluid">
  70 +
  71 + <div class="bg-light p-3">
  72 + <h3 id="title"></h3>
  73 + <ul>
  74 + <li>Referência: <code id="ref">--</code><br></li>
  75 + <li>Ficheiro de configuração: <code id="filename">--</code><br></li>
  76 + <li>Directório com os testes entregues: <code id="answers_dir">--</code><br></li>
  77 + <li>Base de dados: <code id="database">--</code><br></li>
  78 + </ul>
  79 + <p>
  80 + <a href="/adminwebservice?cmd=testcsv" class="btn btn-primary">Obter CSV das notas</a>
  81 + <a href="/adminwebservice?cmd=questionscsv" class="btn btn-primary">Obter CSV detalhado</a>
  82 + </p>
  83 + </div>
  84 + <br>
  85 + <table class="table table-sm table-striped" style="width:100%" id="students_table">
  86 + <thead class="thead thead-light">
  87 + <tr>
  88 + <th>#</th>
  89 + <th>Autoriz.</th>
  90 + <th>Número</th>
  91 + <th>Nome</th>
  92 + <th>Estado</th>
  93 + <th>Nota</th>
  94 + </tr>
  95 + </thead>
  96 + </table>
  97 +
  98 + </div> <!-- container -->
98 <!-- ===================================================================== --> 99 <!-- ===================================================================== -->
99 100
100 <!-- modal: inserir novo aluno --> 101 <!-- modal: inserir novo aluno -->
101 -<div class="modal" id="novo_aluno_modal">  
102 - <div class="modal-dialog" role="document"> 102 +<div class="modal fade" id="novo_aluno_modal" aria-hidden="true">
  103 + <div class="modal-dialog">
103 <div class="modal-content"> 104 <div class="modal-content">
104 105
105 <div class="modal-header"> 106 <div class="modal-header">
106 <h5 class="modal-title">Inserir novo aluno</h5> 107 <h5 class="modal-title">Inserir novo aluno</h5>
107 - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>  
108 </div> 108 </div>
109 109
110 <div class="modal-body"> 110 <div class="modal-body">
@@ -120,11 +120,11 @@ @@ -120,11 +120,11 @@
120 <input type="text" class="form-control" id="novo_nome" value=""> 120 <input type="text" class="form-control" id="novo_nome" value="">
121 </div> 121 </div>
122 </div> 122 </div>
123 -  
124 </div> 123 </div>
125 124
126 <div class="modal-footer"> 125 <div class="modal-footer">
127 - <button id="inserir_novo_aluno" class="btn btn-primary" role="button" data-dismiss="modal">Inserir</button> 126 + <button type="button" class="btn btn-primary" id="inserir_novo_aluno" data-bs-dismiss="modal">Inserir</button>
  127 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
128 </div> 128 </div>
129 129
130 </div> 130 </div>
@@ -132,13 +132,12 @@ @@ -132,13 +132,12 @@
132 </div> 132 </div>
133 133
134 <!-- modal: reset password --> 134 <!-- modal: reset password -->
135 -<div class="modal" id="reset_password_modal">  
136 - <div class="modal-dialog" role="document"> 135 +<div class="modal fade" id="reset_password_modal">
  136 + <div class="modal-dialog">
137 <div class="modal-content"> 137 <div class="modal-content">
138 138
139 <div class="modal-header"> 139 <div class="modal-header">
140 - <h5 class="modal-title">Reset password</h5>  
141 - <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button> 140 + <h5 class="modal-title">Limpar password do aluno</h5>
142 </div> 141 </div>
143 142
144 <div class="modal-body"> 143 <div class="modal-body">
@@ -151,7 +150,8 @@ @@ -151,7 +150,8 @@
151 </div> 150 </div>
152 151
153 <div class="modal-footer"> 152 <div class="modal-footer">
154 - <button id="reset_password" class="btn btn-primary" role="button" data-dismiss="modal">Reset password</button> 153 + <button type="button" class="btn btn-primary" id="reset_password" data-bs-dismiss="modal">Limpar password</button>
  154 + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
155 </div> 155 </div>
156 </div> 156 </div>
157 </div> <!-- modal --> 157 </div> <!-- modal -->
perguntations/templates/grade.html
@@ -8,41 +8,44 @@ @@ -8,41 +8,44 @@
8 8
9 <!-- Styles --> 9 <!-- Styles -->
10 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> 10 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
  11 + <link rel="stylesheet" type="text/css" href="/static/bootstrap-icons/font/bootstrap-icons.css">
11 12
12 <link rel="stylesheet" type="text/css" href="/static/css/test.css"> 13 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
13 14
14 <!-- Scripts --> 15 <!-- Scripts -->
15 <script src="/static/jquery/jquery.min.js"></script> 16 <script src="/static/jquery/jquery.min.js"></script>
16 <!-- <script defer src="/static/popper.js/popper.min.js"></script> --> 17 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
17 - <script defer src="/static/fontawesome-free/js/all.min.js"></script> 18 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
18 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script> 19 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
19 </head> 20 </head>
20 <!-- ================================================================= --> 21 <!-- ================================================================= -->
21 <body> 22 <body>
22 -  
23 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark"> 23 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark">
24 - <a class="navbar-brand" href="#">{{t['title']}}</a>  
25 - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">  
26 - <span class="navbar-toggler-icon"></span>  
27 - </button> 24 + <div class="container-fluid">
  25 + <a class="navbar-brand" href="#">{{t['title']}}</a>
  26 + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  27 + <span class="navbar-toggler-icon"></span>
  28 + </button>
28 29
29 - <div class="collapse navbar-collapse" id="navbarText">  
30 - <ul class="navbar-nav mr-auto">  
31 - </ul>  
32 - <span class="navbar-text">  
33 - <i class="fas fa-user" aria-hidden="true"></i>  
34 - <span id="name">{{ escape(name) }}</span>  
35 - (<span id="number">{{ escape(uid) }}</span>)  
36 - <span class="caret"></span>  
37 - </span> 30 + <div class="collapse navbar-collapse" id="navbarText">
  31 + <ul class="navbar-nav mr-auto">
  32 + </ul>
  33 + <span class="navbar-text">
  34 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
  35 + <span id="name">{{ escape(name) }}</span>
  36 + (<span id="number">{{ escape(uid) }}</span>)
  37 + <!-- <span class="caret"></span> -->
  38 + </span>
  39 + </div>
38 </div> 40 </div>
39 </nav> 41 </nav>
40 <!-- ================================================================== --> 42 <!-- ================================================================== -->
41 <div class="container"> 43 <div class="container">
42 - <div class="jumbotron"> 44 + <div class="bg-light p-3">
43 {% if t['state'] == 'CORRECTED' %} 45 {% if t['state'] == 'CORRECTED' %}
44 {% if t['grade'] - t['scale'][0] >= 0.75*(t['scale'][1] - t['scale'][0]) %} 46 {% if t['grade'] - t['scale'][0] >= 0.75*(t['scale'][1] - t['scale'][0]) %}
45 - <i class="fas fa-thumbs-up fa-5x text-success" aria-hidden="true"></i> 47 + <h1 class="text-success"><i class="bi bi-hand-thumbs-up-fill"></i></h1>
  48 + <!-- <i class="fas fa-thumbs-up fa-5x text-success" aria-hidden="true"></i> -->
46 {% end %} 49 {% end %}
47 <h3>Resultado: 50 <h3>Resultado:
48 <strong>{{ f'{round(t["grade"], 3)}' }}</strong> 51 <strong>{{ f'{round(t["grade"], 3)}' }}</strong>
@@ -54,8 +57,8 @@ @@ -54,8 +57,8 @@
54 <h3>Foi registada a sua desistência da prova.</h3> 57 <h3>Foi registada a sua desistência da prova.</h3>
55 {% end %} 58 {% end %}
56 59
57 - <p><a href="/logout" class="btn btn-primary btn-lg active" role="button">Clique aqui para terminar</a></p>  
58 - </div> <!-- jumbotron --> 60 + <p><a href="/logout" class="btn btn-primary btn-lg active" role="button">Sair do teste</a></p>
  61 + </div>
59 </div> <!-- container --> 62 </div> <!-- container -->
60 </body> 63 </body>
61 </html> 64 </html>
perguntations/templates/login.html
@@ -3,18 +3,10 @@ @@ -3,18 +3,10 @@
3 <head> 3 <head>
4 <title>Teste</title> 4 <title>Teste</title>
5 <link rel="icon" href="/static/favicon.ico"> 5 <link rel="icon" href="/static/favicon.ico">
6 -  
7 <meta charset="UTF-8"> 6 <meta charset="UTF-8">
8 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
9 -  
10 - <!-- Styles -->  
11 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> 8 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
12 -  
13 - <!-- Scripts -->  
14 - <script src="/static/jquery/jquery.min.js"></script>  
15 - <script defer src="/static/fontawesome-free/js/all.min.js"></script>  
16 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script> 9 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
17 -  
18 </head> 10 </head>
19 <!-- =================================================================== --> 11 <!-- =================================================================== -->
20 <body> 12 <body>
@@ -22,29 +14,26 @@ @@ -22,29 +14,26 @@
22 <div class="card bg-light border-secondary mt-3"> 14 <div class="card bg-light border-secondary mt-3">
23 <div class="card-body"> 15 <div class="card-body">
24 <div class="row"> 16 <div class="row">
25 -  
26 - <div class="col-sm-9"> 17 + <div class="col-sm-8">
27 <img src="/static/logo_horizontal_login.png" class="img-responsive mb-3" width="50%" alt="Universidade de Évora"> 18 <img src="/static/logo_horizontal_login.png" class="img-responsive mb-3" width="50%" alt="Universidade de Évora">
28 </div> 19 </div>
29 -  
30 - <div class="col-sm-3">  
31 - <h4>Identificação:</h4>  
32 - 20 + <div class="col-sm-4">
  21 + <h5>Identificação</h5>
33 <form method="post" action="/login" class="form-signin"> 22 <form method="post" action="/login" class="form-signin">
34 {% module xsrf_form_html() %} 23 {% module xsrf_form_html() %}
35 - <div class="form-group"> 24 + <div class="mb-3">
36 <input type="text" name="uid" class="form-control mb-3" placeholder="Número" required autofocus> 25 <input type="text" name="uid" class="form-control mb-3" placeholder="Número" required autofocus>
37 <input type="password" name="pw" class="form-control mb-3" placeholder="Password" required> 26 <input type="password" name="pw" class="form-control mb-3" placeholder="Password" required>
38 <p> {{ error }} </p> 27 <p> {{ error }} </p>
39 </div> 28 </div>
40 <button class="btn btn-primary" type="submit"> 29 <button class="btn btn-primary" type="submit">
41 - <i class="fas fa-sign-in-alt" aria-hidden="true"></i> Entrar 30 + Entrar
42 </button> 31 </button>
43 </form> 32 </form>
44 </div> 33 </div>
45 </div> 34 </div>
46 </div> 35 </div>
47 </div> 36 </div>
48 - </div> <!-- container --> 37 + </div>
49 </body> 38 </body>
50 </html> 39 </html>
perguntations/templates/review-question-checkbox.html
@@ -3,51 +3,57 @@ @@ -3,51 +3,57 @@
3 3
4 {% block answer %} 4 {% block answer %}
5 <fieldset data-role="controlgroup"> 5 <fieldset data-role="controlgroup">
6 - <ul class="list-group">  
7 - {% for n, opt in enumerate(q['options']) %}  
8 - <li class="list-group-item">  
9 - <div class="d-flex flex-row">  
10 - {% if q['answer'] is not None and str(n) in q['answer'] %}  
11 - <div class="p-2">  
12 - <i class="far fa-check-square" aria-hidden="true"></i>  
13 - </div>  
14 - <div class="p-2">  
15 - {{ md(opt) }}  
16 - </div>  
17 - <div class="ml-auto p-2">  
18 - {% if q['correct'][n] > 0 %}  
19 - <div class="text-right text-success">  
20 - <i class="fas fa-check" aria-hidden="true"></i>  
21 - </div>  
22 - {% else %}  
23 - <div class="text-right text-danger">  
24 - <i class="fas fa-times" aria-hidden="true"></i>  
25 - </div>  
26 - {% end %}  
27 - </div> 6 + <ul class="list-group">
  7 + {% for n, opt in enumerate(q['options']) %}
  8 + <li class="list-group-item">
  9 + <div class="d-flex flex-row">
  10 + {% if q['answer'] is not None and str(n) in q['answer'] %}
  11 + <div class="p-2">
  12 + <i class="bi bi-check-square"></i>
  13 + <!-- <i class="far fa-check-square" aria-hidden="true"></i> -->
  14 + </div>
  15 + <div class="p-2">
  16 + {{ md(opt) }}
  17 + </div>
  18 + <div class="ml-auto p-2">
  19 + {% if q['correct'][n] > 0 %}
  20 + <div class="text-right text-success">
  21 + <i class="bi bi-check-lg"></i>
  22 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
  23 + </div>
  24 + {% else %}
  25 + <div class="text-right text-danger">
  26 + <i class="bi bi-x-lg"></i>
  27 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
  28 + </div>
  29 + {% end %}
  30 + </div>
28 31
29 - {% else %}  
30 - <div class="p-2">  
31 - <i class="far fa-square" aria-hidden="true"></i>  
32 - </div>  
33 - <div class="p-2">  
34 - {{ md(opt) }}  
35 - </div>  
36 - <div class="ml-auto p-2">  
37 - {% if q['correct'][n] > 0 %}  
38 - <div class="text-right text-danger">  
39 - <i class="fas fa-times" aria-hidden="true"></i>  
40 - </div>  
41 - {% else %}  
42 - <div class="text-right text-success">  
43 - <i class="fas fa-check" aria-hidden="true"></i>  
44 - </div>  
45 - {% end %}  
46 - </div>  
47 - {% end %} 32 + {% else %}
  33 + <div class="p-2">
  34 + <i class="bi bi-square"></i>
  35 + <!-- <i class="far fa-square" aria-hidden="true"></i> -->
  36 + </div>
  37 + <div class="p-2">
  38 + {{ md(opt) }}
  39 + </div>
  40 + <div class="ml-auto p-2">
  41 + {% if q['correct'][n] > 0 %}
  42 + <div class="text-right text-danger">
  43 + <i class="bi bi-x-lg"></i>
  44 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
  45 + </div>
  46 + {% else %}
  47 + <div class="text-right text-success">
  48 + <i class="bi bi-check-lg"></i>
  49 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
48 </div> 50 </div>
49 - </li>  
50 - {% end %}  
51 - </ul> 51 + {% end %}
  52 + </div>
  53 + {% end %}
  54 + </div>
  55 + </li>
  56 + {% end %}
  57 + </ul>
52 </fieldset> 58 </fieldset>
53 {% end %} 59 {% end %}
perguntations/templates/review-question-radio.html
@@ -9,7 +9,8 @@ @@ -9,7 +9,8 @@
9 <div class="d-flex flex-row"> 9 <div class="d-flex flex-row">
10 {% if q['answer'] is not None and str(n)==q['answer'] %} 10 {% if q['answer'] is not None and str(n)==q['answer'] %}
11 <div class="p-2"> 11 <div class="p-2">
12 - <i class="fas fa-dot-circle" aria-hidden="true"></i> 12 + <i class="bi bi-record-circle"></i>
  13 + <!-- <i class="fas fa-dot-circle" aria-hidden="true"></i> -->
13 </div> 14 </div>
14 <div class="p-2"> 15 <div class="p-2">
15 {{ md(opt) }} 16 {{ md(opt) }}
@@ -17,18 +18,21 @@ @@ -17,18 +18,21 @@
17 <div class="ml-auto p-2"> 18 <div class="ml-auto p-2">
18 {% if q['correct'][n] > 0 %} 19 {% if q['correct'][n] > 0 %}
19 <div class="text-right text-success"> 20 <div class="text-right text-success">
20 - <i class="fas fa-check" aria-hidden="true"></i> 21 + <i class="bi bi-check-lg"></i>
  22 + <!-- <i class="fas fa-check" aria-hidden="true"></i> -->
21 </div> 23 </div>
22 {% else %} 24 {% else %}
23 <div class="text-right text-danger"> 25 <div class="text-right text-danger">
24 - <i class="fas fa-times" aria-hidden="true"></i> 26 + <i class="bi bi-x-lg"></i>
  27 + <!-- <i class="fas fa-times" aria-hidden="true"></i> -->
25 </div> 28 </div>
26 {% end %} 29 {% end %}
27 </div> 30 </div>
28 31
29 {% else %} 32 {% else %}
30 <div class="p-2"> 33 <div class="p-2">
31 - <i class="far fa-circle" aria-hidden="true"></i> 34 + <i class="bi bi-circle"></i>
  35 + <!-- <i class="far fa-circle" aria-hidden="true"></i> -->
32 </div> 36 </div>
33 <div class="p-2"> 37 <div class="p-2">
34 {{ md(opt) }} 38 {{ md(opt) }}
@@ -36,7 +40,8 @@ @@ -36,7 +40,8 @@
36 <div class="ml-auto p-2"> 40 <div class="ml-auto p-2">
37 {% if q['correct'][n] > 0 %} 41 {% if q['correct'][n] > 0 %}
38 <div class="text-right text-info"> 42 <div class="text-right text-info">
39 - <i class="fas fa-dot-circle" aria-hidden="true"></i> 43 + <i class="bi bi-arrow-left"></i>
  44 + <!-- <i class="fas fa-dot-circle" aria-hidden="true"></i> -->
40 </div> 45 </div>
41 {% end %} 46 {% end %}
42 </div> 47 </div>
@@ -45,4 +50,4 @@ @@ -45,4 +50,4 @@
45 {% end %} 50 {% end %}
46 </ul> 51 </ul>
47 </fieldset> 52 </fieldset>
48 -{% end %}  
49 \ No newline at end of file 53 \ No newline at end of file
  54 +{% end %}
perguntations/templates/review-question.html
@@ -8,7 +8,8 @@ @@ -8,7 +8,8 @@
8 {{ q['number'] }}. {{ q['title'] }} 8 {{ q['number'] }}. {{ q['title'] }}
9 <div class="float-right"> 9 <div class="float-right">
10 <small>Classificar&nbsp;</small> 10 <small>Classificar&nbsp;</small>
11 - <i class="far fa-check-square" aria-hidden="true"></i> 11 + <i class="bi bi-check-square"></i>
  12 + <!-- <i class="far fa-check-square" aria-hidden="true"></i> -->
12 </div> 13 </div>
13 </h5> <!-- card-header --> 14 </h5> <!-- card-header -->
14 15
@@ -35,17 +36,17 @@ @@ -35,17 +36,17 @@
35 {% if 'grade' in q %} 36 {% if 'grade' in q %}
36 <div class="card-footer"> 37 <div class="card-footer">
37 {% if q['grade'] > 0.999 %} 38 {% if q['grade'] > 0.999 %}
  39 + <h1 class="text-success"><i class="bi bi-hand-thumbs-up"></i></h1>
38 <p class="text-success"> 40 <p class="text-success">
39 - <i class="far fa-thumbs-up fa-3x" aria-hidden="true"></i>  
40 - {{ round(q['grade'] * q['points'], 2) }}  
41 - pontos 41 + <!-- <i class="far fa-thumbs-up fa-3x" aria-hidden="true"></i> -->
  42 + {{ round(q['grade'] * q['points'], 2) }} pontos
42 </p> 43 </p>
43 <p class="text-success">{{ md(q['comments']) }}</p> 44 <p class="text-success">{{ md(q['comments']) }}</p>
44 {% elif q['grade'] >= 0.5 %} 45 {% elif q['grade'] >= 0.5 %}
  46 + <h1 class="text-warning"><i class="bi bi-exclamation-triangle"></i></h1>
45 <p class="text-warning"> 47 <p class="text-warning">
46 - <i class="fas fa-exclamation-triangle fa-3x" aria-hidden="true"></i>  
47 - {{ round(q['grade'] * q['points'], 2) }}  
48 - pontos 48 + <!-- <i class="fas fa-exclamation-triangle fa-3x" aria-hidden="true"></i> -->
  49 + {{ round(q['grade'] * q['points'], 2) }} pontos
49 </p> 50 </p>
50 <p class="text-warning">{{ md(q['comments']) }}</p> 51 <p class="text-warning">{{ md(q['comments']) }}</p>
51 {% if q['solution'] %} 52 {% if q['solution'] %}
@@ -53,10 +54,10 @@ @@ -53,10 +54,10 @@
53 {{ md('**Solução:** \n\n' + q['solution']) }} 54 {{ md('**Solução:** \n\n' + q['solution']) }}
54 {% end %} 55 {% end %}
55 {% else %} 56 {% else %}
  57 + <h1 class="text-danger"><i class="bi bi-hand-thumbs-down"></i></h1>
56 <p class="text-danger"> 58 <p class="text-danger">
57 - <i class="far fa-thumbs-down fa-3x" aria-hidden="true"></i>  
58 - {{ round(q['grade'] * q['points'], 2) }}  
59 - pontos 59 + <!-- <i class="far fa-thumbs-down fa-3x" aria-hidden="true"></i> -->
  60 + {{ round(q['grade'] * q['points'], 2) }} pontos
60 </p> 61 </p>
61 <p class="text-danger">{{ md(q['comments']) }}</p> 62 <p class="text-danger">{{ md(q['comments']) }}</p>
62 {% if q['solution'] %} 63 {% if q['solution'] %}
@@ -81,7 +82,8 @@ @@ -81,7 +82,8 @@
81 {{ q['number'] }}. {{ q['title'] }} 82 {{ q['number'] }}. {{ q['title'] }}
82 <div class="float-right"> 83 <div class="float-right">
83 <small>Classificar&nbsp;</small> 84 <small>Classificar&nbsp;</small>
84 - <i class="far fa-square" aria-hidden="true"></i> 85 + <i class="bi bi-square"></i>
  86 + <!-- <i class="far fa-square" aria-hidden="true"></i> -->
85 </div> 87 </div>
86 </h5> <!-- card-header --> 88 </h5> <!-- card-header -->
87 89
@@ -100,8 +102,10 @@ @@ -100,8 +102,10 @@
100 </div> <!-- card-body --> 102 </div> <!-- card-body -->
101 103
102 <div class="card-footer"> 104 <div class="card-footer">
103 - <p class="text-secondary">  
104 - <i class="fas fa-ban fa-3x" aria-hidden="true"></i> 105 + <h1 class="text-secondary"><i class="bi bi-dash-circle"></i></h1>
  106 + <p class="text-secondary">
  107 + Não respondeu
  108 + <!-- <i class="fas fa-ban fa-3x" aria-hidden="true"></i> -->
105 {{ md(q['comments']) }} 109 {{ md(q['comments']) }}
106 {% if q['solution'] %} 110 {% if q['solution'] %}
107 <hr> 111 <hr>
perguntations/templates/review.html
@@ -5,7 +5,6 @@ @@ -5,7 +5,6 @@
5 <meta charset="UTF-8"> 5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7 <link rel="icon" type="image/x-icon" href="/static/favicon.ico"> 7 <link rel="icon" type="image/x-icon" href="/static/favicon.ico">
8 -  
9 <!-- MathJax3 --> 8 <!-- MathJax3 -->
10 <script> 9 <script>
11 MathJax = { 10 MathJax = {
@@ -25,52 +24,54 @@ @@ -25,52 +24,54 @@
25 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css"> 24 <link rel="stylesheet" type="text/css" href="/static/bootstrap/css/bootstrap.min.css">
26 <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight --> 25 <link rel="stylesheet" type="text/css" href="/static/css/github.css"> <!-- syntax highlight -->
27 <link rel="stylesheet" type="text/css" href="/static/css/test.css"> 26 <link rel="stylesheet" type="text/css" href="/static/css/test.css">
  27 + <link rel="stylesheet" type="text/css" href="/static/bootstrap-icons/font/bootstrap-icons.css">
28 28
29 <!-- Scripts --> 29 <!-- Scripts -->
30 <script src="/static/jquery/jquery.min.js"></script> 30 <script src="/static/jquery/jquery.min.js"></script>
31 <!-- <script defer src="/static/popper.js/popper.min.js"></script> --> 31 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
32 - <script defer src="/static/fontawesome-free/js/all.min.js"></script> 32 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
33 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script> 33 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
34 </head> 34 </head>
35 <!-- ===================================================================== --> 35 <!-- ===================================================================== -->
36 <body> 36 <body>
37 <!-- ===================================================================== --> 37 <!-- ===================================================================== -->
38 -  
39 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger"> 38 <nav class="navbar navbar-expand-sm fixed-top navbar-dark bg-danger">
40 - <a class="navbar-brand" href="#">  
41 - <img src="/static/logo_horizontal.png" height="30" alt="">  
42 - </a>  
43 - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">  
44 - <span class="navbar-toggler-icon"></span>  
45 - </button> 39 + <div class="container-fluid">
  40 + <a class="navbar-brand" href="#">
  41 + <img src="/static/logo_horizontal.png" height="30" alt="">
  42 + </a>
  43 + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  44 + <span class="navbar-toggler-icon"></span>
  45 + </button>
46 46
47 - <div class="collapse navbar-collapse" id="navbarText">  
48 - <ul class="nav navbar-nav">  
49 - <li class="nav-item"></li>  
50 - </ul> 47 + <div class="collapse navbar-collapse" id="navbarText">
  48 + <ul class="nav navbar-nav">
  49 + <li class="nav-item"></li>
  50 + </ul>
51 51
52 - <ul class="nav navbar-nav mx-auto">  
53 - <li class="nav-item">  
54 - <span class="navbar-text">Revisão de prova</span>  
55 - </li>  
56 - </ul> 52 + <ul class="nav navbar-nav mx-auto">
  53 + <li class="nav-item">
  54 + <span class="navbar-text">Revisão de prova</span>
  55 + </li>
  56 + </ul>
57 57
58 - <ul class="nav navbar-nav">  
59 - <li class="nav-item">  
60 - <span class="navbar-text">  
61 - <i class="fas fa-user" aria-hidden="true"></i>  
62 - <span id="name">{{ escape(name) }}</span>  
63 - (<span id="number">{{ escape(uid) }}</span>)  
64 - <span class="caret"></span>  
65 - </span>  
66 - </li>  
67 - </ul> 58 + <ul class="nav navbar-nav">
  59 + <li class="nav-item">
  60 + <span class="navbar-text">
  61 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
  62 + <span id="name">{{ escape(name) }}</span>
  63 + (<span id="number">{{ escape(uid) }}</span>)
  64 + <!-- <span class="caret"></span> -->
  65 + </span>
  66 + </li>
  67 + </ul>
  68 + </div>
68 </div> 69 </div>
69 </nav> 70 </nav>
70 71
71 <!-- ===================================================================== --> 72 <!-- ===================================================================== -->
72 <div class="container"> 73 <div class="container">
73 - <div class="jumbotron"> 74 + <div class="bg-light p-3">
74 <h1 class="display-5">{{ t['title'] }}</h1> 75 <h1 class="display-5">{{ t['title'] }}</h1>
75 <h5> 76 <h5>
76 <div class="row"> 77 <div class="row">
@@ -80,7 +81,6 @@ @@ -80,7 +81,6 @@
80 </div> 81 </div>
81 </div> 82 </div>
82 </h5> 83 </h5>
83 -  
84 <hr> 84 <hr>
85 85
86 <h5> 86 <h5>
@@ -113,7 +113,7 @@ @@ -113,7 +113,7 @@
113 </div> 113 </div>
114 {% end %} 114 {% end %}
115 </h3> 115 </h3>
116 - </div> <!-- jumbotron --> 116 + </div>
117 117
118 {% for i, q in enumerate(t['questions']) %} 118 {% for i, q in enumerate(t['questions']) %}
119 {% module Template(templ[q['type']], i=i, q=q, md=md(q['ref']), t=t, debug=debug) %} 119 {% module Template(templ[q['type']], i=i, q=q, md=md(q['ref']), t=t, debug=debug) %}
perguntations/templates/test.html
@@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
22 <!-- Scripts --> 22 <!-- Scripts -->
23 <script src="/static/jquery/jquery.min.js"></script> 23 <script src="/static/jquery/jquery.min.js"></script>
24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> --> 24 <!-- <script defer src="/static/popper.js/popper.min.js"></script> -->
25 - <script defer src="/static/fontawesome-free/js/all.min.js"></script> 25 + <!-- <script defer src="/static/fontawesome-free/js/all.min.js"></script> -->
26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script> 26 <script defer src="/static/bootstrap/js/bootstrap.bundle.min.js"></script>
27 <script defer src="/static/underscore/underscore-min.js"></script> 27 <script defer src="/static/underscore/underscore-min.js"></script>
28 <script src="/static/codemirror/lib/codemirror.js"></script> 28 <script src="/static/codemirror/lib/codemirror.js"></script>
@@ -49,65 +49,63 @@ @@ -49,65 +49,63 @@
49 </div> 49 </div>
50 50
51 <nav id="navbar" class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark"> 51 <nav id="navbar" class="navbar navbar-expand-sm fixed-top navbar-dark bg-dark">
52 -  
53 - <a class="navbar-brand" href="#">  
54 - <img src="/static/logo_horizontal.png" height="30" alt="">  
55 - </a>  
56 - <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">  
57 - <span class="navbar-toggler-icon"></span>  
58 - </button>  
59 -  
60 - <div class="collapse navbar-collapse" id="navbarText">  
61 - <ul class="nav navbar-nav">  
62 - <li class="nav-item"></li>  
63 - </ul>  
64 -  
65 - <ul class="nav navbar-nav mx-auto"> 52 + <div class="container-fluid">
  53 + <a class="navbar-brand" href="#">
  54 + <img src="/static/logo_horizontal.png" height="30" alt="">
  55 + </a>
  56 + <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
  57 + <span class="navbar-toggler-icon"></span>
  58 + </button>
  59 +
  60 + <div class="collapse navbar-collapse" id="navbarText">
  61 + <ul class="nav navbar-nav">
  62 + <li class="nav-item"></li>
  63 + </ul>
  64 +
  65 + <ul class="nav navbar-nav mx-auto">
66 <li class="nav-item"><h5> 66 <li class="nav-item"><h5>
67 <span class="navbar-text" id="clock"> --:-- </span> 67 <span class="navbar-text" id="clock"> --:-- </span>
68 </h5> 68 </h5>
69 69
70 </li> 70 </li>
71 - </ul> 71 + </ul>
72 72
73 - <ul class="nav navbar-nav"> 73 + <ul class="nav navbar-nav">
74 <li class="nav-item"> 74 <li class="nav-item">
75 <span class="navbar-text"> 75 <span class="navbar-text">
76 - <i class="fas fa-user" aria-hidden="true"></i> 76 + <!-- <i class="fas fa-user" aria-hidden="true"></i> -->
77 <span id="name">{{ escape(name) }}</span> 77 <span id="name">{{ escape(name) }}</span>
78 (<span id="number">{{ escape(uid) }}</span>) 78 (<span id="number">{{ escape(uid) }}</span>)
79 - <span class="caret"></span> 79 + <!-- <span class="caret"></span> -->
80 </span> 80 </span>
81 </li> 81 </li>
82 - </ul> 82 + </ul>
  83 + </div>
83 </div> 84 </div>
84 -  
85 </nav> 85 </nav>
86 86
87 <!-- ===================================================================== --> 87 <!-- ===================================================================== -->
88 <div class="container"> 88 <div class="container">
89 89
90 - <div class="jumbotron"> 90 + <div class="bg-light p-3">
91 <h3 class="display-5">{{ t['title'] }}</h3> 91 <h3 class="display-5">{{ t['title'] }}</h3>
92 <hr> 92 <hr>
93 -  
94 - <div class="row">  
95 - <label for="nome" class="col-sm-3">Nome:</label>  
96 - <div class="col-sm-9" id="nome">{{ escape(name) }}</div>  
97 - </div>  
98 - <div class="row">  
99 - <label for="numero" class="col-sm-3">Número:</label>  
100 - <div class="col-sm-9" id="numero">{{ escape(uid) }}</div>  
101 - </div>  
102 -  
103 - <div class="row">  
104 - <label for="duracao" class="col-sm-3">Duração:</label>  
105 - <div class="col-sm-9" id="duracao">{{ str(t['duration'])+' minutos' if t['duration'] > 0 else 'sem limite de tempo' }}</div>  
106 - </div>  
107 - <div class="row">  
108 - <label for="submissao" class="col-sm-3">Submissão:</label>  
109 - <div class="col-sm-9" id="submissao">{{ 'automática no fim do tempo' if t['autosubmit'] else 'manual' }}</div>  
110 - </div> 93 + <div class="row">
  94 + <label for="nome" class="col-sm-3">Nome:</label>
  95 + <div class="col-sm-9" id="nome">{{ escape(name) }}</div>
  96 + </div>
  97 + <div class="row">
  98 + <label for="numero" class="col-sm-3">Número:</label>
  99 + <div class="col-sm-9" id="numero">{{ escape(uid) }}</div>
  100 + </div>
  101 + <div class="row">
  102 + <label for="duracao" class="col-sm-3">Duração:</label>
  103 + <div class="col-sm-9" id="duracao">{{ str(t['duration'])+' minutos' if t['duration'] > 0 else 'sem limite de tempo' }}</div>
  104 + </div>
  105 + <div class="row">
  106 + <label for="submissao" class="col-sm-3">Submissão:</label>
  107 + <div class="col-sm-9" id="submissao">{{ 'automática no fim do tempo' if t['autosubmit'] else 'manual' }}</div>
  108 + </div>
111 </div> 109 </div>
112 110
113 <form action="/" method="post" id="test"> 111 <form action="/" method="post" id="test">
@@ -119,7 +117,7 @@ @@ -119,7 +117,7 @@
119 117
120 <div class="form-row"> 118 <div class="form-row">
121 <div class="col-12"> 119 <div class="col-12">
122 - <button type="button" class="btn btn-success btn-lg btn-block" data-toggle="modal" data-target="#confirmar" id="form-button-submit"> 120 + <button type="button" class="btn btn-success btn-lg btn-block" data-bs-toggle="modal" data-bs-target="#confirmar" id="form-button-submit">
123 Submeter teste 121 Submeter teste
124 </button> 122 </button>
125 </div> 123 </div>
@@ -132,7 +130,7 @@ @@ -132,7 +130,7 @@
132 130
133 <!-- Modal de confirmacao submissao --> 131 <!-- Modal de confirmacao submissao -->
134 <div class="modal fade" id="confirmar" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> 132 <div class="modal fade" id="confirmar" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
135 - <div class="modal-dialog" role="document"> 133 + <div class="modal-dialog">
136 <div class="modal-content"> 134 <div class="modal-content">
137 <div class="modal-header"> 135 <div class="modal-header">
138 <h4 class="modal-title">Deseja submeter o teste?</h4> 136 <h4 class="modal-title">Deseja submeter o teste?</h4>
@@ -141,15 +139,15 @@ @@ -141,15 +139,15 @@
141 O teste será enviado para classificação e já não poderá voltar atrás. 139 O teste será enviado para classificação e já não poderá voltar atrás.
142 Antes de submeter, verifique se respondeu a todas as questões. 140 Antes de submeter, verifique se respondeu a todas as questões.
143 Desactive as perguntas que não pretende classificar para evitar 141 Desactive as perguntas que não pretende classificar para evitar
144 - eventuais penalizações. 142 + penalizações.
145 </div> 143 </div>
146 <div class="modal-footer"> 144 <div class="modal-footer">
147 - <button type="button" class="btn btn-danger btn-lg" data-dismiss="modal">  
148 - Oops, NÃO!!!  
149 - </button>  
150 <button form="test" type="submit" class="btn btn-success btn-lg"> 145 <button form="test" type="submit" class="btn btn-success btn-lg">
151 Sim, submeter... 146 Sim, submeter...
152 </button> 147 </button>
  148 + <button type="button" class="btn btn-danger btn-lg" data-bs-dismiss="modal">
  149 + Oops, NÃO!!!
  150 + </button>
153 </div> 151 </div>
154 </div> 152 </div>
155 </div> 153 </div>