implementing organisation/customer-specific graphs
This commit is contained in:
parent
05a57e8203
commit
6cd65b8ac6
6 changed files with 250 additions and 154 deletions
|
@ -86,12 +86,27 @@ class GraphData {
|
|||
];
|
||||
}
|
||||
|
||||
/// Graph types:
|
||||
// TODO: Show available graph types based on whether or not the user is an Organisation or User
|
||||
|
||||
/// Customer graph types: https://dev.peartrade.org/api/v1/customer/graphs
|
||||
/// - total_last_week
|
||||
/// - avg_spend_last_week
|
||||
/// - total_last_month
|
||||
/// - avg_spend_last_month
|
||||
///
|
||||
/// Organisations' graphs types: to fetch, POST to https://dev.peartrade.org/api/stats/[name] as {"session_key":"[boop beep]"}
|
||||
/// - organisations_all : organisation
|
||||
/// - pies : organisation/pies
|
||||
/// - snippets : organisation/snippets
|
||||
/// - graphs : organisation/graphs
|
||||
/// - {"graph":"customers_last_7_days","session_key":"[bleep]"}
|
||||
/// - {"graph":"customers_last_30_days","session_key":"[blah]"}
|
||||
/// - {"graph":"sales_last_7_days","session_key":"[bloop]"}
|
||||
/// - {"graph":"sales_last_7_days","session_key":"[reee]"}
|
||||
/// - {"graph":"purchases_last_7_days","session_key":"[yee]"}
|
||||
/// - {"graph":"purchases_last_30_days","session_key":"[yah]"}
|
||||
/// - {"graph":"purchases_all;","session_key":"[kappa]"} // I don't think this one works
|
||||
///
|
||||
/// HTTP POST request sample:
|
||||
/// {"graph":"total_last_week","session_key":"blahblahblah"}
|
||||
|
||||
|
|
|
@ -16,6 +16,9 @@ saveCurrentLogin(Map responseJson, loginEmail) async {
|
|||
var email = (loginEmail != null)
|
||||
? loginEmail
|
||||
: "";
|
||||
var userType = (responseJson != null && responseJson.isNotEmpty)
|
||||
? LoginModel.fromJson(responseJson).userType
|
||||
: "";
|
||||
|
||||
await preferences.setString(
|
||||
'LastUser', (user != null && user.length > 0) ? user : "");
|
||||
|
@ -23,4 +26,6 @@ saveCurrentLogin(Map responseJson, loginEmail) async {
|
|||
'LastToken', (token != null && token.length > 0) ? token : "");
|
||||
await preferences.setString(
|
||||
'LastEmail', (email != null && email.length > 0) ? email : "");
|
||||
await preferences.setString(
|
||||
'LastUserType', (userType != null && userType.length > 0) ? userType : "");
|
||||
}
|
||||
|
|
|
@ -1,15 +1,18 @@
|
|||
class LoginModel {
|
||||
final String userName;
|
||||
final String token;
|
||||
final String userType;
|
||||
|
||||
LoginModel(this.userName, this.token);
|
||||
LoginModel(this.userName, this.token, this.userType);
|
||||
|
||||
LoginModel.fromJson(Map<String, dynamic> json)
|
||||
: userName = json['display_name'],
|
||||
userType = json['user_type'],
|
||||
token = json['session_key'];
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'name': userName,
|
||||
'user_type': userType,
|
||||
'token': token,
|
||||
};
|
||||
}
|
||||
|
|
151
lib/pages/customerGraphs.dart
Normal file
151
lib/pages/customerGraphs.dart
Normal file
|
@ -0,0 +1,151 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:local_spend/common/apifunctions/get_graph_data.dart';
|
||||
import 'package:charts_flutter/flutter.dart' as charts;
|
||||
|
||||
class CustomerGraphs extends StatefulWidget {
|
||||
CustomerGraphs({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_CustomerGraphsState createState() {
|
||||
return _CustomerGraphsState();
|
||||
}
|
||||
}
|
||||
|
||||
class _CustomerGraphsState extends State<CustomerGraphs> {
|
||||
GraphData totalLastWeekGraph = new GraphData("total_last_week");
|
||||
GraphData avgSpendLastWeekGraph = new GraphData("avg_spend_last_week");
|
||||
GraphData totalLastMonthGraph = new GraphData("total_last_month");
|
||||
GraphData avgSpendLastMonth = new GraphData("avg_spend_last_month");
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// Initializing graphs:
|
||||
if (!totalLastWeekGraph.loaded) {
|
||||
totalLastWeekGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!avgSpendLastWeekGraph.loaded) {
|
||||
avgSpendLastWeekGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!totalLastMonthGraph.loaded) {
|
||||
totalLastMonthGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!avgSpendLastMonth.loaded) {
|
||||
avgSpendLastMonth.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
return ListView(
|
||||
children: <Widget>[
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Week's Total Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of total spend last week",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Week's Average Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of average spend last week",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Month's Total Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of total spend last month",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Month's Average Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of average spend last month",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
35
lib/pages/orgGraphs.dart
Normal file
35
lib/pages/orgGraphs.dart
Normal file
|
@ -0,0 +1,35 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:local_spend/common/apifunctions/get_graph_data.dart';
|
||||
import 'package:charts_flutter/flutter.dart' as charts;
|
||||
|
||||
class OrgGraphs extends StatefulWidget {
|
||||
OrgGraphs({Key key}) : super(key: key);
|
||||
|
||||
@override
|
||||
_OrgGraphsState createState() {
|
||||
return _OrgGraphsState();
|
||||
}
|
||||
}
|
||||
|
||||
class _OrgGraphsState extends State<OrgGraphs> {
|
||||
GraphData totalLastWeekGraph = new GraphData("total_last_week");
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListView(
|
||||
children: <Widget>[
|
||||
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,21 +1,8 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:local_spend/common/platform/platform_scaffold.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'package:local_spend/common/functions/logout.dart';
|
||||
import 'package:url_launcher/url_launcher.dart';
|
||||
import 'package:local_spend/common/functions/customAbout.dart' as custom;
|
||||
import 'package:local_spend/common/functions/showDialogTwoButtons.dart';
|
||||
import 'package:local_spend/common/widgets/charts/donut_chart.dart';
|
||||
import 'package:local_spend/common/widgets/charts/outside_label.dart';
|
||||
import 'package:local_spend/common/widgets/charts/auto_label.dart';
|
||||
import 'package:local_spend/common/widgets/charts/grouped_bar_chart.dart';
|
||||
import 'package:local_spend/common/widgets/charts/scatter_bucketingAxis_legend.dart';
|
||||
import 'package:local_spend/common/widgets/charts/numeric_line_bar_combo.dart';
|
||||
import 'package:local_spend/common/widgets/charts/series_legend_with_measures.dart';
|
||||
import 'package:local_spend/common/widgets/charts/time_series_simple.dart';
|
||||
import 'package:local_spend/common/apifunctions/get_graph_data.dart';
|
||||
import 'package:charts_flutter/flutter.dart' as charts;
|
||||
import 'package:local_spend/common/widgets/charts/chart_builder.dart';
|
||||
import 'package:local_spend/pages/customerGraphs.dart';
|
||||
import 'package:local_spend/pages/orgGraphs.dart';
|
||||
|
||||
const URL = "https://flutter.io/";
|
||||
const demonstration = false;
|
||||
|
@ -28,17 +15,7 @@ class StatsPage extends StatefulWidget {
|
|||
}
|
||||
|
||||
class StatsPageState extends State<StatsPage> {
|
||||
|
||||
/// Graph types:
|
||||
/// - total_last_week
|
||||
/// - avg_spend_last_week
|
||||
/// - total_last_month
|
||||
/// - avg_spend_last_month
|
||||
|
||||
GraphData totalLastWeekGraph = new GraphData("total_last_week");
|
||||
GraphData avgSpendLastWeekGraph = new GraphData("avg_spend_last_week");
|
||||
GraphData totalLastMonthGraph = new GraphData("total_last_month");
|
||||
GraphData avgSpendLastMonth = new GraphData("avg_spend_last_month");
|
||||
String userType = "-";
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
|
@ -56,31 +33,17 @@ class StatsPageState extends State<StatsPage> {
|
|||
await preferences.setString('LastPageRoute', lastRoute);
|
||||
}
|
||||
|
||||
Future<String> _getUserType() async {
|
||||
SharedPreferences preferences = await SharedPreferences.getInstance();
|
||||
return await preferences.get('LastUserType');
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
// Initializing graphs:
|
||||
|
||||
if (!totalLastWeekGraph.loaded) {
|
||||
totalLastWeekGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!avgSpendLastWeekGraph.loaded) {
|
||||
avgSpendLastWeekGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!totalLastMonthGraph.loaded) {
|
||||
totalLastMonthGraph.setGraphData().then((_) {
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
||||
if (!avgSpendLastMonth.loaded) {
|
||||
avgSpendLastMonth.setGraphData().then((_) {
|
||||
if (userType == "-") {
|
||||
_getUserType().then((value) {
|
||||
print(value);
|
||||
userType = '${value[0].toUpperCase()}${value.substring(1)}'; // capitalises first letter
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
|
@ -88,14 +51,30 @@ class StatsPageState extends State<StatsPage> {
|
|||
return PlatformScaffold(
|
||||
appBar: AppBar(
|
||||
backgroundColor: Colors.blue[400],
|
||||
title: Text(
|
||||
title: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Text(
|
||||
"Statistics",
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
color: Colors.white,
|
||||
),
|
||||
),
|
||||
// leading: BackButton(),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10)
|
||||
),
|
||||
|
||||
Text(
|
||||
"User type: " + userType,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
color: Colors.white70,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
centerTitle: true,
|
||||
iconTheme: IconThemeData(color: Colors.black),
|
||||
),
|
||||
|
@ -103,99 +82,7 @@ class StatsPageState extends State<StatsPage> {
|
|||
|
||||
body : Container(
|
||||
padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
|
||||
child: ListView(
|
||||
children: <Widget>[
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Week's Total Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of total spend last week",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: totalLastWeekGraph.graph != null ? new charts.TimeSeriesChart(totalLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Week's Average Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of average spend last week",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: avgSpendLastWeekGraph.graph != null ? new charts.TimeSeriesChart(avgSpendLastWeekGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Month's Total Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of total spend last month",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: totalLastMonthGraph.graph != null ? new charts.TimeSeriesChart(totalLastMonthGraph.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
Container(
|
||||
padding: EdgeInsets.fromLTRB(0.0,17,0.0,0.0),
|
||||
child : Text(
|
||||
"Last Month's Average Spend",
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
fontSize: 22.0,
|
||||
color: Colors.black,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Tooltip(
|
||||
message: "Graph of average spend last month",
|
||||
child : Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||
height: 200,
|
||||
child: avgSpendLastMonth.graph != null ? new charts.TimeSeriesChart(avgSpendLastMonth.graph) : Center(child: Text("Loading graph...")), //List<Series<dynamic, DateTime>>
|
||||
),
|
||||
),
|
||||
|
||||
],
|
||||
),
|
||||
child: (userType == "-" ? null : (userType.toLowerCase() == "customer" ? CustomerGraphs() : OrgGraphs())),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
Reference in a new issue