From 97c068f0bab779c3481e575169f4459584d9048c Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Fri, 5 Jul 2019 22:20:08 +0200 Subject: [PATCH] Finish web prototype --- moor/example_web/lib/database/database.dart | 25 ++++++++++-- moor/example_web/lib/database/database.g.dart | 2 +- .../lib/widgets/create_entry_bar.dart | 17 ++++++--- moor/example_web/lib/widgets/home_screen.dart | 36 ++++++++++++++++++ moor/example_web/web/favicon.ico | Bin 3559 -> 0 bytes moor/lib/src/web/web_db.dart | 9 ++++- 6 files changed, 78 insertions(+), 11 deletions(-) delete mode 100644 moor/example_web/web/favicon.ico diff --git a/moor/example_web/lib/database/database.dart b/moor/example_web/lib/database/database.dart index 4e4d8107..92055bcc 100644 --- a/moor/example_web/lib/database/database.dart +++ b/moor/example_web/lib/database/database.dart @@ -24,6 +24,22 @@ class Database extends _$Database { @override final int schemaVersion = 1; + @override + MigrationStrategy get migration { + return MigrationStrategy( + onCreate: (m) async => await m.createAllTables(), + beforeOpen: (engine, details) async { + if (details.wasCreated) { + // populate default data + await createTodoEntry('A simple todo list using moor web', + engine: engine); + await createTodoEntry('It even supports prepopulated data!', + engine: engine); + } + }, + ); + } + Stream> incompleteEntries() { return (select(todoEntries)..where((e) => not(e.done))).watch(); } @@ -37,11 +53,14 @@ class Database extends _$Database { .watch(); } - Future createTodoEntry(String desc) { - return into(todoEntries).insert(TodoEntriesCompanion(content: Value(desc))); + Future createTodoEntry(String desc, {QueryEngine engine}) { + final resolved = engine ?? this; + return resolved + .into(todoEntries) + .insert(TodoEntriesCompanion(content: Value(desc))); } Future setCompleted(Entry entry, bool done) { - return update(todoEntries).write(entry.copyWith(done: done)); + return update(todoEntries).replace(entry.copyWith(done: done)); } } diff --git a/moor/example_web/lib/database/database.g.dart b/moor/example_web/lib/database/database.g.dart index 144573d1..4382b292 100644 --- a/moor/example_web/lib/database/database.g.dart +++ b/moor/example_web/lib/database/database.g.dart @@ -123,7 +123,7 @@ class $TodoEntriesTable extends TodoEntries GeneratedBoolColumn get done => _done ??= _constructDone(); GeneratedBoolColumn _constructDone() { return GeneratedBoolColumn('done', $tableName, false, - defaultValue: const Constant(true)); + defaultValue: const Constant(false)); } @override diff --git a/moor/example_web/lib/widgets/create_entry_bar.dart b/moor/example_web/lib/widgets/create_entry_bar.dart index 369ccf3a..e51f2cfa 100644 --- a/moor/example_web/lib/widgets/create_entry_bar.dart +++ b/moor/example_web/lib/widgets/create_entry_bar.dart @@ -23,6 +23,7 @@ class _CreateEntryBarState extends State { Expanded( child: TextField( controller: _controller, + onSubmitted: (_) => _submit(), decoration: InputDecoration( border: OutlineInputBorder(), ), @@ -30,14 +31,18 @@ class _CreateEntryBarState extends State { ), IconButton( icon: Icon(Icons.add), - onPressed: () { - final text = _controller.text; - _controller.clear(); - - DatabaseProvider.provide(context).createTodoEntry(text); - }, + onPressed: _submit, ), ], ); } + + void _submit() { + final text = _controller.text.trim(); + _controller.clear(); + + if (text.isNotEmpty) { + DatabaseProvider.provide(context).createTodoEntry(text); + } + } } diff --git a/moor/example_web/lib/widgets/home_screen.dart b/moor/example_web/lib/widgets/home_screen.dart index 15c9e68a..5a4a8779 100644 --- a/moor/example_web/lib/widgets/home_screen.dart +++ b/moor/example_web/lib/widgets/home_screen.dart @@ -1,3 +1,5 @@ +import 'dart:html'; + import 'package:example_web/main.dart'; import 'package:example_web/widgets/entry_list.dart'; import 'package:flutter_web/material.dart'; @@ -13,6 +15,40 @@ class HomeScreen extends StatelessWidget { return Scaffold( appBar: AppBar( title: const Text('Moor Web'), + actions: [ + IconButton( + icon: Icon(Icons.info_outline), + onPressed: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('Moor web'), + content: const Text( + 'Simple demonstration of moor web: This whole page ' + 'is a offline-capable Flutter app using sql.js to ' + 'store data!'), + actions: [ + FlatButton( + child: const Text('Moor'), + onPressed: () { + window.open('https://moor.simonbinder.eu/', 'Moor'); + }, + ), + FlatButton( + child: const Text('sql.js'), + onPressed: () { + window.open( + 'https://github.com/kripken/sql.js/', 'sql.js'); + }, + ), + ], + ); + }, + ); + }, + ), + ], ), body: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0), diff --git a/moor/example_web/web/favicon.ico b/moor/example_web/web/favicon.ico deleted file mode 100644 index 7ba349b3e628d2423d4a2ed217422a4722f73739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3559 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