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
|
/// - total_last_week
|
||||||
/// - avg_spend_last_week
|
/// - avg_spend_last_week
|
||||||
/// - total_last_month
|
/// - total_last_month
|
||||||
/// - avg_spend_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:
|
/// HTTP POST request sample:
|
||||||
/// {"graph":"total_last_week","session_key":"blahblahblah"}
|
/// {"graph":"total_last_week","session_key":"blahblahblah"}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,9 @@ saveCurrentLogin(Map responseJson, loginEmail) async {
|
||||||
var email = (loginEmail != null)
|
var email = (loginEmail != null)
|
||||||
? loginEmail
|
? loginEmail
|
||||||
: "";
|
: "";
|
||||||
|
var userType = (responseJson != null && responseJson.isNotEmpty)
|
||||||
|
? LoginModel.fromJson(responseJson).userType
|
||||||
|
: "";
|
||||||
|
|
||||||
await preferences.setString(
|
await preferences.setString(
|
||||||
'LastUser', (user != null && user.length > 0) ? user : "");
|
'LastUser', (user != null && user.length > 0) ? user : "");
|
||||||
|
@ -23,4 +26,6 @@ saveCurrentLogin(Map responseJson, loginEmail) async {
|
||||||
'LastToken', (token != null && token.length > 0) ? token : "");
|
'LastToken', (token != null && token.length > 0) ? token : "");
|
||||||
await preferences.setString(
|
await preferences.setString(
|
||||||
'LastEmail', (email != null && email.length > 0) ? email : "");
|
'LastEmail', (email != null && email.length > 0) ? email : "");
|
||||||
|
await preferences.setString(
|
||||||
|
'LastUserType', (userType != null && userType.length > 0) ? userType : "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
class LoginModel {
|
class LoginModel {
|
||||||
final String userName;
|
final String userName;
|
||||||
final String token;
|
final String token;
|
||||||
|
final String userType;
|
||||||
|
|
||||||
LoginModel(this.userName, this.token);
|
LoginModel(this.userName, this.token, this.userType);
|
||||||
|
|
||||||
LoginModel.fromJson(Map<String, dynamic> json)
|
LoginModel.fromJson(Map<String, dynamic> json)
|
||||||
: userName = json['display_name'],
|
: userName = json['display_name'],
|
||||||
|
userType = json['user_type'],
|
||||||
token = json['session_key'];
|
token = json['session_key'];
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
'name': userName,
|
'name': userName,
|
||||||
|
'user_type': userType,
|
||||||
'token': token,
|
'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:flutter/material.dart';
|
||||||
import 'package:local_spend/common/platform/platform_scaffold.dart';
|
import 'package:local_spend/common/platform/platform_scaffold.dart';
|
||||||
import 'package:shared_preferences/shared_preferences.dart';
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
import 'package:local_spend/common/functions/logout.dart';
|
import 'package:local_spend/pages/customerGraphs.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:local_spend/pages/orgGraphs.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';
|
|
||||||
|
|
||||||
const URL = "https://flutter.io/";
|
const URL = "https://flutter.io/";
|
||||||
const demonstration = false;
|
const demonstration = false;
|
||||||
|
@ -28,17 +15,7 @@ class StatsPage extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class StatsPageState extends State<StatsPage> {
|
class StatsPageState extends State<StatsPage> {
|
||||||
|
String userType = "-";
|
||||||
/// 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");
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
|
@ -56,31 +33,17 @@ class StatsPageState extends State<StatsPage> {
|
||||||
await preferences.setString('LastPageRoute', lastRoute);
|
await preferences.setString('LastPageRoute', lastRoute);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String> _getUserType() async {
|
||||||
|
SharedPreferences preferences = await SharedPreferences.getInstance();
|
||||||
|
return await preferences.get('LastUserType');
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
if (userType == "-") {
|
||||||
// Initializing graphs:
|
_getUserType().then((value) {
|
||||||
|
print(value);
|
||||||
if (!totalLastWeekGraph.loaded) {
|
userType = '${value[0].toUpperCase()}${value.substring(1)}'; // capitalises first letter
|
||||||
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(() {});
|
setState(() {});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -88,14 +51,30 @@ class StatsPageState extends State<StatsPage> {
|
||||||
return PlatformScaffold(
|
return PlatformScaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
backgroundColor: Colors.blue[400],
|
backgroundColor: Colors.blue[400],
|
||||||
title: Text(
|
title: Row(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Text(
|
||||||
"Statistics",
|
"Statistics",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 20,
|
fontSize: 20,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
// leading: BackButton(),
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 10)
|
||||||
|
),
|
||||||
|
|
||||||
|
Text(
|
||||||
|
"User type: " + userType,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 20,
|
||||||
|
color: Colors.white70,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
iconTheme: IconThemeData(color: Colors.black),
|
iconTheme: IconThemeData(color: Colors.black),
|
||||||
),
|
),
|
||||||
|
@ -103,99 +82,7 @@ class StatsPageState extends State<StatsPage> {
|
||||||
|
|
||||||
body : Container(
|
body : Container(
|
||||||
padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
|
padding: EdgeInsets.fromLTRB(0, 0, 0, 0),
|
||||||
child: ListView(
|
child: (userType == "-" ? null : (userType.toLowerCase() == "customer" ? CustomerGraphs() : OrgGraphs())),
|
||||||
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>>
|
|
||||||
),
|
|
||||||
),
|
|
||||||
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue