import 'dart:math'; import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_scatter/flutter_scatter.dart'; import 'package:konectar_events/model/affiliationsmodel.dart'; import 'package:konectar_events/model/allsessionnotesmodel.dart'; import 'package:konectar_events/model/neweventsmodel.dart'; import 'package:konectar_events/model/specialtymodel.dart'; import 'package:konectar_events/utils/constants.dart'; import 'package:konectar_events/viewmodel/eventsprovider.dart'; import 'package:konectar_events/viewmodel/hcpprofprovider.dart'; import 'package:konectar_events/widgets/chartline.dart'; import 'package:konectar_events/widgets/piechart.dart'; import 'package:konectar_events/widgets/word_cloud.dart'; import 'package:provider/provider.dart'; import 'package:zoom_widget/zoom_widget.dart'; class EventsInsights extends StatefulWidget { EventsList eventsdetail; String eventid; String eid; List kFlutterHashtags = []; List specialtyList = []; List allSessionNotes = []; Affiliations affiliations; EventsInsights( {super.key, required this.eventsdetail, required this.eid, required this.eventid, required this.kFlutterHashtags, required this.affiliations, required this.allSessionNotes, required this.specialtyList}); @override State createState() => _EventsInsightsState(); } class _EventsInsightsState extends State { String _value = 'My Events Insights'; int count = 0; String wordstring = ''; bool isClientOverview = false; Matrix4 matrix = Matrix4.identity(); @override void initState() { WidgetsBinding.instance.addPostFrameCallback((timeStamp) { init(); }); super.initState(); } init() async { // await Provider.of(context, listen: false) // .getAllSessionNotesFromApi(widget.eid); setState(() {}); } @override void dispose() { super.dispose(); Provider.of(context, listen: false).allSessionNotes = []; } @override Widget build(BuildContext context) { final screenSize = MediaQuery.of(context).size; final ratio = screenSize.width / (screenSize.height / 2); return Consumer( builder: (BuildContext context, provider, Widget? child) { List widgets = []; for (var i = 0; i < widget.kFlutterHashtags.length; i++) { widgets.add(ScatterItem(widget.kFlutterHashtags[i], i)); } return Scaffold( backgroundColor: EventsConstants.bgcolor, body: Padding( padding: const EdgeInsets.symmetric(horizontal: 12.0), child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( child: Wrap( children: [ Padding( padding: const EdgeInsets.only( right: 2.0, bottom: 30, top: 10.0), child: CupertinoSwitch( activeColor: Color.fromARGB(255, 0, 71, 132), value: isClientOverview, onChanged: (value) async { isClientOverview = value; if (isClientOverview) { provider.isLoadingInsights = true; await provider.callInsightsDataForClientSpecific( widget.eventsdetail, true); setState(() {}); } else { await provider.callInsightsDataForClientSpecific( widget.eventsdetail, false); setState(() {}); } setState(() {}); }, ), ), Padding( padding: const EdgeInsets.only( right: 8.0, top: 20.0, bottom: 20), child: !isClientOverview ? const Text( 'Client Overview', style: TextStyle(fontSize: 15, color: Colors.grey), ) : const Text( 'Client Overview', style: TextStyle( fontSize: 15, ), ), ) ], ), ), provider.isLoadingInsights ? Center( child: CircularProgressIndicator( color: EventsConstants.blueColor, ), ) : _buildCharts(provider, widgets), widget.allSessionNotes.isNotEmpty ? labelWidget("Session Notes") : SizedBox.shrink(), widget.allSessionNotes.isEmpty ? SizedBox.shrink() : Card( surfaceTintColor: Colors.white, child: Container( padding: EdgeInsets.all(4.0), margin: EdgeInsets.all(4.0), // height: screenSize.height / 3, width: screenSize.width, constraints: BoxConstraints( maxHeight: widget.allSessionNotes.length > 3 ? screenSize.height : 400, minHeight: 400), // height: double.minPositive, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), color: Colors.white, ), child: widget.allSessionNotes.isNotEmpty ? ListView.separated( padding: EdgeInsets.zero, itemCount: widget.allSessionNotes.length, itemBuilder: (context, index) { return ExpansionTile( initiallyExpanded: false, shape: Border(), expandedCrossAxisAlignment: CrossAxisAlignment.start, expandedAlignment: Alignment.topLeft, childrenPadding: EdgeInsets.all(8.0), title: Text( "Session: ${widget.allSessionNotes[index].sessionName}", style: TextStyle( fontSize: 15, fontWeight: FontWeight.bold, )), subtitle: Padding( padding: const EdgeInsets.only(top: 8.0), child: Text( "Speaker: ${widget.allSessionNotes[index].firstName}", // maxLines: 3, style: TextStyle( // decoration: TextDecoration.underline, // decorationColor: Colors.blue, // //fontFamily: "SourceSerif", //color: Colors.grey[700], //fontWeight: FontWeight.bold, fontSize: 14), ), ), children: List.generate( widget.allSessionNotes[index] .addedBy!.length, (i) { return Container( padding: EdgeInsets.all(8.0), // width: isTablet // ? MediaQuery.of(context).size.width * 0.25 // : MediaQuery.of(context).size.width * 0.5, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( "\"${widget.allSessionNotes[index].notes![i]}\"", maxLines: 3, style: TextStyle( // decoration: TextDecoration.underline, // decorationColor: Colors.blue, //fontFamily: "SourceSerif", color: Colors.grey[900], fontStyle: FontStyle.italic, fontSize: 14), ), SizedBox( height: 5, ), Padding( padding: const EdgeInsets .symmetric(vertical: 8.0), child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ Text( "Added by ${widget.allSessionNotes[index].addedBy![i]}", style: TextStyle( color: Colors .grey[900], fontSize: 13), ), Text( " On ${widget.allSessionNotes[index].createdOn![i]}", style: TextStyle( color: Colors .grey[900], fontSize: 13), ), ], ), ), widget.allSessionNotes[index] .addedBy!.length > 1 ? (i + 1) != widget .allSessionNotes[ index] .addedBy! .length ? Divider( //color: Colors.grey[900], ) : SizedBox.shrink() : SizedBox.shrink(), ], ), ); }), //), // Text( // "Notes : ${sessionNotesList[index]}", // maxLines: 3, // style: TextStyle( // // decoration: TextDecoration.underline, // // decorationColor: Colors.blue, // fontFamily: "SourceSerif", // color: Colors.grey[700], // //fontStyle: FontStyle.italic, // fontSize: 14), // ), ); }, separatorBuilder: (BuildContext context, int index) { return Divider(); }, // separatorBuilder: (context, index) { // return Divider(); // }, ) : Center( child: Text("No added session notes"))), ), ], ), ), ), ); }); } Widget _buildCharts(EventsProvider provider, List widgets) { final screenSize = MediaQuery.of(context).size; final ratio = screenSize.width / (screenSize.height / 2); List affCountList = []; int maximum = 0; if (widget.affiliations.affiliationCount.isNotEmpty) { for (var obj in widget.affiliations.affiliationCount) { affCountList.add(int.parse(obj)); } maximum = affCountList.reduce(max); } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ widgets.isNotEmpty ? labelWidget("Topics Discussed") : SizedBox.shrink(), widgets.isNotEmpty ? Card( surfaceTintColor: Colors.white, child: Container( padding: EdgeInsets.all(2.0), margin: EdgeInsets.all(2.0), height: screenSize.height / 2, width: screenSize.width, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(20))), child: Center( // child: Zoom( // backgroundColor: Colors.white, // initTotalZoomOut: true, // centerOnScale: false, // scrollWeight: 5, child: FittedBox( child: Scatter( fillGaps: true, delegate: ArchimedeanSpiralScatterDelegate(ratio: ratio), children: widgets, // ), ), ), ), ), ) : SizedBox.shrink(), provider.specialtyList.isEmpty ? SizedBox.shrink() : SizedBox( height: 20, ), provider.specialtyList.isNotEmpty ? labelWidget("Specialty of speakers") : SizedBox.shrink(), provider.specialtyList.isNotEmpty ? Card( surfaceTintColor: Colors.white, child: Container( padding: EdgeInsets.all(2.0), margin: EdgeInsets.all(5.0), height: screenSize.height / 2, width: screenSize.width, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), color: Colors.white, ), child: CustomPieChart( specialtyList: widget.specialtyList, ), ), ) : SizedBox.shrink(), provider.specialtyList.isEmpty ? SizedBox.shrink() : SizedBox( height: 20, ), provider.affiliations.affiliationCount.isNotEmpty ? labelWidget("Speaker counts by providers") : SizedBox.shrink(), provider.affiliations.affiliationCount.isNotEmpty ? Card( surfaceTintColor: Colors.white, child: Container( padding: EdgeInsets.all(12.0), // margin: EdgeInsets.all(10.0), // height: screenSize.height / 3, width: screenSize.width, decoration: BoxDecoration( borderRadius: BorderRadius.all(Radius.circular(20)), color: Colors.white, ), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: List.generate( widget.affiliations.affiliationCount.length, (index) { return ChartLine( title: widget.affiliations.affiliationNames[index], number: int.parse( widget.affiliations.affiliationCount[index]), rate: int.parse(widget.affiliations .affiliationCount[index]) == maximum ? 1 : int.parse(widget .affiliations.affiliationCount[index]) / maximum); }), )), ) : SizedBox.shrink(), provider.specialtyList.isEmpty ? SizedBox.shrink() : SizedBox( height: 20, ) ], ); } Widget labelWidget(String title) { return Text( title, style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 17, ), maxLines: 2, softWrap: true, overflow: TextOverflow.ellipsis, ); } Widget bargraph() { return BarChart(BarChartData( borderData: FlBorderData( border: const Border( top: BorderSide(width: 1), right: BorderSide(width: 1), left: BorderSide.none, bottom: BorderSide.none, )), groupsSpace: 10, barGroups: [ BarChartGroupData( x: 1, barRods: [ BarChartRodData( fromY: 0, toY: 10, width: 15, color: Colors.amber), ], groupVertically: false), BarChartGroupData(x: 2, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 10, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 3, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 15, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 4, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 10, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 5, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 11, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 6, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 10, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 7, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 10, width: 15, color: Colors.amber), ]), BarChartGroupData(x: 8, groupVertically: false, barRods: [ BarChartRodData(fromY: 0, toY: 10, width: 15, color: Colors.amber), ]), ])); } } class PieChartWidget extends StatelessWidget { final List sectors; const PieChartWidget(this.sectors, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { return AspectRatio( aspectRatio: 1.0, child: PieChart(PieChartData( sections: _chartSections(sectors), centerSpaceRadius: 58.0, ))); } List _chartSections(List sectors) { final List list = []; for (var sector in sectors) { const double radius = 40.0; final data = PieChartSectionData( color: sector.color, value: sector.value, radius: radius, title: sector.title, ); list.add(data); } return list; } } class SmallPieChartWidget extends StatelessWidget { final List sectors; const SmallPieChartWidget(this.sectors, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { return AspectRatio( aspectRatio: 2.0, child: PieChart(PieChartData( sections: _chartSections(sectors), centerSpaceRadius: 2.0, ))); } List _chartSections(List sectors) { final List list = []; for (var sector in sectors) { const double radius = 100.0; final data = PieChartSectionData( color: sector.color, value: sector.value, radius: radius, title: sector.title, ); list.add(data); } return list; } } class Sector { final Color color; final double value; final String title; Sector({required this.color, required this.value, required this.title}); }