Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

link back #41

Merged
merged 11 commits into from
Mar 6, 2023
5 changes: 2 additions & 3 deletions lib/dialogs/new_edit_location.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';

import '../models/location.dart';

class LocationDialog extends StatefulWidget {
const LocationDialog({super.key, required this.edit, this.name, this.position});

Expand Down Expand Up @@ -117,6 +115,7 @@ class _LocationDialogState extends State<LocationDialog> {
if (nameController.text.trim().isEmpty) {
return;
}
Navigator.pop(context, Location(name: nameController.text, position: positionController.text));
// TODO(mael): add member via API
Navigator.pop(context);
}
}
11 changes: 2 additions & 9 deletions lib/dialogs/new_edit_member.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';

import '../models/member.dart';

class MemberDialog extends StatefulWidget {
const MemberDialog({super.key, required this.edit, this.firstName, this.lastName, this.phone, this.image});

Expand Down Expand Up @@ -177,12 +175,7 @@ class _MemberDialogState extends State<MemberDialog> {
if (firstNameController.text.trim().isEmpty) {
return;
}
Navigator.pop(
context,
Member(
firstName: firstNameController.text,
lastName: lastNameController.text,
phone: phoneController.text,
image: image));
// TODO(mael): add member via API
Navigator.pop(context);
}
}
7 changes: 4 additions & 3 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'models/event.dart';
import 'routes/route.gr.dart';
import 'services/config.dart';
import 'services/login.dart';
Expand Down Expand Up @@ -72,13 +73,13 @@ class _CPMState extends State<CPM> {
return ChangeNotifierProvider<ModelTheme>(
create: (_) => ModelTheme(),
child: Consumer<ModelTheme>(builder: (BuildContext context, ModelTheme themeNotifier, Widget? child) {
return CalendarControllerProvider(
controller: EventController(),
return CalendarControllerProvider<Event>(
controller: EventController<Event>(),
child: MaterialApp.router(
routerDelegate: AutoRouterDelegate.declarative(
widget._appRouter,
routes: (_) => <PageRouteInfo<dynamic>>[
if (loginState.authenticated) //TODO: loginState.authenticated
if (loginState.authenticated)
const HomeRoute()
else
LoginRoute(
Expand Down
12 changes: 10 additions & 2 deletions lib/models/location.dart
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
class Location {
Location({this.id, required this.name, this.position});
Location({required this.id, required this.name, this.position});

final String? id;
factory Location.fromJson(json) {
return Location(
id: json['Id'].toString(),
name: json['Name'].toString(),
position: json['Link'].toString(), // TODO(mael): change to 'Position' in backend
);
}

final String id;
String name;
String? position;
}
13 changes: 7 additions & 6 deletions lib/models/member.dart
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import 'package:flutter/material.dart';

class Member {
Member({this.id, required this.firstName, this.lastName, this.phone, this.image});
Member({required this.id, required this.firstName, this.lastName, this.phone, this.image});

factory Member.fromJson(Map<String, dynamic> json) {
factory Member.fromJson(json) {
return Member(
firstName: json['firstName'].toString(),
lastName: json['lastName'].toString(),
phone: json['phone'].toString(),
id: json['Id'].toString(),
firstName: json['FirstName'].toString(),
lastName: json['LastName'].toString(),
phone: json['PhoneNumber'].toString(), // TODO(mael): rename to 'Phone' in backend
);
}

final String? id;
final String id;
String firstName;
String? lastName;
String? phone;
Expand Down
22 changes: 20 additions & 2 deletions lib/models/project.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class Project {
{this.id,
required this.projectType,
required this.title,
this.description,
required this.description,
required this.beginDate,
required this.endDate,
this.shotsTotal,
Expand All @@ -16,15 +16,33 @@ class Project {
this.writer,
required this.sequences});

factory Project.fromJson(json) {
final ProjectType projectType = (json['isFilm'] as bool) ? ProjectType.movie : ProjectType.series;

return Project(
projectType: projectType,
id: json['Id'].toString(),
title: json['Title'].toString(),
description: json['Description'].toString(),
beginDate: DateTime.parse(json['BeginDate'].toString()),
endDate: DateTime.parse(json['EndDate'].toString()),
sequences: <Sequence>[],
);
}

final String? id;
ProjectType projectType;
String title;
String? description;
String description;
DateTime beginDate;
DateTime endDate;
int? shotsTotal;
int? shotsCompleted;
String? director;
String? writer;
List<Sequence> sequences;

ProjectType setProjectType(bool isProject) {
return isProject ? ProjectType.movie : ProjectType.series;
}
}
16 changes: 2 additions & 14 deletions lib/pages/home.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@ import 'dart:io' show Platform;
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/material.dart';

import '../models/location.dart';
import '../models/member.dart';
import '../widgets/custom_appbar.dart';
import '../widgets/custom_navigation_drawer.dart';
import '../widgets/custom_navigation_rail.dart';
Expand Down Expand Up @@ -58,19 +56,9 @@ class HomeState extends State<Home> {
case 0:
return const Projects();
case 1:
return Members(
members: <Member>[Member(firstName: 'Paul', lastName: 'Issière', phone: '69')],
);
return const Members();
case 2:
return Locations(
locations: <Location>[
Location(id: '1', name: 'Polytech Grenoble', position: "Polytech Grenoble, 38400 Saint-Martin-d'Hères"),
Location(
id: '2',
name: 'Tour Perret',
),
],
);
return const Locations();
case 3:
return const Settings();
case 4:
Expand Down
124 changes: 70 additions & 54 deletions lib/pages/locations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,18 @@ import '../dialogs/confirm_dialog.dart';
import '../dialogs/new_edit_location.dart';
import '../exceptions/invalid_direction_exception.dart';
import '../models/location.dart';
import '../services/location.dart';
import '../widgets/location_tile.dart';

class Locations extends StatefulWidget {
const Locations({super.key, required this.locations});

final List<Location> locations;
const Locations({super.key});

@override
State<Locations> createState() => _LocationsState();
}

class _LocationsState extends State<Locations> {
late final List<Location> locations;
List<Location> locations = <Location>[];

final Divider divider = const Divider(
thickness: 1,
Expand All @@ -29,7 +28,7 @@ class _LocationsState extends State<Locations> {

@override
void initState() {
locations = widget.locations;
getLocations();
super.initState();
}

Expand All @@ -49,55 +48,66 @@ class _LocationsState extends State<Locations> {
},
));

return Expanded(
child: Scaffold(
floatingActionButton: FloatingActionButton(onPressed: add, child: const Icon(Icons.add)),
body: ListView.separated(
separatorBuilder: (BuildContext context, int index) => divider,
itemCount: locationsTiles.length,
itemBuilder: (BuildContext context, int index) => ClipRRect(
clipBehavior: Clip.hardEdge,
child: Dismissible(
key: UniqueKey(),
onDismissed: (DismissDirection direction) {
final Location location = locationsTiles.elementAt(index).location;
switch (direction) {
case DismissDirection.startToEnd:
delete(location);
break;
case DismissDirection.endToStart:
case DismissDirection.vertical:
case DismissDirection.horizontal:
case DismissDirection.up:
case DismissDirection.down:
case DismissDirection.none:
throw InvalidDirectionException('error.direction'.tr());
}
},
confirmDismiss: (DismissDirection dismissDirection) async {
switch (dismissDirection) {
case DismissDirection.endToStart:
final Location location = locationsTiles.elementAt(index).location;
edit(location);
return false;
case DismissDirection.startToEnd:
return await showConfirmationDialog(context, 'delete.lower'.tr()) ?? false == true;
case DismissDirection.horizontal:
case DismissDirection.vertical:
case DismissDirection.up:
case DismissDirection.down:
case DismissDirection.none:
assert(false);
}
return false;
},
background: deleteBackground(),
secondaryBackground: editBackground(),
child: locationsTiles.elementAt(index),
if (locations.isEmpty) {
return Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: const <CircularProgressIndicator>[
CircularProgressIndicator(),
],
),
);
} else {
return Expanded(
child: Scaffold(
floatingActionButton: FloatingActionButton(onPressed: add, child: const Icon(Icons.add)),
body: ListView.separated(
separatorBuilder: (BuildContext context, int index) => divider,
itemCount: locationsTiles.length,
itemBuilder: (BuildContext context, int index) => ClipRRect(
clipBehavior: Clip.hardEdge,
child: Dismissible(
key: UniqueKey(),
onDismissed: (DismissDirection direction) {
final Location location = locationsTiles.elementAt(index).location;
switch (direction) {
case DismissDirection.startToEnd:
delete(location);
break;
case DismissDirection.endToStart:
case DismissDirection.vertical:
case DismissDirection.horizontal:
case DismissDirection.up:
case DismissDirection.down:
case DismissDirection.none:
throw InvalidDirectionException('error.direction'.tr());
}
},
confirmDismiss: (DismissDirection dismissDirection) async {
switch (dismissDirection) {
case DismissDirection.endToStart:
final Location location = locationsTiles.elementAt(index).location;
edit(location);
return false;
case DismissDirection.startToEnd:
return await showConfirmationDialog(context, 'delete.lower'.tr()) ?? false == true;
case DismissDirection.horizontal:
case DismissDirection.vertical:
case DismissDirection.up:
case DismissDirection.down:
case DismissDirection.none:
assert(false);
}
return false;
},
background: deleteBackground(),
secondaryBackground: editBackground(),
child: locationsTiles.elementAt(index),
),
),
),
),
));
));
}
}

void edit(Location location) {
Expand Down Expand Up @@ -138,11 +148,17 @@ class _LocationsState extends State<Locations> {
(Location? result) {
if (result != null) {
setState(() {
final Location location = Location(name: result.name, position: result.position);
locations.add(location);
// TODO(mael): add member via API
});
}
},
);
}

Future<void> getLocations() async {
final List<dynamic> result = await LocationService().getLocations();
setState(() {
locations = result[1] as List<Location>;
});
}
}
Loading