Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions lib/controller/page/create_sprint_page_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import 'package:flutter/material.dart';
import 'package:idea_tracker/locator.dart';
import 'package:idea_tracker/model/sprint.dart';
import 'package:idea_tracker/service/sprint_service.dart';

class CreateSprintPageController extends ChangeNotifier{
String _sprintTitle;
String _sprintDescription;
String _sprintTeamleader;
Function(String) onSprintCreated;

final _sprintService = locator<SprintService>();

void setSprintTitle(String title){
_sprintTitle = title;
}

void setSprintDescription(String description){
_sprintDescription = description;
}

void setSprintTeamleader(String teamleader){
_sprintTeamleader = teamleader;
}

String validateTitle(String value) {
if (value.isEmpty) {
return 'Please enter idea title';
} else if (value.length < 3) {
return 'Title must be at least 3 characters';
}
return null;
}

String validateDescription(String value) {
if (value.isEmpty) {
return 'Please enter idea description';
} else if (value.length < 3) {
return 'Description must be at least 3 characters';
}
return null;
}

String validateTeamleader(String value) {
if (value.isEmpty) {
return 'Please enter a teamleader';
}
return null;
}

void createSprint() async {
final sprint = await _sprintService.create(
Sprint(
title: _sprintTitle,
description: _sprintDescription,
teamLeader: _sprintTeamleader,
),
);
if(onSprintCreated != null) onSprintCreated("Succes!");
print(sprint.toString());
}
}
30 changes: 30 additions & 0 deletions lib/controller/page/sprints_details_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import 'package:flutter/material.dart';
import 'package:idea_tracker/locator.dart';
import 'package:idea_tracker/model/sprint.dart';
import 'package:idea_tracker/service/authentication_service.dart';
import 'package:idea_tracker/service/sprint_service.dart';

class SprintsDetailsController extends ChangeNotifier {
Sprint _currentSprint;
final _sprintService = locator<SprintService>();
final _authService = locator<AuthenticationService>();

Sprint get currentSprint => _currentSprint;

set currentSprint(Sprint sprint){
_currentSprint = sprint;
notifyListeners();
}

UpdateSprintMember() async {
currentSprint = await _sprintService.update(
currentSprint, [UpdateSprint.member], [_authService
.getAuthenticatedUser()
.id
]);
}

initialize(){

}
}
4 changes: 4 additions & 0 deletions lib/locator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import 'package:get_it/get_it.dart';
import 'package:idea_tracker/controller/dialog/idea_edit_details_page_delete_dialog_controller.dart';
import 'package:idea_tracker/controller/dialog/landing_page_recover_password_dialog_controller.dart';
import 'package:idea_tracker/controller/page/create_idea_page_controller.dart';
import 'package:idea_tracker/controller/page/create_sprint_page_controller.dart';
import 'package:idea_tracker/controller/page/idea_edit_details_page_controller.dart';
import 'package:idea_tracker/controller/page/ideas_main_page_controller.dart';
import 'package:idea_tracker/controller/page/main_page_controller.dart';
import 'package:idea_tracker/controller/page/sprints_details_controller.dart';
import 'service/services.dart';
import 'package:idea_tracker/controller/page/sprints_page_controller.dart';

Expand All @@ -21,6 +23,8 @@ void setupLocator() {
locator.registerFactory(() => LandingPageRecoverPasswordDialogController());
locator.registerFactory(() => ProfilePageController());
locator.registerFactory(() => SprintsPageController());
locator.registerFactory(() => SprintsDetailsController());
locator.registerFactory(() => CreateSprintPageController());

/// Services
locator.registerSingleton(IdeaService());
Expand Down
1 change: 1 addition & 0 deletions lib/model/placeholder_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
// Git does not track empty directories. After a new file exists in this directory, this file can safely be deleted.
98 changes: 58 additions & 40 deletions lib/service/sprint_service.dart
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:idea_tracker/model/sprint.dart';
import '../model/sprint.dart';

///Use these enums to update parts of the Sprint Object
enum UpdateSprint {
title,
description,
addPotentialLeader,
deletePotentialLeader,
addMember,
deleteMember,
member,
teamLeader
}
enum UpdatePost { create, delete }
Expand Down Expand Up @@ -40,73 +39,92 @@ class SprintService {
debugPrint('removed Sprint ${sprint.id} from DB');
}

/// Uses the switch to update multiple properties within a sprint
/// Requires use of enum above this class
/// Use Case example:
/// _sprintServices.update(sprint, [UpdateSprint.title,
/// UpdateSprint.description], ['New Title', 'New Description sequence'])
Future<Sprint> update(Sprint sprint, List<UpdateSprint> updates,
List<String> updateStrings) async {
for (var i = 0; i < updates.length; i++) {
sprint = await _update(sprint, updates[i], updateStrings[i]);
if (updates.length == updateStrings.length) {
for (var i = 0; i < updates.length; i++) {
sprint = await _update(sprint, updates[i], updateStrings[i]);
}
return sprint;
} else {
debugPrint(
'The update will not work unless both lists have the same length');
}

return sprint;
}

///Switch to update sprint object...use case: sprintService.update(idea, UpdateSprint.title, 'new Title');
///returns the updated Sprint
/// Switch to update sprint object...
/// use case: sprintService.update(idea, UpdateSprint.title, 'new Title');
/// returns the updated Sprint
Future<Sprint> _update(
Sprint sprint, UpdateSprint update, String updateString) async {
Sprint updatedSprint = sprint;
switch (update) {
case UpdateSprint.title:
{
sprint = await _updateTitle(sprint, updateString);
return sprint;
updatedSprint = await _updateTitle(updatedSprint, updateString);
return updatedSprint;
}
break;
case UpdateSprint.description:
{
sprint = await _updateDescription(sprint, updateString);
return sprint;
updatedSprint = await _updateDescription(updatedSprint, updateString);
return updatedSprint;
}
break;
case UpdateSprint.teamLeader:
{
sprint = await _updateTeamLeader(sprint, updateString);
return sprint;
updatedSprint = await _updateTeamLeader(updatedSprint, updateString);
return updatedSprint;
}
break;
case UpdateSprint.addPotentialLeader:
{
sprint = await _addPotentialLeaders(sprint, updateString);
return sprint;
updatedSprint = await _addPotentialLeaders(updatedSprint, updateString);
return updatedSprint;
}
break;
case UpdateSprint.deletePotentialLeader:
{
sprint = await _deletePotentialLeaders(sprint, updateString);
return sprint;
updatedSprint = await _deletePotentialLeaders(updatedSprint, updateString);
return updatedSprint;
}
break;
case UpdateSprint.addMember:
case UpdateSprint.member:
{
sprint = await _addMember(sprint, updateString);
return sprint;
}
break;
case UpdateSprint.deleteMember:
{
sprint = await _deleteMember(sprint, updateString);
return sprint;
/// This checks to see if user already a member.
/// To get the number of members use list.length(); on the member list
/// within the Sprint object
if (!updatedSprint.members.contains(updateString)) {
updatedSprint = await _addMember(updatedSprint, updateString);
debugPrint('User $updateString added to member list for this sprint.');
} else {
debugPrint('User $updateString is already member of this sprint.');
updatedSprint = await _deleteMember(updatedSprint, updateString);
debugPrint('User $updateString removed from voters for this idea.');
}
return updatedSprint;
}
break;
default:
{
print(
"Nothing was updated, please use Enum UpdateSprint your Sprint ${sprint.id}.");
return sprint;
"Nothing was updated, please use Enum UpdateSprint your Sprint ${updatedSprint.id}.");
return updatedSprint;
}
}
}

///update posts within Sprint
/// update posts within Sprint
///...to update a post first delete post then create new post
/// list class here just adds new posts to the end of the list,
/// Firestore can only use arrays for lists so it follows typical array
/// addition and deletion functionality
Future<Sprint> updatePost(
Sprint sprint, UpdatePost updatePost, SprintPost sprintPost) async {
switch (updatePost) {
Expand Down Expand Up @@ -174,7 +192,7 @@ class SprintService {
debugPrint('getAllCurrent() performing...');
QuerySnapshot querySnapshot = await sprintRef
.where('createdAt',
isGreaterThanOrEqualTo: startOfMonth.millisecondsSinceEpoch)
isGreaterThanOrEqualTo: startOfMonth.millisecondsSinceEpoch)
.get()
.catchError(
(error) => print("Failed to get all Current Sprints: $error"));
Expand All @@ -185,7 +203,7 @@ class SprintService {
Sprint _fromFirestore(DocumentSnapshot doc) {
///converts _InternalLinkedHashMap<String, dynamic> to List<SprintPost>
List<Map<String, dynamic>> sprintPostDataMaps =
List<Map<String, dynamic>>.from(doc.data()['posts']);
List<Map<String, dynamic>>.from(doc.data()['posts']);
List<SprintPost> sprintPostList = sprintPostDataMaps
.map((post) => _sprintPostFromFirestore(post))
.toList()
Expand Down Expand Up @@ -229,13 +247,13 @@ class SprintService {
_sprintToJson(Sprint sprint, String id) {
return {
'id': sprint.id ?? id,
"title": sprint.title,
"title": sprint.title ?? '',
"titleArray":
sprint.title.toLowerCase().split(new RegExp('\\s+')).toList(),
"description": sprint.description,
sprint.title.toLowerCase().split(new RegExp('\\s+')).toList(),
"description": sprint.description ?? '',
"createdAt": DateTime.now().millisecondsSinceEpoch,
"teamLeader": sprint.teamLeader,
"updatedAt": sprint.updatedAt,
"teamLeader": sprint.teamLeader ?? '',
"updatedAt": sprint.updatedAt ?? DateTime.now().millisecondsSinceEpoch,
"potentialLeaders": sprint.potentialLeaders ?? new List<String>(),
"members": sprint.members ?? new List<String>(),
"posts": sprint.posts ?? new List<SprintPost>(),
Expand Down Expand Up @@ -301,7 +319,7 @@ class SprintService {
'Added potentialLeader: $potentialLeader to sprint ${sprint.id}');
await _updateUpdatedAt(sprint);
}).catchError(
(error) => debugPrint("Failed to add potential leader: $error"));
(error) => debugPrint("Failed to add potential leader: $error"));

///to get and store correct properties into class sprint object
return sprint = await get(sprint.id);
Expand All @@ -318,7 +336,7 @@ class SprintService {
'Deleted potentialLeaders: $potentialLeader to sprint ${sprint.id}');
await _updateUpdatedAt(sprint);
}).catchError(
(error) => debugPrint("Failed to delete potential leader $error"));
(error) => debugPrint("Failed to delete potential leader $error"));

///to get and store correct properties into class sprint object
return sprint = await get(sprint.id);
Expand Down Expand Up @@ -385,4 +403,4 @@ class SprintService {

return sprint = await get(sprint.id);
}
}
}
Empty file.
Loading