UI looking FANTASTIC
new organisations dialog added with very sexy listView
This commit is contained in:
parent
59f69b102f
commit
eaf7a06f52
4 changed files with 173 additions and 57 deletions
|
@ -2,6 +2,7 @@ import 'dart:convert';
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:http/http.dart' as http;
|
import 'package:http/http.dart' as http;
|
||||||
import 'package:local_spend/common/functions/get_token.dart';
|
import 'package:local_spend/common/functions/get_token.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class Category {
|
class Category {
|
||||||
String name;
|
String name;
|
||||||
|
@ -13,6 +14,24 @@ class Category {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<DropdownMenuItem<String>>> getCategoriesList() async {
|
||||||
|
//TODO: Return a list of [String, String] where {1} is categoryName and {2} is categoryValue for request
|
||||||
|
var categoriesList = List<DropdownMenuItem>();
|
||||||
|
|
||||||
|
var categories = await getCategories();
|
||||||
|
|
||||||
|
categories.forEach((thisCategory) {
|
||||||
|
var thisMap = new DropdownMenuItem(
|
||||||
|
child: new Text(thisCategory.name),
|
||||||
|
value: thisCategory.index,
|
||||||
|
);
|
||||||
|
|
||||||
|
categoriesList.add(thisMap);
|
||||||
|
});
|
||||||
|
|
||||||
|
return categoriesList;
|
||||||
|
}
|
||||||
|
|
||||||
Future<List<Category>> getCategories() async { // confusing name
|
Future<List<Category>> getCategories() async { // confusing name
|
||||||
const url = "https://dev.peartrade.org/api/search/category";
|
const url = "https://dev.peartrade.org/api/search/category";
|
||||||
var token;
|
var token;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import 'package:http/http.dart' as http;
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:local_spend/common/functions/get_token.dart';
|
import 'package:local_spend/common/functions/get_token.dart';
|
||||||
|
|
||||||
|
|
||||||
class Organisation {
|
class Organisation {
|
||||||
var id = 0;
|
var id = 0;
|
||||||
var name = "";
|
var name = "";
|
||||||
|
@ -11,40 +12,22 @@ class Organisation {
|
||||||
var streetName = ""; //street_name
|
var streetName = ""; //street_name
|
||||||
var town = "";
|
var town = "";
|
||||||
|
|
||||||
Organisation(int id, String name, String postcode, String streetName, String town) {
|
Organisation(
|
||||||
this.id = id;
|
this.id,
|
||||||
this.name = name;
|
this.name,
|
||||||
this.postcode = postcode;
|
this.postcode,
|
||||||
this.streetName = streetName; //street_name
|
this.streetName,
|
||||||
this.town = town;
|
this.town,
|
||||||
}
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Organisation> jsonToOrganisations(String json) {
|
List<Organisation> jsonToOrganisations(String json) {
|
||||||
Map decoded = jsonDecode(json);
|
Map decoded = jsonDecode(json);
|
||||||
// print(decoded);
|
|
||||||
|
|
||||||
List<dynamic> validated = decoded['validated'];
|
List<dynamic> validated = decoded['validated'];
|
||||||
// Map organisation = validated[0];
|
|
||||||
//
|
|
||||||
// print("");
|
|
||||||
// print("Response:");
|
|
||||||
// for (var i = 0; i < validated.length; i++) {
|
|
||||||
// print(validated[i]);
|
|
||||||
// }
|
|
||||||
|
|
||||||
List<Map> organisationsMaps = new List<Map>();
|
List<Map> organisationsMaps = new List<Map>();
|
||||||
|
|
||||||
validated.forEach((element) => organisationsMaps.add(element));
|
validated.forEach((element) => organisationsMaps.add(element));
|
||||||
|
|
||||||
// print("");
|
|
||||||
// print("organisationsMaps:");
|
|
||||||
// print(organisationsMaps);
|
|
||||||
|
|
||||||
List<Organisation> organisations = new List<Organisation>();
|
List<Organisation> organisations = new List<Organisation>();
|
||||||
|
|
||||||
// organisationsMaps[0].forEach((k,v) => print('${k}: ${v}'));
|
|
||||||
|
|
||||||
for (var i = 0; i < organisationsMaps.length; i++) {
|
for (var i = 0; i < organisationsMaps.length; i++) {
|
||||||
final params = organisationsMaps[i].values.toList();
|
final params = organisationsMaps[i].values.toList();
|
||||||
|
@ -60,17 +43,6 @@ List<Organisation> jsonToOrganisations(String json) {
|
||||||
organisations.add(newOrganisation);
|
organisations.add(newOrganisation);
|
||||||
}
|
}
|
||||||
|
|
||||||
// the reason some organizations do not show up is because they are not all validated
|
|
||||||
// option to 'show unvalidated' should be added along with maybe a settings section
|
|
||||||
//
|
|
||||||
// print("");
|
|
||||||
// print("Local:");
|
|
||||||
// for (var i = 0; i < organisations.length; i++)
|
|
||||||
// {
|
|
||||||
// print(organisations[i].name);
|
|
||||||
// }
|
|
||||||
// print("");
|
|
||||||
|
|
||||||
return organisations;
|
return organisations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +64,6 @@ Future<List<Organisation>> findOrganisations(String search) async {
|
||||||
body: json.encode(body),
|
body: json.encode(body),
|
||||||
);
|
);
|
||||||
|
|
||||||
// print(response.body);
|
|
||||||
|
|
||||||
if (response.statusCode == 200) {
|
if (response.statusCode == 200) {
|
||||||
//request successful
|
//request successful
|
||||||
return jsonToOrganisations(response.body);
|
return jsonToOrganisations(response.body);
|
||||||
|
|
79
lib/common/widgets/organisations_dialog.dart
Normal file
79
lib/common/widgets/organisations_dialog.dart
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:local_spend/common/apifunctions/find_organisations.dart';
|
||||||
|
|
||||||
|
class FindOrganisations {
|
||||||
|
|
||||||
|
TextField getSearchBar(TextEditingController controller, String hintText) {
|
||||||
|
return TextField(
|
||||||
|
controller: controller,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
hintText: hintText,
|
||||||
|
icon: Icon(Icons.search),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Text> getStuff() {
|
||||||
|
var numItems = 200;
|
||||||
|
var itemsList = new List<Text>();
|
||||||
|
|
||||||
|
for (int i = 0; i < numItems; i++) {
|
||||||
|
itemsList.add(Text(
|
||||||
|
"Payee " + (i + 1).toString(),
|
||||||
|
style: new TextStyle(fontSize: 18),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<Organisation> dialog(context) {
|
||||||
|
var searchBar = getSearchBar(null, "Payee Name");
|
||||||
|
var stuff = getStuff();
|
||||||
|
return showDialog<Organisation>(
|
||||||
|
context: context,
|
||||||
|
barrierDismissible: true,
|
||||||
|
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return SimpleDialog(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 10),
|
||||||
|
child: searchBar,
|
||||||
|
),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.all(10),
|
||||||
|
width: MediaQuery.of(context).size.width * 0.7,
|
||||||
|
height: MediaQuery.of(context).size.height * 0.7,
|
||||||
|
|
||||||
|
child: Material(
|
||||||
|
shadowColor: Colors.transparent,
|
||||||
|
color: Colors.transparent,
|
||||||
|
child: ListView.builder(
|
||||||
|
itemCount: stuff.length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return Card(
|
||||||
|
child: ListTile(
|
||||||
|
leading: Icon(Icons.person),
|
||||||
|
title: stuff[index],
|
||||||
|
trailing: Icon(Icons.arrow_forward_ios),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
// help button for if org not listed
|
||||||
|
// cancel and ok buttons
|
||||||
|
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,17 +2,27 @@ 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:intl/intl.dart';
|
import 'package:intl/intl.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:local_spend/common/apifunctions/find_organisations.dart';
|
||||||
|
import 'package:local_spend/common/widgets/organisations_dialog.dart';
|
||||||
|
|
||||||
class Transaction {
|
class Transaction {
|
||||||
DateTime date;
|
DateTime date;
|
||||||
double amount;
|
TextEditingController amount;
|
||||||
|
Organisation organisation;
|
||||||
|
|
||||||
Transaction(
|
Transaction(
|
||||||
this.date,
|
this.date,
|
||||||
this.amount,
|
this.amount,
|
||||||
|
this.organisation,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find Organisations
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// end Find Organisations
|
||||||
|
|
||||||
class ReceiptPage2 extends StatefulWidget {
|
class ReceiptPage2 extends StatefulWidget {
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() {
|
State<StatefulWidget> createState() {
|
||||||
|
@ -21,7 +31,11 @@ class ReceiptPage2 extends StatefulWidget {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReceiptPage2State extends State<ReceiptPage2> {
|
class ReceiptPage2State extends State<ReceiptPage2> {
|
||||||
Transaction transaction = new Transaction(DateTime.now(), 0);
|
Transaction transaction = new Transaction(
|
||||||
|
DateTime.now(),
|
||||||
|
new TextEditingController(),
|
||||||
|
new Organisation(null, null, null, null, null),
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -116,6 +130,50 @@ class ReceiptPage2State extends State<ReceiptPage2> {
|
||||||
),
|
),
|
||||||
), // Date/Time picker
|
), // Date/Time picker
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: EdgeInsets.fromLTRB(25,15,15.0,0.0),
|
||||||
|
child: Row(
|
||||||
|
children: <Widget> [
|
||||||
|
Container(
|
||||||
|
child : Text(
|
||||||
|
"Payee",
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 18,
|
||||||
|
color: Colors.black,
|
||||||
|
fontWeight: FontWeight.bold,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
width: 110,
|
||||||
|
),
|
||||||
|
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
|
||||||
|
height: 32.0,
|
||||||
|
child: RaisedButton(
|
||||||
|
onPressed: () {
|
||||||
|
// var popupListView = new PopupListView();
|
||||||
|
// var dialog = popupListView.dialog(context, optionsList, "Choose Organization");
|
||||||
|
var organisations = new FindOrganisations();
|
||||||
|
var orgDialog = organisations.dialog(context);
|
||||||
|
|
||||||
|
orgDialog.then((organisation) {
|
||||||
|
debugPrint(organisation.name);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
transaction.organisation.name == null
|
||||||
|
? 'Find'
|
||||||
|
: transaction.organisation.name,
|
||||||
|
style:
|
||||||
|
TextStyle(color: Colors.white, fontSize: 18.0),
|
||||||
|
),
|
||||||
|
color: Colors.blue,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
), // Organisation picker
|
||||||
|
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.fromLTRB(25,15,15.0,0.0),
|
padding: EdgeInsets.fromLTRB(25,15,15.0,0.0),
|
||||||
child: Row(
|
child: Row(
|
||||||
|
@ -136,23 +194,13 @@ class ReceiptPage2State extends State<ReceiptPage2> {
|
||||||
Container(
|
Container(
|
||||||
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
|
padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
|
||||||
height: 32.0,
|
height: 32.0,
|
||||||
child: RaisedButton(
|
width: 100,
|
||||||
onPressed: () {
|
child: TextField(
|
||||||
showModalBottomSheet(
|
controller: transaction.amount,
|
||||||
context: context,
|
decoration: InputDecoration(
|
||||||
builder: (BuildContext builder) {
|
hintText: "£0.00"
|
||||||
return Container(
|
|
||||||
height: MediaQuery.of(context).copyWith().size.height / 3,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
},// onPressed: () => showDatePicker(context: context, initialDate: _transactionDate, firstDate: null, lastDate: _transactionDate),
|
|
||||||
child: Text(
|
|
||||||
transaction.amount == null
|
|
||||||
? 'None set.'
|
|
||||||
: "£" + transaction.amount.toString() + "0",
|
|
||||||
style : TextStyle(color: Colors.white, fontSize: 18.0),
|
|
||||||
),
|
),
|
||||||
color: Colors.blue,
|
keyboardType: TextInputType.number,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
|
Reference in a new issue