Skip to content

Commit

Permalink
Fix some issues with nav drawer, filter box, report pages etc
Browse files Browse the repository at this point in the history
  • Loading branch information
dipu-bd committed Jun 9, 2021
1 parent 93670c7 commit 343ed65
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 129 deletions.
12 changes: 1 addition & 11 deletions lib/src/pages/password_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -138,17 +138,7 @@ class _PasswordPageState extends State<PasswordPage> {
to: ['[email protected]'],
cc: [user.email!],
subject: 'Password for Sales Tracker',
body: [
'Hi,',
'<br><br>',
'Please send me the password for your Sales Tracker app!',
'<br><br>',
'My email is: <b>${user.email!}</b>',
'<br><br>',
'Thanks,',
'<br>',
'${user.displayName}',
].join('\n'),
body: 'Please send me the password for Sales Tracker app. My email is "${user.email!}"',
);
await launch('$mailtoLink');
}
Expand Down
70 changes: 36 additions & 34 deletions lib/src/pages/product_report_page.dart
Original file line number Diff line number Diff line change
@@ -1,50 +1,52 @@
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:sales_tracker/src/blocs/repository.dart';
import 'package:sales_tracker/src/models/product_report.dart';
import 'package:sales_tracker/src/pages/widgets/abstract_report_page.dart';
import 'package:sales_tracker/src/pages/widgets/product_report_view.dart';
import 'package:sales_tracker/src/pages/widgets/report_page_widget.dart';
import 'package:sales_tracker/src/utils/generate_product_report.dart';

class ProductReportPage extends AbstractReportPage<ProductReport> {
static Future<void> display(BuildContext context) {
return showReportPage(
context: context,
saveButtonText: 'Generate Product Report',
builder: (start, end) => ProductReportPage(start, end),
);
}
class ProductReportPage extends StatelessWidget {
static Future<void> display(BuildContext context) async {
final navigator = Navigator.of(context, rootNavigator: true);

ProductReportPage(DateTime start, DateTime end)
: super(
startDate: start,
endDate: end,
titleText: 'Product Report',
fetchFailureText: 'Could not fetch products',
);
DateTimeRange? range = await selectDateRange(
context,
'Generate Product Report',
);
if (range == null) return;

@override
Stream<ProductReport> getReportStream(BuildContext context) {
return Repository.of(context).getProductReport(startDate, endDate);
await navigator.push(
MaterialPageRoute(
maintainState: true,
fullscreenDialog: false,
builder: (context) => ProductReportPage(range.start, range.end),
),
);
}

@override
Widget buildReportView(ProductReport report) {
return ProductReportView(report);
}
final DateTime start;
final DateTime end;

@override
Future<Uint8List> generateReport(ProductReport report) {
return generateProductReport(report);
}
ProductReportPage(this.start, this.end);

@override
String getReportFileName(ProductReport report) {
final formatter = DateFormat('yyyy-MM-dd');
final startStr = formatter.format(startDate);
final endStr = formatter.format(endDate);
return 'Products_${startStr}_$endStr.pdf';
Widget build(BuildContext context) {
return ReportPageWidget<ProductReport>(
startDate: start,
endDate: end,
titleText: 'Product Report',
fetchFailureText: 'Could not fetch products',
onGenerateReport: generateProductReport,
onGetReportStream: () =>
Repository.of(context).getProductReport(start, end),
reportViewBuilder: (report) => ProductReportView(report),
onGetReportFileName: (report) {
final formatter = DateFormat('yyyy-MM-dd');
final startStr = formatter.format(start);
final endStr = formatter.format(end);
return 'Products_${startStr}_$endStr.pdf';
},
);
}
}
70 changes: 36 additions & 34 deletions lib/src/pages/sales_report_page.dart
Original file line number Diff line number Diff line change
@@ -1,50 +1,52 @@
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:sales_tracker/src/blocs/repository.dart';
import 'package:sales_tracker/src/models/sales_report.dart';
import 'package:sales_tracker/src/pages/widgets/abstract_report_page.dart';
import 'package:sales_tracker/src/pages/widgets/report_page_widget.dart';
import 'package:sales_tracker/src/pages/widgets/sales_report_view.dart';
import 'package:sales_tracker/src/utils/generate_sales_report.dart';

class SalesReportPage extends AbstractReportPage<SalesReport> {
static Future<void> display(BuildContext context) {
return showReportPage(
context: context,
saveButtonText: 'Generate Sales Report',
builder: (start, end) => SalesReportPage(start, end),
);
}
class SalesReportPage extends StatelessWidget {
static Future<void> display(BuildContext context) async {
final navigator = Navigator.of(context, rootNavigator: true);

SalesReportPage(DateTime start, DateTime end)
: super(
startDate: start,
endDate: end,
titleText: 'Sales Report',
fetchFailureText: 'Could not fetch sales records',
);
DateTimeRange? range = await selectDateRange(
context,
'Generate Sales Report',
);
if (range == null) return;

@override
Stream<SalesReport> getReportStream(BuildContext context) {
return Repository.of(context).getSalesReport(startDate, endDate);
await navigator.push(
MaterialPageRoute(
maintainState: true,
fullscreenDialog: false,
builder: (context) => SalesReportPage(range.start, range.end),
),
);
}

@override
Widget buildReportView(SalesReport report) {
return SalesReportView(report);
}
final DateTime start;
final DateTime end;

@override
Future<Uint8List> generateReport(SalesReport report) {
return generateSalesReport(report);
}
SalesReportPage(this.start, this.end);

@override
String getReportFileName(SalesReport report) {
final formatter = DateFormat('yyyy-MM-dd');
final startStr = formatter.format(startDate);
final endStr = formatter.format(endDate);
return 'Sales_${startStr}_$endStr.pdf';
Widget build(BuildContext context) {
return ReportPageWidget<SalesReport>(
startDate: start,
endDate: end,
titleText: 'Sales Report',
fetchFailureText: 'Could not fetch sales records',
onGenerateReport: generateSalesReport,
onGetReportStream: () =>
Repository.of(context).getSalesReport(start, end),
reportViewBuilder: (report) => SalesReportView(report),
onGetReportFileName: (report) {
final formatter = DateFormat('yyyy-MM-dd');
final startStr = formatter.format(start);
final endStr = formatter.format(end);
return 'Sales_${startStr}_$endStr.pdf';
},
);
}
}
10 changes: 8 additions & 2 deletions lib/src/pages/widgets/future_loading.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,22 @@ import 'package:flutter/material.dart';
import 'package:sales_tracker/src/pages/widgets/error_message.dart';

Future<T?> showFutureLoading<T>({
bool useRootNavigator: true,
required BuildContext context,
required Future<T> future,
required String loadingText,
required String errorText,
}) {
return showDialog<T>(
context: context,
useRootNavigator: useRootNavigator,
builder: (_) => FutureBuilder<T?>(
future: future,
builder: (context, snapshot) {
final navigator = Navigator.of(
context,
rootNavigator: useRootNavigator,
);
if (snapshot.connectionState != ConnectionState.done) {
return Center(
child: Card(
Expand All @@ -33,10 +39,10 @@ Future<T?> showFutureLoading<T>({
return ErrorMessage(
messageText: errorText,
errorDetails: snapshot.error,
onDismiss: () => Navigator.of(context).pop(),
onDismiss: () => navigator.pop(),
);
}
Navigator.of(context).pop(snapshot.data!);
navigator.pop(snapshot.data!);
return Container();
},
),
Expand Down
9 changes: 5 additions & 4 deletions lib/src/pages/widgets/home_page_drawer.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:sales_tracker/src/blocs/repository.dart';
import 'package:sales_tracker/src/pages/product_report_page.dart';
import 'package:sales_tracker/src/pages/sales_report_page.dart';
import 'package:sales_tracker/src/pages/widgets/product_form_dialog.dart';

Expand Down Expand Up @@ -115,9 +116,9 @@ class HomePageDrawer extends StatelessWidget {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
onTap: () {
onTap: () async {
await ProductReportPage.display(context);
Navigator.of(context).pop();
SalesReportPage.display(context);
},
);
}
Expand All @@ -130,9 +131,9 @@ class HomePageDrawer extends StatelessWidget {
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5),
),
onTap: () {
onTap: () async {
await SalesReportPage.display(context);
Navigator.of(context).pop();
SalesReportPage.display(context);
},
);
}
Expand Down
15 changes: 6 additions & 9 deletions lib/src/pages/widgets/product_list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -85,21 +85,22 @@ class _ProductListViewState extends State<ProductListView> {
if (widget.products.length < 7) {
return Container();
}

return Container(
margin: EdgeInsets.all(10),
return Padding(
padding: EdgeInsets.all(8.0),
child: TextField(
controller: filterInput,
textInputAction: TextInputAction.search,
onChanged: (text) {
filter = text.trim().toLowerCase();
if (mounted) setState(() {});
},
style: TextStyle(fontSize: 16),
decoration: InputDecoration(
isDense: true,
filled: true,
fillColor: Colors.white,
labelText: 'Filter Items',
contentPadding: EdgeInsets.symmetric(horizontal: 10, vertical: 7),
hintText: 'Filter items',
border: OutlineInputBorder(),
prefixIcon: Icon(Icons.search),
suffixIcon: SizedBox(
height: 24,
Expand All @@ -112,10 +113,6 @@ class _ProductListViewState extends State<ProductListView> {
),
),
),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(5),
),
);
}

Expand Down
Loading

0 comments on commit 343ed65

Please sign in to comment.