tablet-app/lib/Screens/Agenda/agenda_view.dart
2024-02-28 12:01:56 +01:00

170 lines
6.7 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'dart:io';
//import 'dart:html';
import 'dart:ui' as ui;
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:manager_api/api.dart';
import 'package:path_provider/path_provider.dart';
import 'package:provider/provider.dart';
import 'package:tablet_app/Components/loading_common.dart';
import 'package:tablet_app/Models/agenda.dart';
import 'package:tablet_app/Models/tabletContext.dart';
import 'package:tablet_app/Screens/Agenda/event_list_item.dart';
import 'package:tablet_app/Screens/Agenda/event_popup.dart';
import 'package:tablet_app/Screens/Agenda/month_filter.dart';
import 'package:tablet_app/app_context.dart';
import 'package:tablet_app/constants.dart';
class AgendaView extends StatefulWidget {
final SectionDTO? section;
AgendaView({this.section});
@override
_AgendaView createState() => _AgendaView();
}
class _AgendaView extends State<AgendaView> {
AgendaDTO agendaDTO = AgendaDTO();
late Agenda agenda;
late ValueNotifier<List<EventAgenda>> filteredAgenda = ValueNotifier<List<EventAgenda>>([]);
@override
void initState() {
print(widget.section!.data);
agendaDTO = AgendaDTO.fromJson(jsonDecode(widget.section!.data!))!;
print(agendaDTO);
super.initState();
}
@override
void dispose() {
super.dispose();
}
Future<Agenda?> getAndParseJsonInfo(TabletAppContext tabletAppContext) async {
try {
// Récupération du contenu JSON depuis l'URL
var httpClient = HttpClient();
// We need to get detail to get url from resourceId
var resourceIdForSelectedLanguage = agendaDTO.resourceIds!.where((ri) => ri.language == tabletAppContext.language).first.value;
ResourceDTO? resourceDTO = await tabletAppContext.clientAPI!.resourceApi!.resourceGetDetail(resourceIdForSelectedLanguage!);
var request = await httpClient.getUrl(Uri.parse(resourceDTO!.url!));
var response = await request.close();
var jsonString = await response.transform(utf8.decoder).join();
agenda = Agenda.fromJson(jsonString);
agenda.events = agenda.events.where((a) => a.dateFrom!.isAfter(DateTime.now())).toList();
agenda.events.sort((a, b) => a.dateFrom!.compareTo(b.dateFrom!));
filteredAgenda.value = agenda.events;
return agenda;
} catch(e) {
print("Erreur lors du parsing du json : ${e.toString()}");
return null;
}
}
@override
Widget build(BuildContext context) {
Size size = MediaQuery.of(context).size;
final TabletAppContext tabletAppContext = Provider.of<AppContext>(context).getContext();
return FutureBuilder(future: getAndParseJsonInfo(tabletAppContext),
builder: (BuildContext context, AsyncSnapshot<dynamic> snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.data == null) {
return Center(
child: Text("Le json n'est pas valide")
);
} else {
return Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
flex: 1,
child: Container(
decoration: BoxDecoration(
color: kBackgroundColor,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(30.0),
bottomLeft: Radius.circular(30.0),
),
),
child: Padding(
padding: const EdgeInsets.all(8.0),
child: MonthFilter(
events: snapshot.data.events,
onMonthSelected: (filteredList) {
print('events sélectionné: $filteredList');
var result = filteredList != null ? filteredList : <EventAgenda>[];
result.sort((a, b) => a.dateFrom!.compareTo(b.dateFrom!));
filteredAgenda.value = result;
}),
),
),
),
Expanded(
flex: 4,
child: Padding(
padding: const EdgeInsets.only(left: 8.0),
child: Container(
child: ValueListenableBuilder<List<EventAgenda>>(
valueListenable: filteredAgenda,
builder: (context, value, _) {
return GridView.builder(
scrollDirection: Axis.vertical, // Changer pour horizontal si nécessaire
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 4, // Nombre de colonnes dans la grid
crossAxisSpacing: 6.0, // Espace entre les colonnes
mainAxisSpacing: 6.0, // Espace entre les lignes
childAspectRatio: 0.8, // Aspect ratio des enfants de la grid
),
itemCount: value.length,
itemBuilder: (BuildContext context, int index) {
EventAgenda eventAgenda = value[index];
return GestureDetector(
onTap: () {
print("${eventAgenda.name}");
showDialog(
context: context,
builder: (BuildContext context) {
return EventPopup(eventAgenda: eventAgenda);
},
);
},
child: EventListItem(
eventAgenda: eventAgenda,
),
);
},
);
}
),
),
),
),
],
),
);
}
} else if (snapshot.connectionState == ConnectionState.none) {
return Text("No data");
} else {
return Center(
child: Container(
height: size.height * 0.2,
child: LoadingCommon()
)
);
}
},
);
}
} //_webView