469 lines
19 KiB
Dart
469 lines
19 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:fl_chart/fl_chart.dart';
|
|
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
import 'package:flutter_scatter/flutter_scatter.dart';
|
|
import 'package:konectar_events/model/affiliationsmodel.dart';
|
|
import 'package:konectar_events/model/eventsdetailmodel.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/utils/util.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/customappbar.dart';
|
|
import 'package:konectar_events/widgets/customeventsappbar.dart';
|
|
import 'package:konectar_events/widgets/flutter_hashtags.dart';
|
|
import 'package:konectar_events/widgets/piechart.dart';
|
|
import 'package:konectar_events/widgets/word_cloud.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:word_cloud/word_cloud_data.dart';
|
|
import 'package:word_cloud/word_cloud_view.dart';
|
|
|
|
class EventsInsights extends StatefulWidget {
|
|
//EventsList eventsdetail;
|
|
String eventid;
|
|
List<FlutterHashtag> kFlutterHashtags = [];
|
|
List<Specialty> specialtyList = [];
|
|
Affiliations affiliations;
|
|
EventsInsights(
|
|
{super.key,
|
|
required this.eventid,
|
|
required this.kFlutterHashtags,
|
|
required this.affiliations,
|
|
required this.specialtyList});
|
|
|
|
@override
|
|
State<EventsInsights> createState() => _EventsInsightsState();
|
|
}
|
|
|
|
class _EventsInsightsState extends State<EventsInsights> {
|
|
String _value = 'My Events Insights';
|
|
|
|
int count = 0;
|
|
String wordstring = '';
|
|
|
|
@override
|
|
void initState() {
|
|
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
|
|
init();
|
|
});
|
|
|
|
super.initState();
|
|
}
|
|
|
|
init() async {
|
|
await Provider.of<HcpProfileProvider>(context, listen: false)
|
|
.getAllSessionNotesList(widget.eventid);
|
|
|
|
setState(() {});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final screenSize = MediaQuery.of(context).size;
|
|
final ratio = screenSize.width / (screenSize.height / 2);
|
|
List<int> affCountList = [];
|
|
for (var obj in widget.affiliations.affiliationCount) {
|
|
affCountList.add(int.parse(obj));
|
|
}
|
|
int maximum = affCountList.reduce(max);
|
|
return Consumer<HcpProfileProvider>(
|
|
builder: (BuildContext context, provider, Widget? child) {
|
|
List<Widget> widgets = <Widget>[];
|
|
for (var i = 0; i < widget.kFlutterHashtags.length; i++) {
|
|
widgets.add(ScatterItem(widget.kFlutterHashtags[i], i));
|
|
}
|
|
return Scaffold(
|
|
backgroundColor: Constants.bgcolor,
|
|
body: Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 12.0),
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
// Text(
|
|
// '2024 Hematology/Oncology Pharmacy Association Annual Conference (HOPA)',
|
|
// style: TextStyle(
|
|
// color: Colors.blue,
|
|
// fontWeight: FontWeight.bold,
|
|
// fontSize: 17,
|
|
// ),
|
|
// maxLines: 2,
|
|
// softWrap: true,
|
|
// overflow: TextOverflow.ellipsis,
|
|
// ),
|
|
// Container(
|
|
// decoration: BoxDecoration(
|
|
// // color: Colors.white,
|
|
// border: Border.all(color: Colors.blueAccent)),
|
|
// width: 180,
|
|
// child: DropdownButton<String>(
|
|
// items: ["All Events Insights", "My Events Insights"]
|
|
// .map((String value) {
|
|
// return DropdownMenuItem<String>(
|
|
// value: value,
|
|
// child: Text(value),
|
|
// );
|
|
// }).toList(),
|
|
// value: _value,
|
|
// onChanged: (value) {
|
|
// setState(() {
|
|
// _value = value!;
|
|
// });
|
|
// },
|
|
// ),
|
|
// ),
|
|
// SizedBox(
|
|
// height: 20,
|
|
// ),
|
|
labelWidget("Topics Discussed"),
|
|
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: FittedBox(
|
|
child: Scatter(
|
|
fillGaps: true,
|
|
delegate:
|
|
ArchimedeanSpiralScatterDelegate(ratio: ratio),
|
|
children: widgets,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 20,
|
|
),
|
|
labelWidget("Specialty of speakers"),
|
|
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,
|
|
),
|
|
// child: PieChartWidget([
|
|
// Sector(
|
|
// value: 35.0,
|
|
// color: Colors.purple,
|
|
// title: "35% Engineering"),
|
|
// Sector(
|
|
// value: 40, color: Colors.amber, title: "40% Development"),
|
|
// Sector(value: 55, color: Colors.green, title: "55% Social"),
|
|
// Sector(value: 70, color: Colors.orange, title: "70% Live"),
|
|
// ]),
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 20,
|
|
),
|
|
labelWidget("Speaker counts by providers"),
|
|
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(
|
|
height: 20,
|
|
),
|
|
labelWidget("Session Notes"),
|
|
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: provider.allSessionNotesList.length > 3
|
|
? screenSize.height
|
|
: 400,
|
|
minHeight: 400),
|
|
// height: double.minPositive,
|
|
decoration: BoxDecoration(
|
|
borderRadius: BorderRadius.all(Radius.circular(20)),
|
|
color: Colors.white,
|
|
),
|
|
child: provider.allSessionNotesList.isNotEmpty
|
|
? ListView.separated(
|
|
padding: EdgeInsets.zero,
|
|
itemCount: provider.allSessionNotesList.length,
|
|
itemBuilder: (context, index) {
|
|
return ExpansionTile(
|
|
initiallyExpanded: true,
|
|
shape: Border(),
|
|
expandedCrossAxisAlignment:
|
|
CrossAxisAlignment.start,
|
|
expandedAlignment: Alignment.topLeft,
|
|
childrenPadding: EdgeInsets.all(8.0),
|
|
title: Text(
|
|
"\"${provider.allSessionNotesList[index].notes}\"",
|
|
style: TextStyle(
|
|
fontSize: 15,
|
|
fontStyle: FontStyle.italic)),
|
|
subtitle: Padding(
|
|
padding: const EdgeInsets.symmetric(
|
|
vertical: 8.0),
|
|
child: Row(
|
|
mainAxisAlignment:
|
|
MainAxisAlignment.spaceBetween,
|
|
children: [
|
|
Text(
|
|
"Added by: ${provider.allSessionNotesList[index].addedBy}",
|
|
style: TextStyle(
|
|
color: Colors.grey[900],
|
|
fontSize: 12),
|
|
),
|
|
Text(
|
|
"On: ${provider.allSessionNotesList[index].addedDate}",
|
|
style: TextStyle(
|
|
color: Colors.grey[900],
|
|
fontSize: 12),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
children: [
|
|
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(
|
|
"Session: ${provider.allSessionNotesList[index].selectedSession}",
|
|
maxLines: 3,
|
|
style: TextStyle(
|
|
// decoration: TextDecoration.underline,
|
|
// decorationColor: Colors.blue,
|
|
//fontFamily: "SourceSerif",
|
|
color: Colors.grey[700],
|
|
|
|
//fontStyle: FontStyle.italic,
|
|
fontSize: 14),
|
|
),
|
|
SizedBox(
|
|
height: 5,
|
|
),
|
|
Text(
|
|
"Speaker: ${provider.allSessionNotesList[index].hcpname}",
|
|
maxLines: 3,
|
|
style: TextStyle(
|
|
// decoration: TextDecoration.underline,
|
|
// decorationColor: Colors.blue,
|
|
//fontFamily: "SourceSerif",
|
|
color: Colors.grey[700],
|
|
|
|
//fontStyle: FontStyle.italic,
|
|
fontSize: 14),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
// 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 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<Sector> 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<PieChartSectionData> _chartSections(List<Sector> sectors) {
|
|
final List<PieChartSectionData> 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<Sector> 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<PieChartSectionData> _chartSections(List<Sector> sectors) {
|
|
final List<PieChartSectionData> 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});
|
|
}
|