diff --git a/lib/config/urls.dart b/lib/config/urls.dart index f0d8731..a6e5f98 100755 --- a/lib/config/urls.dart +++ b/lib/config/urls.dart @@ -31,6 +31,8 @@ class Url { static const String exportPackages = '$baseUrl/export/packages'; + static const String exportCycles = '$baseUrl/export/cycles'; + static String testResults(int id) { return '$baseUrl/TestResults?page=$id'; } diff --git a/lib/pages/CyclePages/cycle_result_screen.dart b/lib/pages/CyclePages/cycle_result_screen.dart index ab17075..a22407b 100755 --- a/lib/pages/CyclePages/cycle_result_screen.dart +++ b/lib/pages/CyclePages/cycle_result_screen.dart @@ -1,7 +1,9 @@ import 'package:cssd/config/colors.dart'; +import 'package:permission_handler/permission_handler.dart'; import '../../config/routes.dart'; +import '../../providers/auth.dart'; import '../../providers/connectivity.dart'; import '../../widgets/CycleScreens/Result/banner.dart'; import '../../widgets/CycleScreens/Result/data_box.dart'; @@ -266,9 +268,37 @@ class CycleResultFloatingButton extends StatelessWidget { @override Widget build(BuildContext context) { + final userData = Provider.of(context, listen: false).user; return Row( mainAxisAlignment: MainAxisAlignment.end, children: [ + if (userData['roles'].contains('Supervisor') || + userData['roles'].contains('Admin')) + InkWell( + customBorder: CircleBorder(), + onTap: () async { + var status = await Permission.storage.request(); + if (status.isGranted) { + Provider.of(context, listen: false) + .exportCycles(); + } + }, + child: Container( + padding: EdgeInsets.all(_deviceBlockSize), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.black, + ), + child: Icon( + Icons.import_export, + size: 10 * _deviceBlockSize, + color: Colors.white, + ), + ), + ), + SizedBox( + width: 2 * _deviceBlockSize, + ), InkWell( customBorder: CircleBorder(), onTap: () { diff --git a/lib/providers/cycles.dart b/lib/providers/cycles.dart index f6efdce..c9977ae 100755 --- a/lib/providers/cycles.dart +++ b/lib/providers/cycles.dart @@ -1,6 +1,8 @@ import 'dart:convert'; +import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:fluttertoast/fluttertoast.dart'; +import 'package:path_provider/path_provider.dart'; import '../config/urls.dart'; import '../config/user.dart'; @@ -383,4 +385,19 @@ class CyclesProvider extends ChangeNotifier { // }; return result!; } + + Future exportCycles() async { + final baseStorage = await getExternalStorageDirectory(); + final taskId = await FlutterDownloader.enqueue( + url: Url.exportCycles, + savedDir: baseStorage!.path, + headers: {'Authorization': User.token, "Accept": "*"}, + showNotification: true, + openFileFromNotification: true, + saveInPublicStorage: true, + fileName: "Cycles " + DateTime.now().toString() + ".xlsx", + ); + print(taskId); + return true; + } }