From 1c4c0dbc69efacbf92ba8f678f9f650c295d55f4 Mon Sep 17 00:00:00 2001 From: JMARyA Date: Sat, 21 Sep 2024 19:34:10 +0200 Subject: [PATCH] add location scanning + overview --- lib/pages/locations.dart | 149 +++++++++++++++++++++++++++------------ pubspec.lock | 24 +++---- 2 files changed, 117 insertions(+), 56 deletions(-) diff --git a/lib/pages/locations.dart b/lib/pages/locations.dart index 5f14155..6b98cf0 100644 --- a/lib/pages/locations.dart +++ b/lib/pages/locations.dart @@ -1,14 +1,69 @@ import 'package:cdb_ui/api.dart'; import 'package:cdb_ui/pages/transaction.dart'; import 'package:flutter/material.dart'; +import 'package:qr_bar_code_scanner_dialog/qr_bar_code_scanner_dialog.dart'; -class LocationsPage extends StatelessWidget { +class LocationsPage extends StatefulWidget { const LocationsPage({super.key}); + @override + State createState() => _LocationsPageState(); +} + +class _LocationsPageState extends State { + Map? locations; + + @override + void initState() { + super.initState(); + API().getLocations().then( + (value) { + setState(() { + locations = value; + }); + }, + ); + } + @override Widget build(BuildContext context) { // todo : add locations tree view - return const Scaffold(); + + if (locations == null) { + return const Scaffold( + body: CircularProgressIndicator(), + ); + } + + return Scaffold( + appBar: AppBar( + title: const Text("Locations"), + ), + body: null, + floatingActionButton: FloatingActionButton( + onPressed: () { + // scan location code + QrBarCodeScannerDialog().getScannedQrBarCode( + context: context, + onCode: (code) { + // library is retarded + code = code!.replaceFirst("Code scanned = ", ""); + if (!locations!.containsKey(code)) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('The location $code does not exist.')), + ); + return; + } + + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => LocationView(locations![code]!), + )); + }, + ); + }, + child: const Icon(Icons.qr_code), + ), + ); } } @@ -34,53 +89,59 @@ class _LocationViewState extends State { appBar: AppBar( title: Text(widget.location.name), ), - body: Column( - children: [ - Card( - child: Column( + body: Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + children: [ + Card( + child: Column( + children: [ + if (widget.location.parent != null) + Text("Inside: ${widget.location.parent!}"), + if (widget.location.conditions?.temperature != null) + Text( + "Temperature: ${widget.location.conditions!.temperature} C°") + ], + ), + ), + Row( children: [ - if (widget.location.parent != null) - Text("Inside: ${widget.location.parent!}"), - if (widget.location.conditions?.temperature != null) - Text( - "Temperature: ${widget.location.conditions!.temperature} C°") + Checkbox( + value: !recursive, + onChanged: (bool? newValue) { + setState(() { + recursive = !(newValue ?? false); + }); + }, + ), + const Expanded( + child: Text( + 'Show only exact matches with location', + style: TextStyle(fontSize: 16), + ), + ), ], ), - ), - Row( - children: [ - Checkbox( - value: !recursive, - onChanged: (bool? newValue) { - setState(() { - recursive = !(newValue ?? false); - }); + Expanded( + child: FutureBuilder( + future: API().getTransactionsOfLocation(widget.location.id, + recursive: recursive), + builder: (context, snapshot) { + if (!snapshot.hasData) { + return const CircularProgressIndicator(); + } + + var data = snapshot.data!; + + return ListView( + children: data + .map((x) => TransactionCard(x, refresh)) + .toList()); }, ), - const Expanded( - child: Text( - 'Show only exact matches with location', - style: TextStyle(fontSize: 16), - ), - ), - ], - ), - FutureBuilder( - future: API().getTransactionsOfLocation(widget.location.id, - recursive: recursive), - builder: (context, snapshot) { - if (!snapshot.hasData) { - return const CircularProgressIndicator(); - } - - var data = snapshot.data!; - - return ListView( - children: - data.map((x) => TransactionCard(x, refresh)).toList()); - }, - ) - ], + ) + ], + ), ), ); } diff --git a/pubspec.lock b/pubspec.lock index 18a3532..7649375 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -180,18 +180,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -220,18 +220,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" path: dependency: transitive description: @@ -425,10 +425,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" typed_data: dependency: transitive description: @@ -457,10 +457,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: