mirror of
https://github.com/go-vikunja/app
synced 2024-10-12 08:55:33 +00:00
Fixes for API calls
This commit is contained in:
parent
493d965562
commit
59d5907b29
67
.gitignore
vendored
67
.gitignore
vendored
@ -1,6 +1,5 @@
|
||||
# Miscellaneous
|
||||
*.class
|
||||
*.lock
|
||||
*.log
|
||||
*.pyc
|
||||
*.swp
|
||||
@ -16,62 +15,32 @@
|
||||
*.iws
|
||||
.idea/
|
||||
|
||||
# Visual Studio Code related
|
||||
.vscode/
|
||||
# The .vscode folder contains launch configuration and tasks you configure in
|
||||
# VS Code which you may wish to be included in version control, so this line
|
||||
# is commented out by default.
|
||||
#.vscode/
|
||||
|
||||
# Flutter/Dart/Pub related
|
||||
**/doc/api/
|
||||
**/ios/Flutter/.last_build_id
|
||||
.dart_tool/
|
||||
.flutter-plugins
|
||||
.flutter-plugins-dependencies
|
||||
.packages
|
||||
.pub-cache/
|
||||
.pub/
|
||||
build/
|
||||
!pubspec.lock
|
||||
.flutter-plugins-dependencies
|
||||
/build/
|
||||
|
||||
# Android related
|
||||
**/android/**/gradle-wrapper.jar
|
||||
**/android/.gradle
|
||||
**/android/captures/
|
||||
**/android/gradlew
|
||||
**/android/gradlew.bat
|
||||
**/android/local.properties
|
||||
**/android/**/GeneratedPluginRegistrant.java
|
||||
# Web related
|
||||
lib/generated_plugin_registrant.dart
|
||||
|
||||
# iOS/XCode related
|
||||
**/ios/**/*.mode1v3
|
||||
**/ios/**/*.mode2v3
|
||||
**/ios/**/*.moved-aside
|
||||
**/ios/**/*.pbxuser
|
||||
**/ios/**/*.perspectivev3
|
||||
**/ios/**/*sync/
|
||||
**/ios/**/.sconsign.dblite
|
||||
**/ios/**/.tags*
|
||||
**/ios/**/.vagrant/
|
||||
**/ios/**/DerivedData/
|
||||
**/ios/**/Icon?
|
||||
**/ios/**/Pods/
|
||||
**/ios/**/.symlinks/
|
||||
**/ios/**/profile
|
||||
**/ios/**/xcuserdata
|
||||
**/ios/.generated/
|
||||
**/ios/Flutter/App.framework
|
||||
**/ios/Flutter/Flutter.framework
|
||||
**/ios/Flutter/Generated.xcconfig
|
||||
**/ios/Flutter/app.flx
|
||||
**/ios/Flutter/app.zip
|
||||
**/ios/Flutter/flutter_assets/
|
||||
**/ios/ServiceDefinitions.json
|
||||
**/ios/Runner/GeneratedPluginRegistrant.*
|
||||
# Symbolication related
|
||||
app.*.symbols
|
||||
|
||||
# Exceptions to above rules.
|
||||
!**/ios/**/default.mode1v3
|
||||
!**/ios/**/default.mode2v3
|
||||
!**/ios/**/default.pbxuser
|
||||
!**/ios/**/default.perspectivev3
|
||||
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
|
||||
ios/fastlane/README.md
|
||||
ios/fastlane/report.xml
|
||||
ios/Runner.ipa
|
||||
ios/Runner.app.dSYM.zip
|
||||
# Obfuscation related
|
||||
app.*.map.json
|
||||
|
||||
# Android Studio will place build artifacts here
|
||||
/android/app/debug
|
||||
/android/app/profile
|
||||
/android/app/release
|
||||
|
17
android/.gitignore
vendored
17
android/.gitignore
vendored
@ -1,10 +1,11 @@
|
||||
*.iml
|
||||
*.class
|
||||
.gradle
|
||||
gradle-wrapper.jar
|
||||
/.gradle
|
||||
/captures/
|
||||
/gradlew
|
||||
/gradlew.bat
|
||||
/local.properties
|
||||
/.idea/workspace.xml
|
||||
/.idea/libraries
|
||||
.DS_Store
|
||||
/build
|
||||
/captures
|
||||
GeneratedPluginRegistrant.java
|
||||
|
||||
# Remember to never publicly share your keystore.
|
||||
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||
key.properties
|
||||
|
@ -46,16 +46,16 @@ android {
|
||||
|
||||
flavorDimensions "deploy"
|
||||
|
||||
productFlavors {
|
||||
fdroid {
|
||||
dimension "deploy"
|
||||
signingConfig null
|
||||
}
|
||||
unsigned {
|
||||
dimension "deploy"
|
||||
signingConfig null
|
||||
}
|
||||
}
|
||||
//productFlavors {
|
||||
// fdroid {
|
||||
// dimension "deploy"
|
||||
// signingConfig null
|
||||
// }
|
||||
// unsigned {
|
||||
// dimension "deploy"
|
||||
// signingConfig null
|
||||
// }
|
||||
//}
|
||||
|
||||
android.applicationVariants.all { variant ->
|
||||
if (variant.flavorName == "fdroid") {
|
||||
|
@ -26,29 +26,29 @@ class Client {
|
||||
};
|
||||
|
||||
Future<dynamic> get(String url) {
|
||||
return http
|
||||
.get('${this.base}$url', headers: _headers)
|
||||
.then(_handleResponse);
|
||||
return http.get(Uri.parse('${this.base}$url'),
|
||||
headers: _headers,
|
||||
).then(_handleResponse);
|
||||
}
|
||||
|
||||
Future<dynamic> delete(String url) {
|
||||
return http
|
||||
.delete('${this.base}$url', headers: _headers)
|
||||
.then(_handleResponse);
|
||||
return http.delete(Uri.parse('${this.base}$url'),
|
||||
headers: _headers,
|
||||
).then(_handleResponse);
|
||||
}
|
||||
|
||||
Future<dynamic> post(String url, {dynamic body}) {
|
||||
return http
|
||||
.post('${this.base}$url',
|
||||
headers: _headers, body: _encoder.convert(body))
|
||||
.then(_handleResponse);
|
||||
return http.post(Uri.parse('${this.base}$url'),
|
||||
headers: _headers,
|
||||
body: _encoder.convert(body),
|
||||
).then(_handleResponse);
|
||||
}
|
||||
|
||||
Future<dynamic> put(String url, {dynamic body}) {
|
||||
return http
|
||||
.put('${this.base}$url',
|
||||
headers: _headers, body: _encoder.convert(body))
|
||||
.then(_handleResponse);
|
||||
return http.put(Uri.parse('${this.base}$url'),
|
||||
headers: _headers,
|
||||
body: _encoder.convert(body),
|
||||
).then(_handleResponse);
|
||||
}
|
||||
|
||||
dynamic _handleResponse(http.Response response) {
|
||||
|
@ -22,7 +22,13 @@ class ListAPIService extends APIService implements ListService {
|
||||
|
||||
@override
|
||||
Future<TaskList> get(int listId) {
|
||||
return client.get('/lists/$listId').then((map) => TaskList.fromJson(map));
|
||||
return client.get('/lists/$listId').then((map) {
|
||||
if (map.containsKey('id')) {
|
||||
return client.get("/lists/$listId/tasks").then((tasks) => TaskList.fromJson(
|
||||
map, tasksJson: tasks));
|
||||
}
|
||||
return TaskList.fromJson(map);
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
|
@ -84,7 +84,7 @@ class VikunjaGlobalState extends State<VikunjaGlobal> {
|
||||
_currentUser = null;
|
||||
});
|
||||
}).catchError((err) {
|
||||
Scaffold.of(context).showSnackBar(SnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('An error occured while logging out!'),
|
||||
));
|
||||
});
|
||||
|
@ -3,22 +3,32 @@ import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/pages/home.dart';
|
||||
import 'package:vikunja_app/pages/user/login.dart';
|
||||
import 'package:vikunja_app/theme/theme.dart';
|
||||
import 'package:alice/alice.dart';
|
||||
|
||||
void main() => runApp(VikunjaGlobal(
|
||||
child: new VikunjaApp(home: HomePage()),
|
||||
login: new VikunjaApp(home: LoginPage())));
|
||||
|
||||
class VikunjaApp extends StatelessWidget {
|
||||
class VikunjaApp extends StatefulWidget {
|
||||
final Widget home;
|
||||
|
||||
const VikunjaApp({Key key, this.home}) : super(key: key);
|
||||
VikunjaApp({Key key, this.home}) : super(key: key);
|
||||
|
||||
@override
|
||||
_VikunjaAppState createState() => _VikunjaAppState();
|
||||
}
|
||||
|
||||
class _VikunjaAppState extends State<VikunjaApp> {
|
||||
Alice alice = Alice(showNotification: true);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return new MaterialApp(
|
||||
navigatorKey: alice.getNavigatorKey(),
|
||||
title: 'Vikunja',
|
||||
theme: buildVikunjaTheme(),
|
||||
darkTheme: buildVikunjaDarkTheme(),
|
||||
home: this.home,
|
||||
home: this.widget.home,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -9,23 +9,24 @@ class TaskList {
|
||||
final DateTime created, updated;
|
||||
final List<Task> tasks;
|
||||
|
||||
TaskList(
|
||||
{@required this.id,
|
||||
@required this.title,
|
||||
this.description,
|
||||
this.owner,
|
||||
this.created,
|
||||
this.updated,
|
||||
this.tasks});
|
||||
TaskList({
|
||||
@required this.id,
|
||||
@required this.title,
|
||||
this.description,
|
||||
this.owner,
|
||||
this.created,
|
||||
this.updated,
|
||||
this.tasks,
|
||||
});
|
||||
|
||||
TaskList.fromJson(Map<String, dynamic> json)
|
||||
TaskList.fromJson(Map<String, dynamic> json, {tasksJson})
|
||||
: id = json['id'],
|
||||
owner = User.fromJson(json['owner']),
|
||||
description = json['description'],
|
||||
title = json['title'],
|
||||
updated = DateTime.parse(json['updated']),
|
||||
created = DateTime.parse(json['created']),
|
||||
tasks = (json['tasks'] == null ? [] : json['tasks'] as List<dynamic>)
|
||||
tasks = (tasksJson == null ? [] : tasksJson as List<dynamic>)
|
||||
?.map((taskJson) => Task.fromJson(taskJson))
|
||||
?.toList();
|
||||
|
||||
|
@ -21,7 +21,7 @@ class Namespace {
|
||||
id = json['id'],
|
||||
created = DateTime.parse(json['created']),
|
||||
updated = DateTime.parse(json['updated']),
|
||||
owner = User.fromJson(json['owner']);
|
||||
owner = json['owner'] == null ? null : User.fromJson(json['owner']);
|
||||
|
||||
toJSON() => {
|
||||
"created": created?.toIso8601String(),
|
||||
|
@ -15,9 +15,7 @@ class User {
|
||||
|
||||
String avatarUrl(BuildContext context) {
|
||||
return VikunjaGlobal.of(context).client.base +
|
||||
"/" +
|
||||
this.username +
|
||||
"/avatar";
|
||||
"/avatar/${this.username}";
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,28 +1,26 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:after_layout/after_layout.dart';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vikunja_app/components/AddDialog.dart';
|
||||
import 'package:vikunja_app/components/ErrorDialog.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/models/namespace.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';
|
||||
|
||||
class HomePage extends StatefulWidget {
|
||||
@override
|
||||
State<StatefulWidget> createState() => new HomePageState();
|
||||
State<StatefulWidget> createState() => HomePageState();
|
||||
}
|
||||
|
||||
class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
|
||||
List<Namespace> _namespaces = [];
|
||||
|
||||
Namespace get _currentNamespace =>
|
||||
_selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length
|
||||
? _namespaces[_selectedDrawerIndex]
|
||||
: null;
|
||||
Namespace get _currentNamespace => _selectedDrawerIndex >= 0 && _selectedDrawerIndex < _namespaces.length
|
||||
? _namespaces[_selectedDrawerIndex]
|
||||
: null;
|
||||
int _selectedDrawerIndex = -1;
|
||||
bool _loading = true;
|
||||
bool _showUserDetails = false;
|
||||
@ -34,23 +32,19 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
|
||||
|
||||
Widget _namespacesWidget() {
|
||||
List<Widget> namespacesList = <Widget>[];
|
||||
_namespaces
|
||||
.asMap()
|
||||
.forEach((i, namespace) => namespacesList.add(new ListTile(
|
||||
leading: const Icon(Icons.folder),
|
||||
title: new Text(namespace.title),
|
||||
selected: i == _selectedDrawerIndex,
|
||||
onTap: () => _onSelectItem(i),
|
||||
)));
|
||||
_namespaces.asMap().forEach((i, namespace) => namespacesList.add(ListTile(
|
||||
leading: const Icon(Icons.folder),
|
||||
title: Text(namespace.title),
|
||||
selected: i == _selectedDrawerIndex,
|
||||
onTap: () => _onSelectItem(i),
|
||||
)));
|
||||
|
||||
return this._loading
|
||||
? Center(child: CircularProgressIndicator())
|
||||
: RefreshIndicator(
|
||||
child: ListView(
|
||||
padding: EdgeInsets.zero,
|
||||
children: ListTile.divideTiles(
|
||||
context: context, tiles: namespacesList)
|
||||
.toList()),
|
||||
children: ListTile.divideTiles(context: context, tiles: namespacesList).toList()),
|
||||
onRefresh: _loadNamespaces,
|
||||
);
|
||||
}
|
||||
@ -71,9 +65,9 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
|
||||
Widget build(BuildContext context) {
|
||||
var currentUser = VikunjaGlobal.of(context).currentUser;
|
||||
|
||||
return new Scaffold(
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: new Text(_currentNamespace?.title ?? 'Vikunja'),
|
||||
title: Text(_currentNamespace?.title ?? 'Vikunja'),
|
||||
actions: _currentNamespace == null
|
||||
? null
|
||||
: <Widget>[
|
||||
@ -84,59 +78,62 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
|
||||
MaterialPageRoute(
|
||||
builder: (context) => NamespaceEditPage(
|
||||
namespace: _currentNamespace,
|
||||
))))
|
||||
)
|
||||
)
|
||||
)
|
||||
),
|
||||
],
|
||||
),
|
||||
drawer: new Drawer(
|
||||
child: new Column(children: <Widget>[
|
||||
new UserAccountsDrawerHeader(
|
||||
accountEmail:
|
||||
currentUser?.email == null ? null : Text(currentUser.email),
|
||||
accountName:
|
||||
currentUser?.username == null ? null : Text(currentUser.username),
|
||||
onDetailsPressed: () {
|
||||
setState(() {
|
||||
_showUserDetails = !_showUserDetails;
|
||||
});
|
||||
},
|
||||
currentAccountPicture: currentUser == null
|
||||
? null
|
||||
: CircleAvatar(
|
||||
backgroundImage: NetworkImage(currentUser.avatarUrl(context)),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("assets/graphics/hypnotize.png"),
|
||||
repeat: ImageRepeat.repeat,
|
||||
colorFilter: ColorFilter.mode(
|
||||
Theme.of(context).primaryColor, BlendMode.multiply)),
|
||||
),
|
||||
),
|
||||
new Builder(
|
||||
builder: (BuildContext context) => Expanded(
|
||||
child: _showUserDetails
|
||||
? _userDetailsWidget(context)
|
||||
: _namespacesWidget())),
|
||||
new Align(
|
||||
alignment: FractionalOffset.bottomCenter,
|
||||
child: Builder(
|
||||
builder: (context) => ListTile(
|
||||
leading: const Icon(Icons.add),
|
||||
title: const Text('Add namespace...'),
|
||||
onTap: () => _addNamespaceDialog(context),
|
||||
drawer: Drawer(
|
||||
child: Column(children: <Widget>[
|
||||
UserAccountsDrawerHeader(
|
||||
accountEmail: currentUser?.email == null ? null : Text(currentUser.email),
|
||||
accountName: currentUser?.username == null ? null : Text(currentUser.username),
|
||||
onDetailsPressed: () {
|
||||
setState(() {
|
||||
_showUserDetails = !_showUserDetails;
|
||||
});
|
||||
},
|
||||
currentAccountPicture: currentUser == null
|
||||
? null
|
||||
: CircleAvatar(
|
||||
backgroundImage: NetworkImage(currentUser.avatarUrl(context)),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage("assets/graphics/hypnotize.png"),
|
||||
repeat: ImageRepeat.repeat,
|
||||
colorFilter: ColorFilter.mode(Theme.of(context).primaryColor, BlendMode.multiply),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
])),
|
||||
Builder(
|
||||
builder: (BuildContext context) =>
|
||||
Expanded(
|
||||
child: _showUserDetails ? _userDetailsWidget(context) : _namespacesWidget(),
|
||||
)
|
||||
),
|
||||
Align(
|
||||
alignment: FractionalOffset.bottomCenter,
|
||||
child: Builder(
|
||||
builder: (context) => ListTile(
|
||||
leading: const Icon(Icons.add),
|
||||
title: const Text('Add namespace...'),
|
||||
onTap: () => _addNamespaceDialog(context),
|
||||
),
|
||||
),
|
||||
),
|
||||
]),
|
||||
),
|
||||
body: _getDrawerItemWidget(_selectedDrawerIndex),
|
||||
);
|
||||
}
|
||||
|
||||
_getDrawerItemWidget(int pos) {
|
||||
if (pos == -1) {
|
||||
return new PlaceholderPage();
|
||||
return PlaceholderPage();
|
||||
}
|
||||
return new NamespacePage(namespace: _namespaces[pos]);
|
||||
return NamespacePage(namespace: _namespaces[pos]);
|
||||
}
|
||||
|
||||
_onSelectItem(int index) {
|
||||
@ -149,22 +146,17 @@ class HomePageState extends State<HomePage> with AfterLayoutMixin<HomePage> {
|
||||
context: context,
|
||||
builder: (_) => AddDialog(
|
||||
onAdd: (name) => _addNamespace(name, context),
|
||||
decoration: new InputDecoration(
|
||||
labelText: 'Namespace', hintText: 'eg. Personal Namespace'),
|
||||
decoration: InputDecoration(labelText: 'Namespace', hintText: 'eg. Personal Namespace'),
|
||||
));
|
||||
}
|
||||
|
||||
_addNamespace(String name, BuildContext context) {
|
||||
VikunjaGlobal.of(context)
|
||||
.namespaceService
|
||||
.create(Namespace(id: null, title: name))
|
||||
.then((_) {
|
||||
VikunjaGlobal.of(context).namespaceService.create(Namespace(id: null, title: name)).then((_) {
|
||||
_loadNamespaces();
|
||||
Scaffold.of(context).showSnackBar(SnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('The namespace was created successfully!'),
|
||||
));
|
||||
}).catchError((error) => showDialog(
|
||||
context: context, builder: (context) => ErrorDialog(error: error)));
|
||||
}).catchError((error) => showDialog(context: context, builder: (context) => ErrorDialog(error: error)));
|
||||
}
|
||||
|
||||
Future<void> _loadNamespaces() {
|
||||
|
@ -24,8 +24,7 @@ class _ListPageState extends State<ListPage> {
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_list = TaskList(
|
||||
id: widget.taskList.id, title: widget.taskList.title, tasks: []);
|
||||
_list = TaskList(id: widget.taskList.id, title: widget.taskList.title, tasks: []);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@ -39,7 +38,7 @@ class _ListPageState extends State<ListPage> {
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: new Text(_list.title),
|
||||
title: Text(_list.title),
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
icon: Icon(Icons.edit),
|
||||
@ -48,7 +47,10 @@ class _ListPageState extends State<ListPage> {
|
||||
MaterialPageRoute(
|
||||
builder: (context) => ListEditPage(
|
||||
list: _list,
|
||||
))))
|
||||
)
|
||||
)
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
body: !this._loading
|
||||
@ -56,9 +58,7 @@ class _ListPageState extends State<ListPage> {
|
||||
child: _list.tasks.length > 0
|
||||
? ListView(
|
||||
padding: EdgeInsets.symmetric(vertical: 8.0),
|
||||
children: ListTile.divideTiles(
|
||||
context: context, tiles: _listTasks())
|
||||
.toList(),
|
||||
children: ListTile.divideTiles(context: context, tiles: _listTasks()).toList(),
|
||||
)
|
||||
: Center(child: Text('This list is empty.')),
|
||||
onRefresh: _loadList,
|
||||
@ -66,7 +66,8 @@ class _ListPageState extends State<ListPage> {
|
||||
: Center(child: CircularProgressIndicator()),
|
||||
floatingActionButton: Builder(
|
||||
builder: (context) => FloatingActionButton(
|
||||
onPressed: () => _addItemDialog(context), child: Icon(Icons.add)),
|
||||
onPressed: () => _addItemDialog(context), child: Icon(Icons.add),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
@ -88,10 +89,7 @@ class _ListPageState extends State<ListPage> {
|
||||
}
|
||||
|
||||
Future<void> _loadList() {
|
||||
return VikunjaGlobal.of(context)
|
||||
.listService
|
||||
.get(widget.taskList.id)
|
||||
.then((list) {
|
||||
return VikunjaGlobal.of(context).listService.get(widget.taskList.id).then((list) {
|
||||
setState(() {
|
||||
_loading = false;
|
||||
_list = list;
|
||||
@ -104,14 +102,14 @@ class _ListPageState extends State<ListPage> {
|
||||
context: context,
|
||||
builder: (_) => AddDialog(
|
||||
onAdd: (name) => _addItem(name, context),
|
||||
decoration: new InputDecoration(
|
||||
labelText: 'Task Name', hintText: 'eg. Milk')));
|
||||
decoration: InputDecoration(labelText: 'Task Name', hintText: 'eg. Milk'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
_addItem(String name, BuildContext context) {
|
||||
var globalState = VikunjaGlobal.of(context);
|
||||
var newTask = Task(
|
||||
id: null, title: name, owner: globalState.currentUser, done: false);
|
||||
var newTask = Task(id: null, title: name, owner: globalState.currentUser, done: false);
|
||||
setState(() => _loadingTasks.add(newTask));
|
||||
globalState.taskService.add(_list.id, newTask).then((task) {
|
||||
setState(() {
|
||||
@ -120,7 +118,7 @@ class _ListPageState extends State<ListPage> {
|
||||
}).then((_) {
|
||||
_loadList();
|
||||
setState(() => _loadingTasks.remove(newTask));
|
||||
Scaffold.of(context).showSnackBar(SnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('The task was added successfully!'),
|
||||
));
|
||||
});
|
||||
|
@ -101,12 +101,12 @@ class _ListEditPageState extends State<ListEditPage> {
|
||||
|
||||
VikunjaGlobal.of(context).listService.update(updatedList).then((_) {
|
||||
setState(() => _loading = false);
|
||||
Scaffold.of(context).showSnackBar(SnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('The list was updated successfully!'),
|
||||
));
|
||||
}).catchError((err) {
|
||||
setState(() => _loading = false);
|
||||
Scaffold.of(context).showSnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Something went wrong: ' + err.toString()),
|
||||
action: SnackBarAction(
|
||||
|
@ -56,11 +56,8 @@ class _NamespacePageState extends State<NamespacePage>
|
||||
color: Colors.white, size: 36.0)),
|
||||
),
|
||||
onDismissed: (direction) {
|
||||
_removeList(ls).then((_) => Scaffold.of(
|
||||
context)
|
||||
.showSnackBar(SnackBar(
|
||||
content:
|
||||
Text("${ls.title} removed"))));
|
||||
_removeList(ls).then((_) => ScaffoldMessenger.of(context)
|
||||
.showSnackBar(SnackBar(content: Text("${ls.title} removed"))));
|
||||
},
|
||||
))).toList(),
|
||||
)
|
||||
@ -120,7 +117,7 @@ class _NamespacePageState extends State<NamespacePage>
|
||||
.then((_) {
|
||||
setState(() {});
|
||||
_loadLists();
|
||||
Scaffold.of(context).showSnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('The list was successfully created!'),
|
||||
),
|
||||
|
@ -107,12 +107,12 @@ class _NamespaceEditPageState extends State<NamespaceEditPage> {
|
||||
.update(updatedNamespace)
|
||||
.then((_) {
|
||||
setState(() => _loading = false);
|
||||
Scaffold.of(context).showSnackBar(SnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('The namespace was updated successfully!'),
|
||||
));
|
||||
}).catchError((err) {
|
||||
setState(() => _loading = false);
|
||||
Scaffold.of(context).showSnackBar(
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text('Something went wrong: ' + err.toString()),
|
||||
action: SnackBarAction(
|
||||
|
@ -24,7 +24,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Builder(
|
||||
builder: (BuildContext context) => Form(
|
||||
autovalidate: true,
|
||||
autovalidateMode: AutovalidateMode.always,
|
||||
key: _formKey,
|
||||
child: Center(
|
||||
child: Column(
|
||||
@ -122,7 +122,7 @@ class _LoginPageState extends State<LoginPage> {
|
||||
'Login failed! Please check your server url and credentials. ' +
|
||||
ex.toString()),
|
||||
actions: <Widget>[
|
||||
FlatButton(
|
||||
TextButton(
|
||||
onPressed: () => Navigator.pop(context),
|
||||
child: const Text('Close'))
|
||||
],
|
||||
|
270
pubspec.lock
270
pubspec.lock
@ -7,7 +7,14 @@ packages:
|
||||
name: after_layout
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.7"
|
||||
version: "1.0.7+2"
|
||||
alice:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: alice
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.12"
|
||||
archive:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -29,6 +36,13 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
better_player:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: better_player
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.61"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -50,6 +64,13 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
chopper:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: chopper
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
clock:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -78,6 +99,13 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
csslib:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: csslib
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.16.2"
|
||||
cupertino_icons:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -85,6 +113,13 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
dio:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dio
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.10"
|
||||
fake_async:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -92,6 +127,20 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
ffi:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: ffi
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "6.1.0"
|
||||
flutter:
|
||||
dependency: "direct main"
|
||||
description: flutter
|
||||
@ -104,18 +153,51 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.8.1"
|
||||
flutter_local_notifications:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_local_notifications
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.1+2"
|
||||
flutter_local_notifications_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_local_notifications_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0+1"
|
||||
flutter_secure_storage:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_secure_storage
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
version: "4.1.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_web_plugins:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_widget_from_html_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_widget_from_html_core
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.5.2+1"
|
||||
html:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: html
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.14.0+4"
|
||||
http:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@ -137,6 +219,27 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.19"
|
||||
import_js_library:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: import_js_library
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.3"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.11.4"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -151,6 +254,27 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.9.7"
|
||||
open_file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: open_file
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
package_info:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_info
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.3+4"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -158,6 +282,41 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.8.0"
|
||||
path_provider:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.6.27"
|
||||
path_provider_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_linux
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.1+2"
|
||||
path_provider_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_macos
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.4+8"
|
||||
path_provider_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.4"
|
||||
path_provider_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path_provider_windows
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.0.5"
|
||||
pedantic:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -165,6 +324,20 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.11.0"
|
||||
permission_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "5.1.0+2"
|
||||
permission_handler_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
petitparser:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -172,6 +345,48 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
platform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: platform
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
plugin_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "1.0.3"
|
||||
process:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: process
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "4.1.0"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.25.0"
|
||||
sensors:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sensors
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.4.2+6"
|
||||
share:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.5+4"
|
||||
sky_engine:
|
||||
dependency: transitive
|
||||
description: flutter
|
||||
@ -219,6 +434,13 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.19"
|
||||
timezone:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timezone
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.6.1"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -233,6 +455,48 @@ packages:
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
visibility_detector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: visibility_detector
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.5"
|
||||
wakelock:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.2.1+1"
|
||||
wakelock_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_platform_interface
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.0+1"
|
||||
wakelock_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: wakelock_web
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.0+3"
|
||||
win32:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
xdg_directories:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: xdg_directories
|
||||
url: "https://pub.dartlang.org"
|
||||
source: hosted
|
||||
version: "0.1.2"
|
||||
xml:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -248,5 +512,5 @@ packages:
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
sdks:
|
||||
dart: ">=2.12.0-29.10.beta <3.0.0"
|
||||
dart: ">=2.12.0 <3.0.0"
|
||||
flutter: ">=1.26.0-17.6.pre"
|
||||
|
@ -10,9 +10,10 @@ dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
cupertino_icons: 1.0.2
|
||||
flutter_secure_storage: 4.0.0
|
||||
flutter_secure_storage: 4.1.0
|
||||
http: 0.12.2
|
||||
after_layout: 1.0.7
|
||||
after_layout: 1.0.7+2
|
||||
alice: ^0.1.12
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
|
Loading…
Reference in New Issue
Block a user