mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
filter
This commit is contained in:
@ -30,8 +30,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
on<ToggleNodeExpansion>(_onToggleNodeExpansion);
|
on<ToggleNodeExpansion>(_onToggleNodeExpansion);
|
||||||
on<ToggleNodeCheck>(_onToggleNodeCheck);
|
on<ToggleNodeCheck>(_onToggleNodeCheck);
|
||||||
on<EditInviteUsers>(_editInvitUser);
|
on<EditInviteUsers>(_editInvitUser);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _validateBasicsStep(ValidateBasicsStep event, Emitter<UsersState> emit) {
|
void _validateBasicsStep(ValidateBasicsStep event, Emitter<UsersState> emit) {
|
||||||
if (formKey.currentState?.validate() ?? false) {
|
if (formKey.currentState?.validate() ?? false) {
|
||||||
emit(const BasicsStepValidState());
|
emit(const BasicsStepValidState());
|
||||||
@ -381,7 +381,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
// Create a list of UUIDs to mark
|
// Create a list of UUIDs to mark
|
||||||
final uuidsToMark = res.spaces.map((space) => space.uuid).toList();
|
final uuidsToMark = res.spaces.map((space) => space.uuid).toList();
|
||||||
// Print all IDs and mark nodes in updatedCommunities
|
// Print all IDs and mark nodes in updatedCommunities
|
||||||
print('Printing and marking nodes in updatedCommunities:');
|
debugPrint('Printing and marking nodes in updatedCommunities:');
|
||||||
_printAndMarkNodes(updatedCommunities, uuidsToMark);
|
_printAndMarkNodes(updatedCommunities, uuidsToMark);
|
||||||
} else {
|
} else {
|
||||||
print('updatedCommunities is empty!');
|
print('updatedCommunities is empty!');
|
||||||
@ -391,34 +391,27 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
element.type ==
|
element.type ==
|
||||||
res.roleType.toString().toLowerCase().replaceAll("_", " "))
|
res.roleType.toString().toLowerCase().replaceAll("_", " "))
|
||||||
.uuid;
|
.uuid;
|
||||||
print('Role ID: $roleId');
|
debugPrint('Role ID: $roleId');
|
||||||
roleSelected = roleId;
|
roleSelected = roleId;
|
||||||
add(PermissionEvent(roleUuid: roleSelected));
|
add(PermissionEvent(roleUuid: roleSelected));
|
||||||
emit(ChangeStatusSteps());
|
emit(ChangeStatusSteps());
|
||||||
} else {
|
} else {}
|
||||||
// emit(UsersErrorState("User not found"));
|
} else {}
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// emit(UsersErrorState("Invalid user ID"));
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
print("Failed to fetch user data: $e");
|
print("Failed to fetch user data: $e");
|
||||||
// emit(UsersErrorState("Failed to fetch user data: $e"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Recursively print all the node IDs, including nested children.
|
|
||||||
/// Recursively print all node IDs and mark nodes as `isChecked` if their UUID exists in the list.
|
|
||||||
void _printAndMarkNodes(List<TreeNode> nodes, List<String> uuidsToMark,
|
void _printAndMarkNodes(List<TreeNode> nodes, List<String> uuidsToMark,
|
||||||
[int level = 0]) {
|
[int level = 0]) {
|
||||||
for (final node in nodes) {
|
for (final node in nodes) {
|
||||||
// Check if the current node's UUID exists in the list of UUIDs to mark.
|
|
||||||
if (uuidsToMark.contains(node.uuid)) {
|
if (uuidsToMark.contains(node.uuid)) {
|
||||||
node.isChecked = true; // Mark the node as checked.
|
node.isChecked = true;
|
||||||
print(
|
debugPrint(
|
||||||
'${' ' * level}MATCH FOUND: Node ID: ${node.uuid}, Title: ${node.title} is marked as checked.');
|
'${' ' * level}MATCH FOUND: Node ID: ${node.uuid}, Title: ${node.title} is marked as checked.');
|
||||||
} else {
|
} else {
|
||||||
print('${' ' * level}Node ID: ${node.uuid}, Title: ${node.title}');
|
debugPrint(
|
||||||
|
'${' ' * level}Node ID: ${node.uuid}, Title: ${node.title}');
|
||||||
}
|
}
|
||||||
if (node.children.isNotEmpty) {
|
if (node.children.isNotEmpty) {
|
||||||
_printAndMarkNodes(node.children, uuidsToMark, level + 1);
|
_printAndMarkNodes(node.children, uuidsToMark, level + 1);
|
||||||
@ -453,8 +446,6 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
emit(ChangeStatusSteps());
|
emit(ChangeStatusSteps());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Existing methods that remain in the BLoC:
|
|
||||||
|
|
||||||
void _updateChildrenCheckStatus(TreeNode node, bool isChecked) {
|
void _updateChildrenCheckStatus(TreeNode node, bool isChecked) {
|
||||||
for (var child in node.children) {
|
for (var child in node.children) {
|
||||||
child.isChecked = isChecked;
|
child.isChecked = isChecked;
|
||||||
@ -477,7 +468,6 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
(child.children.isEmpty || _areAllChildrenChecked(child)));
|
(child.children.isEmpty || _areAllChildrenChecked(child)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private helper method to find the parent of a given node.
|
|
||||||
TreeNode? _findParent(List<TreeNode> nodes, TreeNode target) {
|
TreeNode? _findParent(List<TreeNode> nodes, TreeNode target) {
|
||||||
for (var node in nodes) {
|
for (var node in nodes) {
|
||||||
if (node.children.contains(target)) {
|
if (node.children.contains(target)) {
|
||||||
@ -490,7 +480,4 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -129,8 +129,6 @@ class UpdateNodeCheckStatus extends UsersEvent {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [node];
|
List<Object?> get props => [node];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define new events
|
|
||||||
class ToggleNodeHighlightEvent extends UsersEvent {
|
class ToggleNodeHighlightEvent extends UsersEvent {
|
||||||
final TreeNode node;
|
final TreeNode node;
|
||||||
|
|
||||||
@ -161,14 +159,9 @@ class ToggleNodeCheckEvent extends UsersEvent {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [];
|
List<Object?> get props => [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// users_event.dart
|
|
||||||
|
|
||||||
// 1. Extend UsersEvent
|
|
||||||
class ToggleNodeCheck extends UsersEvent {
|
class ToggleNodeCheck extends UsersEvent {
|
||||||
final TreeNode node;
|
final TreeNode node;
|
||||||
|
|
||||||
// 2. Add a constructor that takes the node to toggle
|
|
||||||
ToggleNodeCheck(this.node);
|
ToggleNodeCheck(this.node);
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [];
|
List<Object?> get props => [];
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_svg/svg.dart';
|
||||||
import 'package:syncrow_web/utils/color_manager.dart';
|
import 'package:syncrow_web/utils/color_manager.dart';
|
||||||
import 'package:syncrow_web/utils/constants/assets.dart';
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
|
import 'package:syncrow_web/utils/extension/build_context_x.dart';
|
||||||
|
import 'package:syncrow_web/utils/style.dart';
|
||||||
|
|
||||||
Future<void> showPopUpFilterMenu({
|
Future<void> showPopUpFilterMenu({
|
||||||
required BuildContext context,
|
required BuildContext context,
|
||||||
@ -8,20 +11,18 @@ Future<void> showPopUpFilterMenu({
|
|||||||
Function()? onSortZtoA,
|
Function()? onSortZtoA,
|
||||||
Function()? cancelButton,
|
Function()? cancelButton,
|
||||||
required Map<String, bool> checkboxStates,
|
required Map<String, bool> checkboxStates,
|
||||||
|
required RelativeRect position,
|
||||||
|
// Function(String)? onTextFieldChanged,
|
||||||
Function()? onOkPressed,
|
Function()? onOkPressed,
|
||||||
List<String>? list,
|
List<String>? list,
|
||||||
}) async {
|
}) async {
|
||||||
final RenderBox overlay =
|
|
||||||
Overlay.of(context).context.findRenderObject() as RenderBox;
|
|
||||||
|
|
||||||
await showMenu(
|
await showMenu(
|
||||||
context: context,
|
context: context,
|
||||||
position: RelativeRect.fromLTRB(
|
position:position,
|
||||||
overlay.size.width / 4,
|
|
||||||
240,
|
|
||||||
overlay.size.width / 4,
|
|
||||||
0,
|
|
||||||
),
|
|
||||||
color: ColorsManager.whiteColors,
|
color: ColorsManager.whiteColors,
|
||||||
shape: const RoundedRectangleBorder(
|
shape: const RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
borderRadius: BorderRadius.all(Radius.circular(10)),
|
||||||
@ -58,17 +59,57 @@ Future<void> showPopUpFilterMenu({
|
|||||||
child: Text(
|
child: Text(
|
||||||
"Filter by Status",
|
"Filter by Status",
|
||||||
style: TextStyle(fontWeight: FontWeight.bold),
|
style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
),
|
)
|
||||||
|
// Container(
|
||||||
|
// decoration: containerDecoration.copyWith(
|
||||||
|
// boxShadow: [],
|
||||||
|
// borderRadius: const BorderRadius.only(
|
||||||
|
// topLeft: Radius.circular(10), topRight: Radius.circular(10))),
|
||||||
|
// child: Padding(
|
||||||
|
// padding: const EdgeInsets.all(8.0),
|
||||||
|
// child: TextFormField(
|
||||||
|
// onChanged: onTextFieldChanged,
|
||||||
|
// style: const TextStyle(color: Colors.black),
|
||||||
|
// decoration: textBoxDecoration(radios: 15)!.copyWith(
|
||||||
|
// fillColor: ColorsManager.whiteColors,
|
||||||
|
// errorStyle: const TextStyle(height: 0),
|
||||||
|
// hintStyle: context.textTheme.titleSmall?.copyWith(
|
||||||
|
// color: Colors.grey,
|
||||||
|
// fontSize: 12,
|
||||||
|
// ),
|
||||||
|
// hintText: 'Search',
|
||||||
|
// suffixIcon: SizedBox(
|
||||||
|
// child: SvgPicture.asset(
|
||||||
|
// Assets.searchIconUser,
|
||||||
|
// fit: BoxFit.none,
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// // "Filter by Status",
|
||||||
|
// // style: TextStyle(fontWeight: FontWeight.bold),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
|
// ),
|
||||||
),
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
child: SizedBox(
|
child: Container(
|
||||||
|
decoration: containerDecoration.copyWith(
|
||||||
|
boxShadow: [],
|
||||||
|
borderRadius: const BorderRadius.only(
|
||||||
|
bottomLeft: Radius.circular(10),
|
||||||
|
bottomRight: Radius.circular(10))),
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
height: 200,
|
height: 200,
|
||||||
width: 400,
|
width: 400,
|
||||||
|
child: Container(
|
||||||
|
padding: const EdgeInsets.all(10),
|
||||||
|
color: Colors.white,
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
itemCount: list?.length ?? 0,
|
itemCount: list?.length ?? 0,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final item = list![index];
|
final item = list![index];
|
||||||
return CheckboxListTile(
|
return CheckboxListTile(
|
||||||
|
dense: true,
|
||||||
title: Text(item),
|
title: Text(item),
|
||||||
value: checkboxStates[item],
|
value: checkboxStates[item],
|
||||||
onChanged: (bool? newValue) {
|
onChanged: (bool? newValue) {
|
||||||
@ -80,6 +121,7 @@ Future<void> showPopUpFilterMenu({
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
),
|
||||||
PopupMenuItem(
|
PopupMenuItem(
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
@ -19,8 +19,9 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
on<FilterUsersByRoleEvent>(_filterUsersByRole);
|
on<FilterUsersByRoleEvent>(_filterUsersByRole);
|
||||||
on<FilterUsersByJobEvent>(_filterUsersByJobTitle);
|
on<FilterUsersByJobEvent>(_filterUsersByJobTitle);
|
||||||
on<FilterUsersByCreatedEvent>(_filterUsersByCreated);
|
on<FilterUsersByCreatedEvent>(_filterUsersByCreated);
|
||||||
on<FilterUsersByDeActevateEvent>(_filterUserActevate);
|
on<FilterUsersByDeActevateEvent>(_filterUserStatus);
|
||||||
on<DeleteUserEvent>(_deleteUser);
|
on<DeleteUserEvent>(_deleteUser);
|
||||||
|
on<FilterClearEvent>(_filterClear);
|
||||||
}
|
}
|
||||||
int itemsPerPage = 10;
|
int itemsPerPage = 10;
|
||||||
int currentPage = 1;
|
int currentPage = 1;
|
||||||
@ -31,7 +32,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
List<String> roleTypes = [];
|
List<String> roleTypes = [];
|
||||||
List<String> jobTitle = [];
|
List<String> jobTitle = [];
|
||||||
List<String> createdBy = [];
|
List<String> createdBy = [];
|
||||||
List<String> deActivate = [];
|
List<String> status = ['active', 'invited', 'disabled'];
|
||||||
|
|
||||||
Future<void> _getUsers(GetUsers event, Emitter<UserTableState> emit) async {
|
Future<void> _getUsers(GetUsers event, Emitter<UserTableState> emit) async {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
@ -39,8 +40,14 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
roleTypes.clear();
|
roleTypes.clear();
|
||||||
jobTitle.clear();
|
jobTitle.clear();
|
||||||
createdBy.clear();
|
createdBy.clear();
|
||||||
deActivate.clear();
|
// deActivate.clear();
|
||||||
users = await UserPermissionApi().fetchUsers();
|
users = await UserPermissionApi().fetchUsers();
|
||||||
|
|
||||||
|
users.sort((a, b) {
|
||||||
|
final dateA = _parseDateTime(a.createdDate);
|
||||||
|
final dateB = _parseDateTime(b.createdDate);
|
||||||
|
return dateB.compareTo(dateA);
|
||||||
|
});
|
||||||
for (var user in users) {
|
for (var user in users) {
|
||||||
roleTypes.add(user.roleType.toString());
|
roleTypes.add(user.roleType.toString());
|
||||||
}
|
}
|
||||||
@ -50,20 +57,14 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
for (var user in users) {
|
for (var user in users) {
|
||||||
createdBy.add(user.invitedBy.toString());
|
createdBy.add(user.invitedBy.toString());
|
||||||
}
|
}
|
||||||
for (var user in users) {
|
// for (var user in users) {
|
||||||
deActivate.add(user.status.toString());
|
// deActivate.add(user.status.toString());
|
||||||
}
|
// }
|
||||||
|
initialUsers = List.from(users);
|
||||||
roleTypes = roleTypes.toSet().toList();
|
roleTypes = roleTypes.toSet().toList();
|
||||||
jobTitle = jobTitle.toSet().toList();
|
jobTitle = jobTitle.toSet().toList();
|
||||||
createdBy = createdBy.toSet().toList();
|
createdBy = createdBy.toSet().toList();
|
||||||
deActivate = deActivate.toSet().toList();
|
// deActivate = deActivate.toSet().toList();
|
||||||
|
|
||||||
users.sort((a, b) {
|
|
||||||
final dateA = _parseDateTime(a.createdDate);
|
|
||||||
final dateB = _parseDateTime(b.createdDate);
|
|
||||||
return dateB.compareTo(dateA);
|
|
||||||
});
|
|
||||||
initialUsers = List.from(users);
|
|
||||||
_handlePageChange(ChangePage(1), emit);
|
_handlePageChange(ChangePage(1), emit);
|
||||||
emit(UsersLoadedState(users: users));
|
emit(UsersLoadedState(users: users));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -127,7 +128,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
if (currentSortOrder == "Asc") {
|
if (currentSortOrder == "Asc") {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
currentSortOrder = "";
|
currentSortOrder = "";
|
||||||
users = List.from(initialUsers);
|
users = List.from(users);
|
||||||
emit(UsersLoadedState(users: users));
|
emit(UsersLoadedState(users: users));
|
||||||
} else {
|
} else {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
@ -248,39 +249,83 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
|
|||||||
emit(UsersLoadedState(users: paginatedUsers));
|
emit(UsersLoadedState(users: paginatedUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<String> selectedRoles = {};
|
||||||
|
Set<String> selectedJobTitles = {};
|
||||||
|
Set<String> selectedCreatedBy = {};
|
||||||
|
Set<String> selectedStatuses = {};
|
||||||
|
|
||||||
void _filterUsersByRole(
|
void _filterUsersByRole(
|
||||||
FilterUsersByRoleEvent event, Emitter<UserTableState> emit) {
|
FilterUsersByRoleEvent event, Emitter<UserTableState> emit) {
|
||||||
emit(UsersLoadingState());
|
selectedRoles = event.selectedRoles.toSet();
|
||||||
|
|
||||||
final filteredUsers = initialUsers.where((user) {
|
final filteredUsers = initialUsers.where((user) {
|
||||||
return event.selectedRoles.contains(user.roleType);
|
if (selectedRoles.isEmpty) return true;
|
||||||
|
return selectedRoles.contains(user.roleType);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
emit(UsersLoadedState(users: filteredUsers));
|
emit(UsersLoadedState(users: filteredUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _filterUsersByJobTitle(
|
void _filterUsersByJobTitle(
|
||||||
FilterUsersByJobEvent event, Emitter<UserTableState> emit) {
|
FilterUsersByJobEvent event, Emitter<UserTableState> emit) {
|
||||||
emit(UsersLoadingState());
|
selectedJobTitles = event.selectedJob.toSet();
|
||||||
final filteredUsers = users.where((user) {
|
|
||||||
return event.selectedJob.contains(user.jobTitle);
|
final filteredUsers = initialUsers.where((user) {
|
||||||
|
if (selectedJobTitles.isEmpty) return true;
|
||||||
|
return selectedJobTitles.contains(user.jobTitle);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
emit(UsersLoadedState(users: filteredUsers));
|
emit(UsersLoadedState(users: filteredUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _filterUsersByCreated(
|
void _filterUsersByCreated(
|
||||||
FilterUsersByCreatedEvent event, Emitter<UserTableState> emit) {
|
FilterUsersByCreatedEvent event, Emitter<UserTableState> emit) {
|
||||||
emit(UsersLoadingState());
|
selectedCreatedBy = event.selectedCreatedBy.toSet();
|
||||||
|
|
||||||
final filteredUsers = initialUsers.where((user) {
|
final filteredUsers = initialUsers.where((user) {
|
||||||
return event.selectedCreatedBy.contains(user.invitedBy);
|
if (selectedCreatedBy.isEmpty) return true;
|
||||||
|
return selectedCreatedBy.contains(user.invitedBy);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
emit(UsersLoadedState(users: filteredUsers));
|
emit(UsersLoadedState(users: filteredUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _filterUserActevate(
|
void _filterUserStatus(
|
||||||
FilterUsersByDeActevateEvent event, Emitter<UserTableState> emit) {
|
FilterUsersByDeActevateEvent event, Emitter<UserTableState> emit) {
|
||||||
emit(UsersLoadingState());
|
selectedStatuses = event.selectedActivate.toSet();
|
||||||
|
|
||||||
final filteredUsers = initialUsers.where((user) {
|
final filteredUsers = initialUsers.where((user) {
|
||||||
return event.selectedActivate.contains(user.status);
|
if (selectedStatuses.isEmpty) return true;
|
||||||
|
return selectedStatuses.contains(user.status);
|
||||||
}).toList();
|
}).toList();
|
||||||
|
|
||||||
emit(UsersLoadedState(users: filteredUsers));
|
emit(UsersLoadedState(users: filteredUsers));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _resetAllFilters(Emitter<UserTableState> emit) {
|
||||||
|
selectedRoles.clear();
|
||||||
|
selectedJobTitles.clear();
|
||||||
|
selectedCreatedBy.clear();
|
||||||
|
selectedStatuses.clear();
|
||||||
|
emit(UsersLoadedState(users: initialUsers));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _filterClear(FilterClearEvent event, Emitter<UserTableState> emit) {
|
||||||
|
selectedRoles.clear();
|
||||||
|
selectedJobTitles.clear();
|
||||||
|
selectedCreatedBy.clear();
|
||||||
|
selectedStatuses.clear();
|
||||||
|
emit(UsersLoadedState(users: initialUsers));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// void _filterOptions(FilterOptionsEvent event, Emitter<UserTableState> emit) {
|
||||||
|
// try {
|
||||||
|
// final query = event.query.toLowerCase();
|
||||||
|
// final filteredOptions = event.fullOptions
|
||||||
|
// .where((option) => option.toLowerCase().contains(query))
|
||||||
|
// .toList();
|
||||||
|
// emit(FilterOptionsState(filteredOptions));
|
||||||
|
// } catch (e) {
|
||||||
|
// emit(ErrorState(e.toString()));
|
||||||
|
// }
|
||||||
|
// }
|
@ -119,3 +119,19 @@ class FilterUsersByDeActevateEvent extends UserTableEvent {
|
|||||||
@override
|
@override
|
||||||
List<Object?> get props => [selectedActivate];
|
List<Object?> get props => [selectedActivate];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FilterOptionsEvent extends UserTableEvent {
|
||||||
|
final String query;
|
||||||
|
final List<String> fullOptions;
|
||||||
|
|
||||||
|
FilterOptionsEvent({required this.query, required this.fullOptions});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [query, fullOptions];
|
||||||
|
}
|
||||||
|
|
||||||
|
class FilterClearEvent extends UserTableEvent {
|
||||||
|
FilterClearEvent();
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
@ -80,3 +80,12 @@ final class ChangeTapStatus extends UserTableState {
|
|||||||
@override
|
@override
|
||||||
List<Object> get props => [select];
|
List<Object> get props => [select];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FilterOptionsState extends UserTableState {
|
||||||
|
final List<String> filteredOptions;
|
||||||
|
|
||||||
|
FilterOptionsState(this.filteredOptions);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [filteredOptions];
|
||||||
|
}
|
||||||
|
@ -122,7 +122,7 @@ class _DynamicTableScreenState extends State<DynamicTableScreen>
|
|||||||
),
|
),
|
||||||
if (index != 1 &&
|
if (index != 1 &&
|
||||||
index != 9 &&
|
index != 9 &&
|
||||||
index != 7 &&
|
index != 8 &&
|
||||||
index != 5)
|
index != 5)
|
||||||
FittedBox(
|
FittedBox(
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
|
@ -110,11 +110,12 @@ class UsersPage extends StatelessWidget {
|
|||||||
|
|
||||||
if (state is UsersLoadingState) {
|
if (state is UsersLoadingState) {
|
||||||
_blocRole.add(ChangePage(_blocRole.currentPage));
|
_blocRole.add(ChangePage(_blocRole.currentPage));
|
||||||
|
|
||||||
return const Center(child: CircularProgressIndicator());
|
return const Center(child: CircularProgressIndicator());
|
||||||
} else if (state is UsersLoadedState) {
|
} else if (state is UsersLoadedState) {
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.all(20),
|
padding: const EdgeInsets.all(20),
|
||||||
|
child: Align(
|
||||||
|
alignment: Alignment.topCenter,
|
||||||
child: ListView(
|
child: ListView(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
children: [
|
children: [
|
||||||
@ -130,7 +131,9 @@ class UsersPage extends StatelessWidget {
|
|||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
controller: searchController,
|
controller: searchController,
|
||||||
onChanged: (value) {
|
onChanged: (value) {
|
||||||
context.read<UserTableBloc>().add(SearchUsers(value));
|
context
|
||||||
|
.read<UserTableBloc>()
|
||||||
|
.add(SearchUsers(value));
|
||||||
},
|
},
|
||||||
style: const TextStyle(color: Colors.black),
|
style: const TextStyle(color: Colors.black),
|
||||||
decoration: textBoxDecoration(radios: 15)!.copyWith(
|
decoration: textBoxDecoration(radios: 15)!.copyWith(
|
||||||
@ -186,6 +189,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
const SizedBox(height: 25),
|
const SizedBox(height: 25),
|
||||||
DynamicTableScreen(
|
DynamicTableScreen(
|
||||||
onFilter: (columnIndex) {
|
onFilter: (columnIndex) {
|
||||||
|
_blocRole.add(FilterClearEvent());
|
||||||
|
|
||||||
if (columnIndex == 0) {
|
if (columnIndex == 0) {
|
||||||
showNameMenu(
|
showNameMenu(
|
||||||
context: context,
|
context: context,
|
||||||
@ -207,8 +212,16 @@ class UsersPage extends StatelessWidget {
|
|||||||
for (var item in _blocRole.jobTitle)
|
for (var item in _blocRole.jobTitle)
|
||||||
item: false, // Initialize with false
|
item: false, // Initialize with false
|
||||||
};
|
};
|
||||||
|
final RenderBox overlay = Overlay.of(context)
|
||||||
|
.context
|
||||||
|
.findRenderObject() as RenderBox;
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
|
position: RelativeRect.fromLTRB(
|
||||||
|
overlay.size.width / 4,
|
||||||
|
240,
|
||||||
|
overlay.size.width / 4,
|
||||||
|
0,
|
||||||
|
),
|
||||||
list: _blocRole.jobTitle,
|
list: _blocRole.jobTitle,
|
||||||
context: context,
|
context: context,
|
||||||
checkboxStates: checkboxStates,
|
checkboxStates: checkboxStates,
|
||||||
@ -235,10 +248,18 @@ class UsersPage extends StatelessWidget {
|
|||||||
if (columnIndex == 3) {
|
if (columnIndex == 3) {
|
||||||
final Map<String, bool> checkboxStates = {
|
final Map<String, bool> checkboxStates = {
|
||||||
for (var item in _blocRole.roleTypes)
|
for (var item in _blocRole.roleTypes)
|
||||||
item: false, // Initialize with false
|
item: _blocRole.selectedRoles.contains(item),
|
||||||
};
|
};
|
||||||
|
final RenderBox overlay = Overlay.of(context)
|
||||||
|
.context
|
||||||
|
.findRenderObject() as RenderBox;
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
|
position: RelativeRect.fromLTRB(
|
||||||
|
overlay.size.width / 4,
|
||||||
|
240,
|
||||||
|
overlay.size.width / 4,
|
||||||
|
0,
|
||||||
|
),
|
||||||
list: _blocRole.roleTypes,
|
list: _blocRole.roleTypes,
|
||||||
context: context,
|
context: context,
|
||||||
checkboxStates: checkboxStates,
|
checkboxStates: checkboxStates,
|
||||||
@ -248,7 +269,9 @@ class UsersPage extends StatelessWidget {
|
|||||||
.map((entry) => entry.key)
|
.map((entry) => entry.key)
|
||||||
.toList();
|
.toList();
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
_blocRole.add(FilterUsersByRoleEvent(selectedItems));
|
context
|
||||||
|
.read<UserTableBloc>()
|
||||||
|
.add(FilterUsersByRoleEvent(selectedItems));
|
||||||
},
|
},
|
||||||
onSortAtoZ: () {
|
onSortAtoZ: () {
|
||||||
context
|
context
|
||||||
@ -281,10 +304,18 @@ class UsersPage extends StatelessWidget {
|
|||||||
if (columnIndex == 6) {
|
if (columnIndex == 6) {
|
||||||
final Map<String, bool> checkboxStates = {
|
final Map<String, bool> checkboxStates = {
|
||||||
for (var item in _blocRole.createdBy)
|
for (var item in _blocRole.createdBy)
|
||||||
item: false, // Initialize with false
|
item: _blocRole.selectedCreatedBy.contains(item),
|
||||||
};
|
};
|
||||||
|
final RenderBox overlay = Overlay.of(context)
|
||||||
|
.context
|
||||||
|
.findRenderObject() as RenderBox;
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
|
position: RelativeRect.fromLTRB(
|
||||||
|
overlay.size.width / 1,
|
||||||
|
240,
|
||||||
|
overlay.size.width / 4,
|
||||||
|
0,
|
||||||
|
),
|
||||||
list: _blocRole.createdBy,
|
list: _blocRole.createdBy,
|
||||||
context: context,
|
context: context,
|
||||||
checkboxStates: checkboxStates,
|
checkboxStates: checkboxStates,
|
||||||
@ -309,6 +340,46 @@ class UsersPage extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (columnIndex == 7) {
|
||||||
|
final Map<String, bool> checkboxStates = {
|
||||||
|
for (var item in _blocRole.status)
|
||||||
|
item: _blocRole.selectedCreatedBy.contains(item),
|
||||||
|
};
|
||||||
|
final RenderBox overlay = Overlay.of(context)
|
||||||
|
.context
|
||||||
|
.findRenderObject() as RenderBox;
|
||||||
|
showPopUpFilterMenu(
|
||||||
|
position: RelativeRect.fromLTRB(
|
||||||
|
overlay.size.width / 0,
|
||||||
|
240,
|
||||||
|
overlay.size.width / 4,
|
||||||
|
0,
|
||||||
|
),
|
||||||
|
list: _blocRole.status,
|
||||||
|
context: context,
|
||||||
|
checkboxStates: checkboxStates,
|
||||||
|
onOkPressed: () {
|
||||||
|
final selectedItems = checkboxStates.entries
|
||||||
|
.where((entry) => entry.value)
|
||||||
|
.map((entry) => entry.key)
|
||||||
|
.toList();
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
_blocRole
|
||||||
|
.add(FilterUsersByCreatedEvent(selectedItems));
|
||||||
|
},
|
||||||
|
onSortAtoZ: () {
|
||||||
|
context
|
||||||
|
.read<UserTableBloc>()
|
||||||
|
.add(const SortUsersByNameAsc());
|
||||||
|
},
|
||||||
|
onSortZtoA: () {
|
||||||
|
context
|
||||||
|
.read<UserTableBloc>()
|
||||||
|
.add(const SortUsersByNameDesc());
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
if (columnIndex == 8) {
|
if (columnIndex == 8) {
|
||||||
showDeActivateFilterMenu(
|
showDeActivateFilterMenu(
|
||||||
context: context,
|
context: context,
|
||||||
@ -347,9 +418,15 @@ class UsersPage extends StatelessWidget {
|
|||||||
Text(user.createdDate ?? ''),
|
Text(user.createdDate ?? ''),
|
||||||
Text(user.createdTime ?? ''),
|
Text(user.createdTime ?? ''),
|
||||||
Text(user.invitedBy),
|
Text(user.invitedBy),
|
||||||
|
status(
|
||||||
|
status: user.isEnabled == false
|
||||||
|
? 'disabled'
|
||||||
|
: user.status,
|
||||||
|
),
|
||||||
changeIconStatus(
|
changeIconStatus(
|
||||||
status:
|
status: user.isEnabled == false
|
||||||
user.isEnabled == false ? 'disabled' : user.status,
|
? 'disabled'
|
||||||
|
: user.status,
|
||||||
userId: user.uuid,
|
userId: user.uuid,
|
||||||
onTap: user.status != "invited"
|
onTap: user.status != "invited"
|
||||||
? () {
|
? () {
|
||||||
@ -367,10 +444,6 @@ class UsersPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
status(
|
|
||||||
status:
|
|
||||||
user.isEnabled == false ? 'disabled' : user.status,
|
|
||||||
),
|
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
// actionButton(
|
// actionButton(
|
||||||
@ -404,8 +477,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return DeleteUserDialog(
|
return DeleteUserDialog(
|
||||||
onTapDelete: () {
|
onTapDelete: () {
|
||||||
_blocRole.add(
|
_blocRole.add(DeleteUserEvent(
|
||||||
DeleteUserEvent(user.uuid, context));
|
user.uuid, context));
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
@ -433,13 +506,14 @@ class UsersPage extends StatelessWidget {
|
|||||||
child: NumberPagination(
|
child: NumberPagination(
|
||||||
buttonRadius: 10,
|
buttonRadius: 10,
|
||||||
selectedButtonColor: ColorsManager.secondaryColor,
|
selectedButtonColor: ColorsManager.secondaryColor,
|
||||||
buttonUnSelectedBorderColor: ColorsManager.grayBorder,
|
buttonUnSelectedBorderColor:
|
||||||
|
ColorsManager.grayBorder,
|
||||||
lastPageIcon:
|
lastPageIcon:
|
||||||
const Icon(Icons.keyboard_double_arrow_right),
|
const Icon(Icons.keyboard_double_arrow_right),
|
||||||
firstPageIcon:
|
firstPageIcon:
|
||||||
const Icon(Icons.keyboard_double_arrow_left),
|
const Icon(Icons.keyboard_double_arrow_left),
|
||||||
totalPages:
|
totalPages: (_blocRole.users.length /
|
||||||
(_blocRole.users.length / _blocRole.itemsPerPage)
|
_blocRole.itemsPerPage)
|
||||||
.ceil(),
|
.ceil(),
|
||||||
currentPage: _blocRole.currentPage,
|
currentPage: _blocRole.currentPage,
|
||||||
onPageChanged: (int pageNumber) {
|
onPageChanged: (int pageNumber) {
|
||||||
@ -455,6 +529,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
} else if (state is ErrorState) {
|
} else if (state is ErrorState) {
|
||||||
return Center(child: Text(state.message));
|
return Center(child: Text(state.message));
|
||||||
|
Reference in New Issue
Block a user