This commit is contained in:
mohammad
2025-01-06 14:20:57 +03:00
parent 3876909bea
commit fe8f8160ec
8 changed files with 580 additions and 413 deletions

View File

@ -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;
} }
} }

View File

@ -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 => [];

View File

@ -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,

View File

@ -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()));
// }
// }

View File

@ -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 => [];
}

View File

@ -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];
}

View File

@ -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(

View File

@ -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));