From 1eb1caa16723e323a9dda04cb994cc749a5a0539 Mon Sep 17 00:00:00 2001 From: marcoabat Date: Sat, 5 Aug 2023 15:17:07 +0200 Subject: [PATCH] detail page item add dialog --- lib/models/listitem.dart | 2 +- lib/pages/detail_checklist_page.dart | 96 ++++++++++++++++++++++------ lib/services/dbhelper.dart | 6 ++ 3 files changed, 83 insertions(+), 21 deletions(-) diff --git a/lib/models/listitem.dart b/lib/models/listitem.dart index 6183f71..eea3e4d 100644 --- a/lib/models/listitem.dart +++ b/lib/models/listitem.dart @@ -1,5 +1,5 @@ class Item { - final int id; + final int? id; final String ownerId; String title; String description; diff --git a/lib/pages/detail_checklist_page.dart b/lib/pages/detail_checklist_page.dart index 20ef37d..980dbc6 100644 --- a/lib/pages/detail_checklist_page.dart +++ b/lib/pages/detail_checklist_page.dart @@ -1,4 +1,5 @@ import 'package:briessenchecker/models/checklist.dart'; +import 'package:briessenchecker/models/listitem.dart'; import 'package:briessenchecker/services/checklist_provider.dart'; import 'package:briessenchecker/services/dbhelper.dart'; import 'package:flutter/material.dart'; @@ -6,6 +7,7 @@ import 'package:provider/provider.dart'; class DetailChecklistPage extends StatefulWidget { const DetailChecklistPage({super.key}); + static const routeName = '/detail'; @override @@ -13,44 +15,98 @@ class DetailChecklistPage extends StatefulWidget { } class _DetailChecklistPageState extends State { - late final ChecklistProvider checklistProvider; - late Future checklistFuture; - - @override - void initState() { - super.initState(); - checklistProvider = Provider.of(context, listen: false); - checklistFuture = - DbHelper.getChecklistById(checklistProvider.selectedChecklistId!); - } + late Future _checklistFuture; + late final ChecklistProvider _checklistProvider; + int? _selectedItemId; + late Checklist _currentChecklist; @override void dispose() { super.dispose(); - checklistProvider.updateSelectedChecklist(null, silent: true); + _checklistProvider.updateSelectedChecklist(null, silent: true); } @override - Widget build(BuildContext context) { - return Scaffold( - body: FutureBuilder( - future: checklistFuture, - builder: _futureBuilder, - ), - ); + void initState() { + super.initState(); + _checklistProvider = Provider.of(context, listen: false); + _checklistFuture = DbHelper.getChecklistById(1); } Widget _futureBuilder( BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasData) { + _currentChecklist = snapshot.data!; return Column( children: [ - Text(snapshot.data!.title), - Text(snapshot.data!.description), + Text(_currentChecklist.title), + Text(_currentChecklist.description), ], ); } else { return const CircularProgressIndicator(); } } + + void _addItemTapped() { + showDialog(context: context, builder: _addItemDialog); + } + + Widget _addItemDialog(BuildContext context) { + TextEditingController titleCon = TextEditingController(); + TextEditingController descCon = TextEditingController(); + if (_selectedItemId != null) { + final item = _currentChecklist.items.elementAt(_selectedItemId!); + titleCon.text = item.title; + descCon.text = item.description; + } + return AlertDialog( + title: const Text('additem'), + content: Column( + mainAxisSize: MainAxisSize.min, + children: [ + TextFormField( + controller: titleCon, + decoration: const InputDecoration( + label: Text('Title'), + ), + ), + TextFormField( + controller: descCon, + decoration: const InputDecoration( + label: Text('Description'), + ), + ), + ], + ), + actions: [ + TextButton( + onPressed: () { + _itemSaved(titleCon.text, descCon.text); + Navigator.of(context).pop(); + }, + child: const Text('save'), + ), + ], + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: FutureBuilder( + future: _checklistFuture, + builder: _futureBuilder, + ), + floatingActionButton: FloatingActionButton( + onPressed: _addItemTapped, + child: const Icon(Icons.add), + ), + ); + } + + void _itemSaved(String title, String description) { + DbHelper.addOrUpdateItem(_checklistProvider.selectedChecklistId!, title, + description, _selectedItemId); + } } diff --git a/lib/services/dbhelper.dart b/lib/services/dbhelper.dart index de708b9..a166603 100644 --- a/lib/services/dbhelper.dart +++ b/lib/services/dbhelper.dart @@ -2,6 +2,7 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../assets/example_data.dart' as ed; import '../models/checklist.dart'; +import '../models/listitem.dart'; class DbHelper { static late final SupabaseClient _client; @@ -38,6 +39,11 @@ class DbHelper { return ed.checklists.first; } + static Future addOrUpdateItem( + int checklistId, String title, String description, int? itemId) async { + // TODO implement addOrUpdateItem + } + static Stream get authChangeEventStream => _client.auth.onAuthStateChange; }