Skip to content

Commit

Permalink
Fix bacheca prenotazioni
Browse files Browse the repository at this point in the history
  • Loading branch information
dariowskii committed Aug 6, 2021
1 parent 156ff69 commit e73ee56
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 93 deletions.
40 changes: 24 additions & 16 deletions lib/screens/bacheca_prenotazioni_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class BachecaPrenotazioniScreen extends StatefulWidget {

class _BachecaPrenotazioniScreenState extends State<BachecaPrenotazioniScreen> {
/// Future degli appelli per il [FutureBuilder].
Future<Map> _appelli;
Future<Map<String, dynamic>> _appelli;

@override
void initState() {
Expand Down Expand Up @@ -48,10 +48,10 @@ class _BachecaPrenotazioniScreenState extends State<BachecaPrenotazioniScreen> {
title: const Text('Esse3'),
centerTitle: true,
),
body: FutureBuilder(
body: FutureBuilder<Map<String, dynamic>>(
future: _appelli,
builder: (context, appello) {
switch (appello.connectionState) {
builder: (context, appelli) {
switch (appelli.connectionState) {
case ConnectionState.none:
return ReloadAppelli(
deviceWidth: deviceWidth,
Expand All @@ -63,20 +63,21 @@ class _BachecaPrenotazioniScreenState extends State<BachecaPrenotazioniScreen> {
case ConnectionState.active:
case ConnectionState.done:
//In caso di risposta nulla..
if (appello.data == null) {
if (appelli.data == null) {
return ReloadAppelli(
deviceWidth: deviceWidth,
deviceHeight: deviceHeight,
onReload: _refreshBacheca,
);
}
if (appello.data['success'] as bool) {
if (appelli.data['success'] as bool) {
//In caso non ci siano appelli
if (appello.data['totali'] == 0) {
if (appelli.data['totali'] == 0) {
return RicaricaBachecaPrenotazioni(
refreshBacheca: _refreshBacheca, svgAsset: _svgAsset);
}
//In caso ci siano appelli...
final appello = appelli.data;
return LiquidPullToRefresh(
animSpeedFactor: 1.5,
height: 80,
Expand All @@ -103,17 +104,24 @@ class _BachecaPrenotazioniScreenState extends State<BachecaPrenotazioniScreen> {
horizontal: deviceWidth / 6)
: null,
physics: const NeverScrollableScrollPhysics(),
itemCount: appello.data['totali'] as int,
itemCount: appello['totali'] as int,
itemBuilder: (context, index) {
return CardAppelloPrenotato(
nomeEsame: appello.data['esame'][index] as String,
iscrizione:
appello.data['iscrizione'][index] as String,
giorno: appello.data['giorno'][index] as String,
ora: appello.data['ora'][index] as String,
docente: appello.data['docente'][index] as String,
formHiddens: appello.data['formHiddens'] as Map,
index: index,
nomeEsame:
(appello['esame'] as List<String>)[index],
iscrizione: (appello['iscrizione']
as List<String>)[index],
giorno:
(appello['giorno'] as List<String>)[index],
ora: (appello['ora'] as List<String>)[index],
docente:
(appello['docente'] as List<String>)[index],
linkCancellazione: (appello['linkCancellazione']
as List<String>)[index],
tipoEsame: (appello['tipo_esame']
as List<String>)[index],
svolgimento: (appello['svolgimento']
as List<String>)[index],
darkModeOn: darkModeOn,
isTablet: isTablet,
);
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/info_app_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ class InfoApp extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.end,
children: const [
Text(
'version: 1.3.0+37',
'version: 1.3.2+38',
style: Constants.fontBold,
),
],
Expand Down
107 changes: 69 additions & 38 deletions lib/utils/provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -827,15 +827,16 @@ class Provider {

final document = parser.parse(response.body);

final divPrenotati = document.querySelector('#esse3old');
final divPrenotati = document.querySelector('#esse3');

if (divPrenotati == null) {
mapPrenotati['success'] = false;
mapPrenotati['error'] = 'div#esse3old not found';
mapPrenotati['error'] = 'div#esse3 not found';
return mapPrenotati;
}

final arrayPrenotati = divPrenotati.querySelectorAll('table.detail_table');
final arrayPrenotati = divPrenotati.querySelectorAll('#boxPrenotazione');
final arrayAzioni = divPrenotati.querySelectorAll('#toolbarAzioni');

if (arrayPrenotati == null) {
mapPrenotati['totali'] = 0;
Expand All @@ -844,47 +845,77 @@ class Provider {

final lengthPrenotati = arrayPrenotati.length;
mapPrenotati['totali'] = 0;
mapPrenotati['esame'] = {};
mapPrenotati['iscrizione'] = {};
mapPrenotati['tipo_esame'] = {};
mapPrenotati['giorno'] = {};
mapPrenotati['ora'] = {};
mapPrenotati['docente'] = {};
mapPrenotati['formHiddens'] = {};
mapPrenotati['esame'] = <String>[];
mapPrenotati['iscrizione'] = <String>[];
mapPrenotati['tipo_esame'] = <String>[];
mapPrenotati['svolgimento'] = <String>[];
mapPrenotati['giorno'] = <String>[];
mapPrenotati['ora'] = <String>[];
mapPrenotati['docente'] = <String>[];
mapPrenotati['linkCancellazione'] = <String>[];

try {
for (var i = 0; i < lengthPrenotati; i++) {
final tablePrenotazione = arrayPrenotati[i].children[0];
if (tablePrenotazione == null ||
tablePrenotazione.children.length < 2) {
for (int i = 0; i < lengthPrenotati; i++) {
final nomeEsame = arrayPrenotati[i].querySelector('h2.record-h2').text;
mapPrenotati['esame'].add(nomeEsame);

final dataEsame = arrayPrenotati[i]
.querySelector('dt.app-box_dati_data_esame')
.innerHtml
.split('&nbsp;');

final data = dataEsame[0];
final ora = dataEsame[1].trim();

mapPrenotati['giorno'].add(data);
mapPrenotati['ora'].add(ora);

final tablePrenotazione =
arrayPrenotati[i].querySelector('dl.record-riga');

if (tablePrenotazione == null) {
break;
}

mapPrenotati['esame'][mapPrenotati['totali']] =
tablePrenotazione.children[0].children[0].text;
mapPrenotati['iscrizione'][mapPrenotati['totali']] =
tablePrenotazione.children[2].children[0].text;

mapPrenotati['tipo_esame'][mapPrenotati['totali']] =
tablePrenotazione.children[3].children[0].text;

mapPrenotati['giorno'][mapPrenotati['totali']] =
tablePrenotazione.children[6].children[0].text;
mapPrenotati['ora'][mapPrenotati['totali']] =
tablePrenotazione.children[6].children[1].text;
mapPrenotati['docente'][mapPrenotati['totali']] =
tablePrenotazione.children[6].children[7].text;

final lenHiddens = tablePrenotazione
.children[6].children[9].children[0].children.length;
mapPrenotati['lenHiddens'] = lenHiddens - 1;
final hiddens = tablePrenotazione.children[6].children[9].children[0];
for (var j = 1; j < lenHiddens; j++) {
final key =
'${mapPrenotati['totali']}_${hiddens.children[j].attributes['name']}';
mapPrenotati['formHiddens'][key] =
hiddens.children[j].attributes['value'];
final arrayInfo = tablePrenotazione.querySelectorAll('dd');
arrayInfo.removeAt(0);

final numeroIscrizione = arrayInfo[2]
.innerHtml
.replaceFirst('&nbsp;', '')
.trim()
.replaceFirst('<br>', '');
mapPrenotati['iscrizione'].add(numeroIscrizione);

final tipoEsame = arrayInfo[3].innerHtml.split('&nbsp;')[0];
mapPrenotati['tipo_esame'].add(tipoEsame);

final svolgimento = arrayInfo[4]
.innerHtml
.replaceFirst('&nbsp;', '')
.trim()
.replaceFirst('<br>', '');
mapPrenotati['svolgimento'].add(svolgimento);

final docenti = arrayInfo[10].innerHtml.split('<br>');
docenti.removeLast();

var nomeDocentiComposto = "";

docenti.forEach((docente) {
nomeDocentiComposto += "${docente.replaceFirst('&nbsp;', '')}, ";
});
nomeDocentiComposto =
nomeDocentiComposto.substring(0, nomeDocentiComposto.length - 3);

mapPrenotati['docente'].add(nomeDocentiComposto);
final btnCancella = arrayAzioni[i].querySelector('#btnCancella');
if (btnCancella != null) {
mapPrenotati['linkCancellazione'].add(btnCancella.attributes['href']);
} else {
mapPrenotati['linkCancellazione'].add(null);
}

mapPrenotati['totali']++;
}
} catch (e) {
Expand Down
92 changes: 55 additions & 37 deletions lib/widgets/card_appello_prenotato.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,16 @@ import 'package:add_2_calendar/add_2_calendar.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

/// Card rappresentativa dell'appello prenotato in [BachecaPrenotazioniScreen].
/// Card rappresentativa dell'appello prenotato in `BachecaPrenotazioniScreen`.
class CardAppelloPrenotato extends StatelessWidget {
final String nomeEsame;
final String iscrizione;
final String giorno;
final String ora;
final String docente;
final Map formHiddens;
final int index;
final String linkCancellazione;
final String tipoEsame;
final String svolgimento;
final bool darkModeOn;
final bool isTablet;

Expand All @@ -22,23 +23,17 @@ class CardAppelloPrenotato extends StatelessWidget {
this.giorno,
this.ora,
this.docente,
this.formHiddens,
this.index,
this.linkCancellazione,
this.tipoEsame,
this.svolgimento,
this.darkModeOn,
this.isTablet})
: super(key: key);

@override
Widget build(BuildContext context) {
final darkModeOn = Theme.of(context).brightness == Brightness.dark;
final _nomeEsame = nomeEsame.split(' - ');
final numIsc = iscrizione.replaceFirst('Numero Iscrizione: ', '');
final Map<String, dynamic> internalHiddens = {};
formHiddens.forEach((key, value) {
if (key.toString().startsWith(index.toString())) {
internalHiddens[key.toString().replaceFirst('${index}_', '')] = value;
}
});
final _nomeEsame = nomeEsame.split(' [');
return Container(
margin: const EdgeInsets.only(bottom: 15),
decoration: BoxDecoration(
Expand All @@ -48,9 +43,10 @@ class CardAppelloPrenotato extends StatelessWidget {
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
Constants.mainColorDarker,
Constants.mainColorLighter
]),
Constants.mainColorDarker,
Constants.mainColorDarkLighter,
],
),
borderRadius: const BorderRadius.all(Radius.circular(10)),
color: darkModeOn ? Theme.of(context).cardColor : null,
),
Expand All @@ -67,25 +63,30 @@ class CardAppelloPrenotato extends StatelessWidget {
child: Text(
_nomeEsame[0],
style: isTablet
? Constants.fontBold28.copyWith(color: Colors.white)
: Constants.fontBold20.copyWith(color: Colors.white),
? Constants.fontBold28.copyWith(
color: darkModeOn
? Constants.mainColorDarkLighter
: Colors.white)
: Constants.fontBold20.copyWith(
color: darkModeOn
? Constants.mainColorDarkLighter
: Colors.white),
),
),
Text(
_nomeEsame[1],
"[${_nomeEsame[1]}",
style: const TextStyle(
color: Colors.white,
fontSize: 15,
),
),
],
),
Text(
_nomeEsame[2],
style: const TextStyle(
color: Colors.white,
fontSize: 14,
fontStyle: FontStyle.italic,
Padding(
padding: const EdgeInsets.symmetric(vertical: 5),
child: Text(
svolgimento,
style: const TextStyle(fontStyle: FontStyle.italic),
),
),
const SizedBox(height: 10),
Expand Down Expand Up @@ -131,7 +132,24 @@ class CardAppelloPrenotato extends StatelessWidget {
.copyWith(color: Colors.white),
children: [
TextSpan(
text: numIsc,
text: iscrizione,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: 16,
),
)
]),
),
RichText(
text: TextSpan(
text: 'Tipologia: ',
style: DefaultTextStyle.of(context)
.style
.copyWith(color: Colors.white),
children: [
TextSpan(
text: tipoEsame,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
Expand Down Expand Up @@ -423,8 +441,10 @@ class CardAppelloPrenotato extends StatelessWidget {
Flexible(
child: MaterialButton(
elevation: 3,
minWidth: double.infinity,
color: Colors.white,
minWidth: double.maxFinite,
color: darkModeOn
? Constants.mainColorDarkLighter
: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(50),
),
Expand All @@ -434,25 +454,23 @@ class CardAppelloPrenotato extends StatelessWidget {
final anno = int.parse(giorno.substring(6));

final event = Event(
title: 'Appello ${_nomeEsame[0]} - $giorno',
description: _nomeEsame[2],
title: '${_nomeEsame[0]} - $giorno',
location: 'Università di Modena e Reggio Emilia',
startDate: DateTime.parse('$anno-$mese-$giornoEv')
.subtract(const Duration(days: 3))
.add(const Duration(hours: 10)),
.subtract(const Duration(days: 3)),
endDate: DateTime.parse('$anno-$mese-$giornoEv')
.subtract(const Duration(days: 3))
.add(const Duration(hours: 10)),
.subtract(const Duration(days: 3)),
description:
'Appello di ${_nomeEsame[0]} per il giorno $giorno alle ore $ora',
allDay: true,
);

Add2Calendar.addEvent2Cal(event);
},
child: Text('PROMEMORIA',
style: TextStyle(
color: darkModeOn
? Colors.redAccent
: Constants.mainColor)),
color:
darkModeOn ? Colors.white : Constants.mainColor)),
),
),
],
Expand Down
Loading

0 comments on commit e73ee56

Please sign in to comment.