diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index 22d2621..80e4747 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -92,8 +92,9 @@ class ApiClient { return ErrorOrData(data, error); } - FutureErrorOrData createTable( + FutureErrorOrData createTable( String tableName, List columns) async { + bool? ignored; Exception? error; final response = @@ -107,6 +108,8 @@ class ApiClient { final body = json.decode(await response.stream.bytesToString()); if (body['error'] != null) { error = Exception(body['error']); + } else { + ignored = true; } } else if (response.statusCode == 422) { error = Exception('Invalid request parameters'); @@ -114,7 +117,29 @@ class ApiClient { error = Exception('HTTP ${response.statusCode}'); } - return ErrorOrData(null, error); + return ErrorOrData(ignored, error); + } + + FutureErrorOrData dropTable(String tableName) async { + bool? ignored; + Exception? error; + + final response = + await post('/api/dropTable/${Uri.encodeComponent(tableName)}'); + if (response.statusCode == 200) { + final body = json.decode(await response.stream.bytesToString()); + if (body['error'] != null) { + error = Exception(body['error']); + } else { + ignored = true; + } + } else if (response.statusCode == 422) { + error = Exception('Invalid request parameters'); + } else { + error = Exception('HTTP ${response.statusCode}'); + } + + return ErrorOrData(ignored, error); } Future get( diff --git a/lib/pages/bottomsheers/edit_table_bottomsheet.dart b/lib/pages/bottomsheets/edit_table_bottomsheet.dart similarity index 100% rename from lib/pages/bottomsheers/edit_table_bottomsheet.dart rename to lib/pages/bottomsheets/edit_table_bottomsheet.dart diff --git a/lib/pages/bottomsheets/open_table_bottomsheet.dart b/lib/pages/bottomsheets/open_table_bottomsheet.dart new file mode 100644 index 0000000..cce3d23 --- /dev/null +++ b/lib/pages/bottomsheets/open_table_bottomsheet.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:recase/recase.dart'; +import 'package:tuuli_app/api/api_client.dart'; +import 'package:tuuli_app/api/model/tables_list_model.dart'; + +class OpenTableBottomSheet extends StatefulWidget { + final TableModel table; + + const OpenTableBottomSheet({super.key, required this.table}); + + @override + State createState() => _OpenTableBottomSheetState(); +} + +class _OpenTableBottomSheetState extends State { + final apiClient = Get.find(); + + @override + Widget build(BuildContext context) { + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + widget.table.tableName.pascalCase, + style: Theme.of(context).textTheme.headlineSmall, + ), + const Spacer(), + IconButton( + onPressed: _dropTable, + icon: const Icon(Icons.delete), + ), + IconButton( + onPressed: Get.back, + icon: const Icon(Icons.cancel), + ), + ], + ), + const Divider(), + ], + ), + ), + ); + } + + Future _dropTable() async { + final really = await Get.defaultDialog( + title: "Drop table", + middleText: + "Are you sure you want to drop this table \"${widget.table.tableName}\"?", + textConfirm: "Drop", + onConfirm: () => Get.back(result: true), + onCancel: () => Get.back(result: false), + barrierDismissible: false, + ); + + if (really != true) { + return; + } + + final result = await apiClient.dropTable(widget.table.tableName); + result.unfold((data) { + Get.back(); + }, (error) { + Get.snackbar("Error", error.toString()); + }); + } +} diff --git a/lib/pages/home_panels/tables_list_panel.dart b/lib/pages/home_panels/tables_list_panel.dart index b83a7e3..c425e95 100644 --- a/lib/pages/home_panels/tables_list_panel.dart +++ b/lib/pages/home_panels/tables_list_panel.dart @@ -5,7 +5,8 @@ import 'package:recase/recase.dart'; import 'package:tuuli_app/api/api_client.dart'; import 'package:tuuli_app/api/model/tables_list_model.dart'; import 'package:tuuli_app/c.dart'; -import 'package:tuuli_app/pages/bottomsheers/edit_table_bottomsheet.dart'; +import 'package:tuuli_app/pages/bottomsheets/edit_table_bottomsheet.dart'; +import 'package:tuuli_app/pages/bottomsheets/open_table_bottomsheet.dart'; import 'package:tuuli_app/pages/home_page.dart'; class TablesListPanel extends StatefulWidget { @@ -184,6 +185,17 @@ class _TablesListPanelState extends State { } void _openTable(TableModel table) async { - // TODO: Open table + final result = await showFlexibleBottomSheet( + minHeight: 1, + initHeight: 1, + maxHeight: 1, + context: context, + builder: (_, __, ___) => OpenTableBottomSheet(table: table), + anchors: [0, 0.5, 1], + isSafeArea: true, + isDismissible: false, + ); + + widget.parent.refreshData(); } }