From 2121b831a0372efb75492b538eb58a98f6e9728b Mon Sep 17 00:00:00 2001 From: konrad Date: Mon, 18 Mar 2019 17:00:34 +0000 Subject: [PATCH] Namespace edit (#36) --- lib/pages/home.dart | 17 +++- lib/pages/namespace/namespace_edit.dart | 125 ++++++++++++++++++++++++ 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 lib/pages/namespace/namespace_edit.dart diff --git a/lib/pages/home.dart b/lib/pages/home.dart index a8be62b..54210cc 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -6,6 +6,7 @@ import 'package:after_layout/after_layout.dart'; import 'package:vikunja_app/components/AddDialog.dart'; import 'package:vikunja_app/components/GravatarImage.dart'; import 'package:vikunja_app/pages/namespace/namespace.dart'; +import 'package:vikunja_app/pages/namespace/namespace_edit.dart'; import 'package:vikunja_app/pages/placeholder.dart'; import 'package:vikunja_app/global.dart'; import 'package:vikunja_app/models/namespace.dart'; @@ -71,7 +72,21 @@ class HomePageState extends State with AfterLayoutMixin { var currentUser = VikunjaGlobal.of(context).currentUser; return new Scaffold( - appBar: AppBar(title: new Text(_currentNamespace?.name ?? 'Vikunja')), + appBar: AppBar( + title: new Text(_currentNamespace?.name ?? 'Vikunja'), + actions: _currentNamespace == null + ? null + : [ + IconButton( + icon: Icon(Icons.edit), + onPressed: () => Navigator.push( + context, + MaterialPageRoute( + builder: (context) => NamespaceEditPage( + namespace: _currentNamespace, + )))) + ], + ), drawer: new Drawer( child: new Column(children: [ new UserAccountsDrawerHeader( diff --git a/lib/pages/namespace/namespace_edit.dart b/lib/pages/namespace/namespace_edit.dart new file mode 100644 index 0000000..d27cca1 --- /dev/null +++ b/lib/pages/namespace/namespace_edit.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/models/namespace.dart'; +import 'package:vikunja_app/theme/button.dart'; +import 'package:vikunja_app/theme/buttonText.dart'; + +class NamespaceEditPage extends StatefulWidget { + final Namespace namespace; + + NamespaceEditPage({this.namespace}) : super(key: Key(namespace.toString())); + + @override + State createState() => _NamespaceEditPageState(); +} + +class _NamespaceEditPageState extends State { + final _formKey = GlobalKey(); + bool _loading = false; + String _name, _description; + + @override + Widget build(BuildContext ctx) { + return Scaffold( + appBar: AppBar( + title: Text('Edit Namespace'), + ), + body: Builder( + builder: (BuildContext context) => SafeArea( + child: Form( + key: _formKey, + child: ListView( + padding: const EdgeInsets.all(16.0), + children: [ + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.name, + onSaved: (name) => _name = name, + validator: (name) { + if (name.length < 3 || name.length > 250) { + return 'The name needs to have between 3 and 250 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Name', + border: OutlineInputBorder(), + ), + ), + ), + Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: TextFormField( + maxLines: null, + keyboardType: TextInputType.multiline, + initialValue: widget.namespace.description, + onSaved: (description) => _description = description, + validator: (description) { + if (description.length > 1000) { + return 'The description can have a maximum of 1000 characters.'; + } + return null; + }, + decoration: new InputDecoration( + labelText: 'Description', + border: OutlineInputBorder(), + ), + ), + ), + Builder( + builder: (context) => Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: FancyButton( + onPressed: !_loading + ? () { + if (_formKey.currentState.validate()) { + Form.of(context).save(); + _saveNamespace(context); + } + } + : null, + child: _loading + ? CircularProgressIndicator() + : VikunjaButtonText('Save'), + ))), + ]), + ), + ), + ), + ); + } + + _saveNamespace(BuildContext context) async { + setState(() => _loading = true); + // FIXME: is there a way we can update the namespace without creating a new namespace object? + // aka updating the existing namespace we got from context (setters?) + Namespace updatedNamespace = Namespace( + id: widget.namespace.id, + name: _name, + description: _description, + owner: widget.namespace.owner); + + VikunjaGlobal.of(context) + .namespaceService + .update(updatedNamespace) + .then((_) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar(SnackBar( + content: Text('The namespace was updated successfully!'), + )); + }).catchError((err) { + setState(() => _loading = false); + Scaffold.of(context).showSnackBar( + SnackBar( + content: Text('Something went wrong: ' + err.toString()), + action: SnackBarAction( + label: 'CLOSE', + onPressed: Scaffold.of(context).hideCurrentSnackBar), + ), + ); + }); + } +}