Skip to content

Commit

Permalink
There is no distinct add admins section in create new event page inst…
Browse files Browse the repository at this point in the history
…ead you can add any member from the org. The separation between admins and members was pointless and was adding redundancy so removed it. (#1611)

* develop-no-admins

* _selectedAdmins cleared

* Removed Comments

* Required Changes

* Linting problems removed

* Unused imports

* Fixing a test

* Some tests fixed

* Testing add members test passed

* Add admins test section removed

* Improved test coverage

* Test coverage improved further

* Trying conflict resolution

* Unnecessary code removal

* Documentation added

* Documentation improved further

* Custom Linting changes
  • Loading branch information
Kushalrock authored Mar 13, 2023
1 parent 3e7dcad commit e776b85
Show file tree
Hide file tree
Showing 8 changed files with 216 additions and 265 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,4 @@
// ignore_for_file: talawa_api_doc
// ignore_for_file: talawa_good_doc_comments

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:talawa/locator.dart';
Expand All @@ -15,7 +11,8 @@ import 'package:talawa/utils/event_queries.dart';
import 'package:talawa/view_model/base_view_model.dart';
import 'package:talawa/widgets/custom_progress_dialog.dart';

/// CreateEventViewModel class have methods to interact with model in
/// CreateEventViewModel class have methods to interact with model in.
///
/// the context of creating the event in the organization.
///
/// Methods include:
Expand All @@ -28,43 +25,102 @@ class CreateEventViewModel extends BaseModel {
late MultiMediaPickerService _multiMediaPickerService;
late File? _imageFile;

/// Event Title Text Controller.
TextEditingController eventTitleTextController = TextEditingController();

/// Event Location Text Controller.
TextEditingController eventLocationTextController = TextEditingController();

/// Event Description Text Controller.
TextEditingController eventDescriptionTextController =
TextEditingController();

/// Event Start Time.
TimeOfDay eventStartTime = TimeOfDay.now();

/// Event End Time.
TimeOfDay eventEndTime = TimeOfDay.now();

/// Event Start Date.
DateTime eventStartDate = DateTime.now();

/// Event End Date.
DateTime eventEndDate = DateTime.now();

/// Public Event or Not.
bool isPublicSwitch = true;

/// If event is registerable after creation.
bool isRegisterableSwitch = true;

/// TitleFocus FocusNode.
FocusNode titleFocus = FocusNode();

/// LocationFocus FocusNode.
FocusNode locationFocus = FocusNode();

/// DescriptionFocus FocusNode.
FocusNode descriptionFocus = FocusNode();

/// Latitude store.
double? latitude;

/// Longitude store.
double? longitude;

//late OrganizationService _organizationService;
late final Map<String, bool> _adminCheckedMap = {};
late final List<User> _selectedAdmins = [];
late final Map<String, bool> _memberCheckedMap = {};
late final List<User> _selectedMembers = [];

/// Organisation Members List.
late List<User> orgMembersList = [];

/// Global FormKey.
final formKey = GlobalKey<FormState>();
final _eventService = locator<EventService>();

/// AutoValidateMode default to disabled.
AutovalidateMode validate = AutovalidateMode.disabled;

late OrgInfo _currentOrg;
final _userConfig = locator<UserConfig>();
List<User> get selectedAdmins => _selectedAdmins;

/// Getter to return selected members.
///
/// params:
/// None
///
/// returns:
/// * `List<User>`: Returns a list of selectedMembers for events
List<User> get selectedMembers => _selectedMembers;
Map<String, bool> get adminCheckedMap => _adminCheckedMap;

/// Getter to return members map.
///
/// params:
/// None
///
/// returns:
/// * `Map<String, bool>`: Returns a map of entries with id and boolean if they are
/// selected for events or not in bottom sheet.
Map<String, bool> get memberCheckedMap => _memberCheckedMap;

/// Getter to return imageFile.
///
/// params:
/// None
///
/// returns:
/// * `File?`: Returns imageFile.
File? get imageFile => _imageFile;

initialize() {
/// Function To Initialize.
///
/// params:
/// None
///
/// returns:
/// None
void initialize() {
_currentOrg = _userConfig.currentOrg;
//_organizationService = locator<OrganizationService>();

Expand All @@ -73,8 +129,13 @@ class CreateEventViewModel extends BaseModel {
}

/// This function is used to create the event for the organization.
///
/// The function uses `database_mutation_functions` services to call the graphQL mutation
/// for creating an event and passes the required variables for the event.
/// params:
/// None
/// returns:
/// * `Future<void>`: Asynchronous function for creating event
Future<void> createEvent() async {
titleFocus.unfocus();
locationFocus.unfocus();
Expand Down Expand Up @@ -141,10 +202,13 @@ class CreateEventViewModel extends BaseModel {
}

/// This function is used to get the image from gallery.
///
/// The function uses the `_multiMediaPickerService` services.
///
/// params:
/// * [camera] : if true then open camera for image, else open gallery to select image.
/// * `camera`: if true then open camera for image, else open gallery to select image.
/// returns:
/// * `Future<void>`: Asynchronous function for getting image from gallery
Future<void> getImageFromGallery({bool camera = false}) async {
final image =
await _multiMediaPickerService.getPhotoFromGallery(camera: camera);
Expand All @@ -155,6 +219,9 @@ class CreateEventViewModel extends BaseModel {
}

/// This function remove the selected image.
///
/// params:
/// None
void removeImage() {
_imageFile = null;
notifyListeners();
Expand All @@ -163,41 +230,37 @@ class CreateEventViewModel extends BaseModel {
/// This function fetch all the users in the current organization and return `List`.
///
/// params:
/// * [isAdmin]
Future<List<User>> getCurrentOrgUsersList({required bool isAdmin}) async {
/// None
/// returns:
/// * `Future<List<User>>`: Current Organization Users List
Future<List<User>> getCurrentOrgUsersList() async {
if (orgMembersList.isEmpty) {
orgMembersList = await organizationService
.getOrgMembersList(userConfig.currentOrg.id!);
}

// loop through list
orgMembersList.forEach((orgMember) {
// if `orgMember` is admin
if (isAdmin) {
_adminCheckedMap.putIfAbsent(orgMember.id!, () => false);
} else {
_memberCheckedMap.putIfAbsent(orgMember.id!, () => false);
}
_memberCheckedMap.putIfAbsent(orgMember.id!, () => false);
_memberCheckedMap.putIfAbsent(orgMember.id!, () => false);
});
// return list
return orgMembersList;
}

/// This function build the user list. `_selectedAdmins` for admins and `_selectedMembers` for members.
/// This function build the user list.
///
/// params:
/// * [isAdmin]
void buildUserList({required bool isAdmin}) {
isAdmin ? _selectedAdmins.clear() : _selectedMembers.clear();
/// None
/// returns:
/// None
void buildUserList() {
_selectedMembers.clear();

// loop through the organization member list

orgMembersList.forEach((orgMember) {
// if admin
if (_adminCheckedMap[orgMember.id] == true && isAdmin) {
_selectedAdmins.add(orgMember);
} else if (_memberCheckedMap[orgMember.id] == true && !isAdmin) {
if (_memberCheckedMap[orgMember.id] == true) {
_selectedMembers.add(orgMember);
}
});
Expand All @@ -207,17 +270,12 @@ class CreateEventViewModel extends BaseModel {
/// This function is used to remove a user from user's list.
///
/// params:
/// * [isAdmin] : true if the user that need to be removed is admin else false.
/// * [userId] : id of the user that need to be removed.
void removeUserFromList({required bool isAdmin, required String userId}) {
// if the user is admin.
if (isAdmin) {
_selectedAdmins.removeWhere((user) => user.id == userId);
_adminCheckedMap[userId] = false;
} else {
_selectedMembers.removeWhere((user) => user.id == userId);
_memberCheckedMap[userId] = false;
}
/// * `userId`: id of the user that need to be removed.
/// returns:
/// None
void removeUserFromList({required String userId}) {
_selectedMembers.removeWhere((user) => user.id == userId);
_memberCheckedMap[userId] = false;

notifyListeners();
}
Expand Down
47 changes: 0 additions & 47 deletions lib/views/after_auth_screens/events/create_event_page.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
// ignore_for_file: talawa_api_doc
// ignore_for_file: talawa_good_doc_comments

import 'package:flutter/material.dart';
import 'package:talawa/locator.dart';
import 'package:talawa/services/navigation_service.dart';
Expand Down Expand Up @@ -306,55 +303,12 @@ class _CreateEventPageState extends State<CreateEventPage> {
),
SizedBox(height: SizeConfig.screenHeight! * 0.026),
const Divider(),
InkWell(
// InkWell class in Flutter is a rectangular area in Flutter
// of a material that responds to touch in an application.
key: const Key('inwell_cep1'),
onTap: () {
// EventBottomSheet is custom widget that is used to add users to the event.
EventBottomSheet().addUserBottomSheet(
context: context,
model: model,
isAdmin: true,
);
},
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Add Admins", style: subtitleTextStyle),
Icon(
Icons.add,
color: Theme.of(context).colorScheme.secondary,
)
],
),
),
Wrap(
children: model.selectedAdmins
.map(
(user) => MemberNameTile(
userName: "${user.firstName!} ${user.lastName!}",
userImage: user.image,
onDelete: () {
model.removeUserFromList(
isAdmin: true,
userId: user.id!,
);
},
),
)
.toList()
.cast<Widget>(),
),
SizedBox(height: SizeConfig.screenHeight! * 0.026),
const Divider(),
InkWell(
key: const Key('inwell_cep2'),
onTap: () {
EventBottomSheet().addUserBottomSheet(
context: context,
model: model,
isAdmin: false,
);
},
child: Row(
Expand All @@ -376,7 +330,6 @@ class _CreateEventPageState extends State<CreateEventPage> {
userImage: user.image,
onDelete: () {
model.removeUserFromList(
isAdmin: false,
userId: user.id!,
);
},
Expand Down
41 changes: 15 additions & 26 deletions lib/widgets/add_members_bottom_sheet.dart
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
// ignore_for_file: talawa_api_doc
// ignore_for_file: talawa_good_doc_comments

import 'package:flutter/material.dart';
import 'package:talawa/models/user/user_info.dart';
import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart';

/// Adds admins and members to an organization
/// Adds members to an event.
class EventBottomSheet {
/// This function creates a modal material design bottom sheet
/// This function creates a modal material design bottom sheet.
///
/// to let the user add admin or members to an organization.
/// params:
/// * `context`: BuildContext
/// * `model`: CreateEventViewModel
void addUserBottomSheet({
required BuildContext context,
required CreateEventViewModel model,
required bool isAdmin,
}) {
// Returns a Future that resolves to the value ("context") passed
// to Navigator.pop
Expand Down Expand Up @@ -42,24 +42,22 @@ class EventBottomSheet {
padding: const EdgeInsets.all(10),
child: Column(
children: [
Text(
// Set "isAdmin" "true" if the user wants to add admins,
// else "false"
isAdmin ? "Add Admins" : "Add Members",
style: const TextStyle(fontSize: 16),
const Text(
"Add Members",
style: TextStyle(fontSize: 16),
),
TextButton(
key: const Key('text_btn_ambs1'),
onPressed: () {
model.buildUserList(isAdmin: isAdmin);
model.buildUserList();
Navigator.pop(context);
},
child: const Text("Done"),
),
const Divider(),
FutureBuilder(
// an admin can access the list of the members in an organization
future: model.getCurrentOrgUsersList(isAdmin: isAdmin),
future: model.getCurrentOrgUsersList(),
builder: (
BuildContext context,
AsyncSnapshot<List<User>> snapshot,
Expand Down Expand Up @@ -91,22 +89,13 @@ class EventBottomSheet {
title: Text(
"${snapshot.data![index].firstName!} ${snapshot.data![index].lastName!}",
),
value: isAdmin
? model.adminCheckedMap[
snapshot.data![index].id]
: model.memberCheckedMap[
snapshot.data![index].id],
value: model.memberCheckedMap[
snapshot.data![index].id],
onChanged: (val) {
setState(
() {
if (isAdmin) {
model.adminCheckedMap[snapshot
.data![index].id!] = val!;
} else {
model.memberCheckedMap[
snapshot.data![index]
.id!] = val!;
}
model.memberCheckedMap[snapshot
.data![index].id!] = val!;
},
);
},
Expand Down
Loading

0 comments on commit e776b85

Please sign in to comment.