UI looking FANTASTIC

new organisations dialog added with very sexy listView
This commit is contained in:
Felix 2019-08-07 13:15:15 +01:00
parent 59f69b102f
commit eaf7a06f52
4 changed files with 173 additions and 57 deletions

View file

@ -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;

View file

@ -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);

View 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
],
);
},
);
}
}

View file

@ -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,
), ),
), ),
], ],