From e0b5df3de2015f17fbb0e13b9de6990453a3ba63 Mon Sep 17 00:00:00 2001 From: marcoabat Date: Mon, 7 Aug 2023 00:26:03 +0200 Subject: [PATCH] change title of checklist --- lib/main.dart | 2 - lib/pages/detail_checklist_page.dart | 114 +++++++++++++++++++-------- lib/services/dbhelper.dart | 6 ++ 3 files changed, 85 insertions(+), 37 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 6f799df..d844b68 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -28,8 +28,6 @@ class MyApp extends StatelessWidget { title: 'Briessenchecker', theme: ThemeData.dark( useMaterial3: true, - ).copyWith( - colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), ), initialRoute: '/', routes: { diff --git a/lib/pages/detail_checklist_page.dart b/lib/pages/detail_checklist_page.dart index 8c45471..dd366e3 100644 --- a/lib/pages/detail_checklist_page.dart +++ b/lib/pages/detail_checklist_page.dart @@ -17,14 +17,16 @@ class DetailChecklistPage extends StatefulWidget { } class _DetailChecklistPageState extends State { - late Future> _checklistFutures; - late final ChecklistProvider _checklistProvider; - Checklist? _checklist; - List _items = []; - int? _selectedItemId; String? pageTitle; List selectedItemIndexes = []; + Checklist? _checklist; + late Future> _checklistFutures; + late final ChecklistProvider _checklistProvider; + List _items = []; + int? _selectedItemId; + bool _titleEditMode = false; + @override void dispose() { super.dispose(); @@ -38,6 +40,13 @@ class _DetailChecklistPageState extends State { _checklistFutures = initFutures(_checklistProvider.selectedChecklistId!); } + Future> initFutures(int checklistId) async { + return Future.wait([ + DbHelper.getChecklistById(checklistId), + DbHelper.getItemsByChecklistId(checklistId), + ]); + } + Widget _futureBuilder( BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { @@ -131,29 +140,6 @@ class _DetailChecklistPageState extends State { ); } - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(pageTitle ?? ''), - actions: [ - if (selectedItemIndexes.isNotEmpty) - IconButton( - onPressed: _onDeleteItemsPressed, - icon: const Icon(Icons.delete)) - ], - ), - body: FutureBuilder( - future: _checklistFutures, - builder: _futureBuilder, - ), - floatingActionButton: FloatingActionButton( - onPressed: _addItemTapped, - child: const Icon(Icons.add), - ), - ); - } - Widget? _itemListBuilder(BuildContext context, int index) { return ItemListTile( title: _items.elementAt(index).title, @@ -165,13 +151,6 @@ class _DetailChecklistPageState extends State { ); } - Future> initFutures(int checklistId) async { - return Future.wait([ - DbHelper.getChecklistById(checklistId), - DbHelper.getItemsByChecklistId(checklistId), - ]); - } - void _itemSelectionChanged(bool isSelected, int index) { if (isSelected) { setState(() { @@ -191,4 +170,69 @@ class _DetailChecklistPageState extends State { } DbHelper.deleteItemsById(itemIds); } + + Widget get _pageTitleBuilder { + TextEditingController titleController = TextEditingController(); + if (!_titleEditMode) { + return GestureDetector( + onTap: () => setState(() => _titleEditMode = true), + child: Text(pageTitle ?? '')); + } else { + titleController.text = pageTitle ?? ''; + return Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SizedBox( + width: 300, + height: Theme.of(context).appBarTheme.toolbarHeight, + child: TextField( + autofocus: true, + controller: titleController, + ), + ), + IconButton( + onPressed: () => _onTitleChanged( + _checklist!.id, + titleController.text, + ), + icon: const Icon(Icons.check), + ), + IconButton( + onPressed: () => setState(() => _titleEditMode = false), + icon: const Icon(Icons.cancel_outlined)) + ], + ); + } + } + + void _onTitleChanged(int id, String title) { + setState(() { + pageTitle = title; + _titleEditMode = false; + DbHelper.updateChecklistTitle(id, title); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: _pageTitleBuilder, + actions: [ + if (selectedItemIndexes.isNotEmpty) + IconButton( + onPressed: _onDeleteItemsPressed, + icon: const Icon(Icons.delete)) + ], + ), + body: FutureBuilder( + future: _checklistFutures, + builder: _futureBuilder, + ), + floatingActionButton: FloatingActionButton( + onPressed: _addItemTapped, + child: const Icon(Icons.add), + ), + ); + } } diff --git a/lib/services/dbhelper.dart b/lib/services/dbhelper.dart index 28eba0c..de1cf6c 100644 --- a/lib/services/dbhelper.dart +++ b/lib/services/dbhelper.dart @@ -49,6 +49,12 @@ class DbHelper { return checklists; } + static Future updateChecklistTitle(int id, String title) async { + await _client + .from(checklistsTableName) + .update({'title': title}).eq('id', id); + } + /// returns id of newly created checklist static Future addOrUpdateChecklist(Checklist? checklist) async { final ownerId = _client.auth.currentSession!.user.id;