mirror of
https://github.com/go-vikunja/app
synced 2024-06-08 05:29:51 +00:00
renamed namespaces to projects, added basic project views
This commit is contained in:
parent
2893a4e7f9
commit
6f32e1ff38
|
@ -7,12 +7,14 @@ import 'package:provider/provider.dart';
|
|||
|
||||
import 'package:vikunja_app/components/AddDialog.dart';
|
||||
import 'package:vikunja_app/components/ErrorDialog.dart';
|
||||
import 'package:vikunja_app/models/project.dart';
|
||||
import 'package:vikunja_app/pages/namespace/namespace.dart';
|
||||
import 'package:vikunja_app/pages/namespace/namespace_edit.dart';
|
||||
import 'package:vikunja_app/pages/landing_page.dart';
|
||||
import 'package:vikunja_app/global.dart';
|
||||
import 'package:vikunja_app/models/namespace.dart';
|
||||
import 'package:vikunja_app/pages/namespace/overview.dart';
|
||||
import 'package:vikunja_app/pages/project/overview.dart';
|
||||
import 'package:vikunja_app/pages/settings.dart';
|
||||
import 'package:vikunja_app/stores/list_store.dart';
|
||||
|
||||
|
@ -31,13 +33,13 @@ class HomePageState extends State<HomePage> {
|
|||
create: (_) => new ListProvider(),
|
||||
child: LandingPage(),
|
||||
),
|
||||
NamespaceOverviewPage(),
|
||||
ProjectOverviewPage(),
|
||||
SettingsPage()
|
||||
];
|
||||
|
||||
List<BottomNavigationBarItem> navbarItems = [
|
||||
BottomNavigationBarItem(icon: Icon(Icons.home), label: "Home"),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.list), label: "Namespaces"),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.list), label: "Projects"),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.settings), label: "Settings"),
|
||||
];
|
||||
|
||||
|
|
|
@ -314,7 +314,7 @@ class _ListPageState extends State<ListPage> {
|
|||
createdBy: currentUser,
|
||||
done: false,
|
||||
bucketId: bucket?.id,
|
||||
listId: _list.id,
|
||||
projectId: _list.id,
|
||||
);
|
||||
setState(() => _loadingTasks.add(newTask));
|
||||
return Provider.of<ListProvider>(context, listen: false)
|
||||
|
|
149
lib/pages/project/overview.dart
Normal file
149
lib/pages/project/overview.dart
Normal file
|
@ -0,0 +1,149 @@
|
|||
import 'package:after_layout/after_layout.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:vikunja_app/pages/project/project.dart';
|
||||
|
||||
import '../../components/AddDialog.dart';
|
||||
import '../../components/ErrorDialog.dart';
|
||||
import '../../global.dart';
|
||||
import '../../models/project.dart';
|
||||
|
||||
class ProjectOverviewPage extends StatefulWidget {
|
||||
@override
|
||||
_ProjectOverviewPageState createState() =>
|
||||
new _ProjectOverviewPageState();
|
||||
}
|
||||
|
||||
class _ProjectOverviewPageState extends State<ProjectOverviewPage>
|
||||
with AfterLayoutMixin<ProjectOverviewPage> {
|
||||
List<Project> _projects = [];
|
||||
int _selectedDrawerIndex = -2, _previousDrawerIndex = -2;
|
||||
bool _loading = true;
|
||||
|
||||
Project? get _currentProject =>
|
||||
_selectedDrawerIndex >= -1 && _selectedDrawerIndex < _projects.length
|
||||
? _projects[_selectedDrawerIndex]
|
||||
: null;
|
||||
|
||||
@override
|
||||
void afterFirstLayout(BuildContext context) {
|
||||
_loadProjects();
|
||||
}
|
||||
|
||||
Widget createProjectTile(Project project, int level){
|
||||
List<Widget> children = addProjectChildren(project, level);
|
||||
EdgeInsets insets = EdgeInsets.fromLTRB(level * 20 + 10, 0, 0, 0);
|
||||
if(children.length == 0) {
|
||||
return new ListTile(
|
||||
leading: const Icon(Icons.folder),
|
||||
title: new Text(project.title),
|
||||
contentPadding: insets,
|
||||
);
|
||||
} else {
|
||||
return new ExpansionTile(
|
||||
leading: const Icon(Icons.folder),
|
||||
title: new Text(project.title),
|
||||
children: children,
|
||||
tilePadding: insets
|
||||
//onTap: () => _onSelectItem(i),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
List<Widget> addProjectChildren(Project project, level) {
|
||||
Iterable<Project> children = _projects.where((element) => element.parentProjectId == project.id);
|
||||
List<Widget> widgets = [];
|
||||
children.forEach((element) {widgets.add(createProjectTile(element, level + 1));});
|
||||
return widgets;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<Widget> projectList = <Widget>[];
|
||||
_projects
|
||||
.asMap()
|
||||
.forEach((i, project) {
|
||||
if(project.parentProjectId != 0)
|
||||
return;
|
||||
projectList.add(createProjectTile(project, 0));
|
||||
});
|
||||
|
||||
if(_selectedDrawerIndex > -1) {
|
||||
return new WillPopScope(
|
||||
child: ProjectPage(project: _projects[_selectedDrawerIndex]),
|
||||
onWillPop: () async {setState(() {
|
||||
_selectedDrawerIndex = -2;
|
||||
});
|
||||
return false;});
|
||||
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
body:
|
||||
this._loading
|
||||
? Center(child: CircularProgressIndicator())
|
||||
:
|
||||
RefreshIndicator(
|
||||
child: ListView(
|
||||
padding: EdgeInsets.zero,
|
||||
children: ListTile.divideTiles(
|
||||
context: context, tiles: projectList)
|
||||
.toList()),
|
||||
onRefresh: _loadProjects,
|
||||
),
|
||||
floatingActionButton: Builder(
|
||||
builder: (context) => FloatingActionButton(
|
||||
onPressed: () => _addProjectDialog(context),
|
||||
child: const Icon(Icons.add))),
|
||||
appBar: AppBar(
|
||||
title: Text("Projects"),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> _loadProjects() {
|
||||
return VikunjaGlobal.of(context).projectService.getAll().then((result) {
|
||||
setState(() {
|
||||
_loading = false;
|
||||
if (result != null) _projects = result;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
_onSelectItem(int index) {
|
||||
Navigator.push(context,
|
||||
MaterialPageRoute(
|
||||
builder: (buildContext) => ProjectPage(
|
||||
project: _projects[index],
|
||||
),));
|
||||
//setState(() => _selectedDrawerIndex = index);
|
||||
}
|
||||
|
||||
_addProjectDialog(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => AddDialog(
|
||||
onAdd: (name) => _addProject(name, context),
|
||||
decoration: new InputDecoration(
|
||||
labelText: 'Project', hintText: 'eg. Personal Project'),
|
||||
));
|
||||
}
|
||||
|
||||
_addProject(String name, BuildContext context) {
|
||||
final currentUser = VikunjaGlobal.of(context).currentUser;
|
||||
if (currentUser == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
VikunjaGlobal.of(context)
|
||||
.projectService
|
||||
.create(Project(title: name, owner: currentUser))
|
||||
.then((_) {
|
||||
_loadProjects();
|
||||
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
|
||||
content: Text('The project was created successfully!'),
|
||||
));
|
||||
}).catchError((error) => showDialog(
|
||||
context: context, builder: (context) => ErrorDialog(error: error)));
|
||||
}
|
||||
}
|
23
lib/pages/project/project.dart
Normal file
23
lib/pages/project/project.dart
Normal file
|
@ -0,0 +1,23 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../../models/project.dart';
|
||||
|
||||
class ProjectPage extends StatefulWidget {
|
||||
final Project project;
|
||||
|
||||
ProjectPage({required this.project})
|
||||
: super(key: Key(project.id.toString()));
|
||||
|
||||
@override
|
||||
_ProjectPageState createState() => new _ProjectPageState();
|
||||
}
|
||||
|
||||
class _ProjectPageState extends State<ProjectPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// TODO: implement build
|
||||
return Scaffold();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user