formatted all files.

This commit is contained in:
Faris Armoush
2025-06-12 15:33:32 +03:00
parent 29959f567e
commit 04250ebc98
474 changed files with 5425 additions and 4338 deletions

View File

@ -1,4 +1,3 @@
import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
@ -11,7 +10,6 @@ import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialo
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/model/tree_node_model.dart';
import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart';
import 'package:syncrow_web/pages/space_tree/bloc/space_tree_event.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/community_model.dart';
import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model.dart';
import 'package:syncrow_web/services/space_mana_api.dart';
import 'package:syncrow_web/services/user_permission.dart';
@ -66,7 +64,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
void isCompleteSpacesFun(
CheckSpacesStepStatus event, Emitter<UsersState> emit) {
emit(UsersLoadingState());
var spaceBloc =
final spaceBloc =
NavigationService.navigatorKey.currentContext!.read<SpaceTreeBloc>();
isCompleteSpaces = spaceBloc.state.selectedCommunities.isNotEmpty;
@ -83,26 +81,25 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
String communityUuid) async {
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
return await CommunitySpaceManagementApi()
return CommunitySpaceManagementApi()
.getSpaceHierarchy(communityUuid, projectUuid);
}
List<TreeNode> updatedCommunities = [];
List<TreeNode> spacesNodes = [];
List<String> communityIds = [];
_onLoadCommunityAndSpaces(
Future<void> _onLoadCommunityAndSpaces(
LoadCommunityAndSpacesEvent event, Emitter<UsersState> emit) async {
try {
emit(UsersLoadingState());
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
List<CommunityModel> communities =
final communities =
await CommunitySpaceManagementApi().fetchCommunities(projectUuid);
communityIds = communities.map((community) => community.uuid).toList();
updatedCommunities = await Future.wait(
communities.map((community) async {
List<SpaceModel> spaces =
await _fetchSpacesForCommunity(community.uuid);
final spaces = await _fetchSpacesForCommunity(community.uuid);
spacesNodes = _buildTreeNodes(spaces);
return TreeNode(
uuid: community.uuid,
@ -129,7 +126,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
// Build tree nodes from your data model.
List<TreeNode> _buildTreeNodes(List<SpaceModel> spaces) {
return spaces.map((space) {
List<TreeNode> childNodes =
final childNodes =
space.children.isNotEmpty ? _buildTreeNodes(space.children) : [];
return TreeNode(
uuid: space.uuid!,
@ -170,7 +167,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
_clearHighlights(updatedCommunities);
} else {
// Start with a fresh clone of the original tree.
List<TreeNode> freshClone = _cloneNodes(originalCommunities);
final freshClone = _cloneNodes(originalCommunities);
_searchAndHighlightNodes(freshClone, event.searchTerm!);
@ -180,7 +177,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
void _clearHighlights(List<TreeNode> nodes) {
for (var node in nodes) {
for (final node in nodes) {
node.isHighlighted = false;
if (node.children.isNotEmpty) {
_clearHighlights(node.children);
@ -189,11 +186,11 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
bool _searchAndHighlightNodes(List<TreeNode> nodes, String searchTerm) {
bool anyMatch = false;
for (var node in nodes) {
bool isMatch =
var anyMatch = false;
for (final node in nodes) {
final isMatch =
node.title.toLowerCase().contains(searchTerm.toLowerCase());
bool childMatch = _searchAndHighlightNodes(node.children, searchTerm);
final childMatch = _searchAndHighlightNodes(node.children, searchTerm);
node.isHighlighted = isMatch || childMatch;
anyMatch = anyMatch || node.isHighlighted;
@ -202,11 +199,11 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
List<TreeNode> _filterNodes(List<TreeNode> nodes, String searchTerm) {
List<TreeNode> filteredNodes = [];
for (var node in nodes) {
bool isMatch =
final filteredNodes = <TreeNode>[];
for (final node in nodes) {
final isMatch =
node.title.toLowerCase().contains(searchTerm.toLowerCase());
List<TreeNode> filteredChildren = _filterNodes(node.children, searchTerm);
final filteredChildren = _filterNodes(node.children, searchTerm);
if (isMatch || filteredChildren.isNotEmpty) {
node.isHighlighted = isMatch;
node.children = filteredChildren;
@ -289,8 +286,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
List<String> selectedIds = [];
List<String> getSelectedIds(List<TreeNode> nodes) {
List<String> selectedIds = [];
for (var node in nodes) {
final selectedIds = <String>[];
for (final node in nodes) {
if (node.isChecked) {
selectedIds.add(node.uuid);
}
@ -304,7 +301,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
List<RoleTypeModel> roles = [];
List<PermissionOption> permissions = [];
_getRolePermission(RoleEvent event, Emitter<UsersState> emit) async {
Future<void> _getRolePermission(
RoleEvent event, Emitter<UsersState> emit) async {
try {
emit(UsersLoadingState());
roles = await UserPermissionApi().fetchRoles();
@ -314,11 +312,12 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
}
_getPermissions(PermissionEvent event, Emitter<UsersState> emit) async {
Future<void> _getPermissions(
PermissionEvent event, Emitter<UsersState> emit) async {
try {
emit(UsersLoadingState());
permissions = await UserPermissionApi().fetchPermission(
event.roleUuid == "" ? roles.first.uuid : event.roleUuid);
event.roleUuid == '' ? roles.first.uuid : event.roleUuid);
roleSelected = event.roleUuid!;
emit(RolePermissionInitial());
} catch (e) {
@ -327,18 +326,19 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
bool _searchRolePermission(List<PermissionOption> nodes, String searchTerm) {
bool anyMatch = false;
for (var node in nodes) {
bool isMatch =
var anyMatch = false;
for (final node in nodes) {
final isMatch =
node.title.toLowerCase().contains(searchTerm.toLowerCase());
bool childMatch = _searchRolePermission(node.subOptions, searchTerm);
final childMatch = _searchRolePermission(node.subOptions, searchTerm);
node.isHighlighted = isMatch || childMatch;
anyMatch = anyMatch || node.isHighlighted;
}
return anyMatch;
}
void _sendInvitUser(SendInviteUsers event, Emitter<UsersState> emit) async {
Future<void> _sendInvitUser(
SendInviteUsers event, Emitter<UsersState> emit) async {
try {
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
@ -346,10 +346,10 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
// List<String> selectedIds =
// getSelectedIds(updatedCommunities).where((id) => !communityIds.contains(id)).toList();
List<String> selectedSpacesId = getSelectedSpacesIds();
final selectedSpacesId = getSelectedSpacesIds();
// List<String> selectedIds = getSelectedIds(updatedCommunities);
bool res = await UserPermissionApi().sendInviteUser(
final res = await UserPermissionApi().sendInviteUser(
email: emailController.text,
firstName: firstNameController.text,
jobTitle: jobTitleController.text,
@ -363,9 +363,9 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
showCustomDialog(
barrierDismissible: false,
context: event.context,
message: "The invite was sent successfully.",
message: 'The invite was sent successfully.',
iconPath: Assets.deviceNoteIcon,
title: "Invite Success",
title: 'Invite Success',
dialogHeight: MediaQuery.of(event.context).size.height * 0.3,
actions: <Widget>[
TextButton(
@ -382,27 +382,28 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
emit(SaveState());
} catch (e) {
emit(ErrorState('Failed to send invite: ${e.toString()}'));
emit(ErrorState('Failed to send invite: $e'));
}
}
List<String> getSelectedSpacesIds() {
List<String> selectedSpacesId = [];
var spaceBloc =
final selectedSpacesId = <String>[];
final spaceBloc =
NavigationService.navigatorKey.currentContext!.read<SpaceTreeBloc>();
for (var community in spaceBloc.state.selectedCommunities) {
for (final community in spaceBloc.state.selectedCommunities) {
selectedSpacesId
.addAll(spaceBloc.state.selectedCommunityAndSpaces[community] ?? []);
}
return selectedSpacesId;
}
_editInviteUser(EditInviteUsers event, Emitter<UsersState> emit) async {
Future<void> _editInviteUser(
EditInviteUsers event, Emitter<UsersState> emit) async {
try {
emit(UsersLoadingState());
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
bool res = await UserPermissionApi().editInviteUser(
final res = await UserPermissionApi().editInviteUser(
userId: event.userId,
firstName: firstNameController.text,
jobTitle: jobTitleController.text,
@ -415,9 +416,9 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
showCustomDialog(
barrierDismissible: false,
context: event.context,
message: "The invite was sent successfully.",
message: 'The invite was sent successfully.',
iconPath: Assets.deviceNoteIcon,
title: "Invite Success",
title: 'Invite Success',
dialogHeight: MediaQuery.of(event.context).size.height * 0.3,
actions: <Widget>[
TextButton(
@ -436,7 +437,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
emit(SaveState());
} catch (e) {
emit(ErrorState('Failed to send invite: ${e.toString()}'));
emit(ErrorState('Failed to send invite: $e'));
}
}
@ -455,7 +456,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
Future<void> checkEmail(
CheckEmailEvent event, Emitter<UsersState> emit) async {
emit(UsersLoadingState());
String? res = await UserPermissionApi().checkEmail(
final res = await UserPermissionApi().checkEmail(
emailController.text,
);
checkEmailValid = res!;
@ -469,8 +470,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
final emailRegex = RegExp(
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
);
bool isEmailValid = emailRegex.hasMatch(emailController.text);
bool isEmailServerValid = checkEmailValid == 'Valid email';
final isEmailValid = emailRegex.hasMatch(emailController.text);
final isEmailServerValid = checkEmailValid == 'Valid email';
isCompleteBasics = firstNameController.text.isNotEmpty &&
lastNameController.text.isNotEmpty &&
emailController.text.isNotEmpty &&
@ -486,7 +487,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
void _clearHighlightsRolePermission(List<PermissionOption> nodes) {
for (var node in nodes) {
for (final node in nodes) {
node.isHighlighted = false;
if (node.subOptions.isNotEmpty) {
_clearHighlightsRolePermission(node.subOptions);
@ -515,7 +516,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
emit(UsersLoadingState());
try {
var spaceBloc =
final spaceBloc =
NavigationService.navigatorKey.currentContext!.read<SpaceTreeBloc>();
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
@ -533,9 +534,9 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
res.roleType;
res.spaces.map((space) {
selectedIds.add(space.uuid);
CommunityModel community = spaceBloc.state.communityList
final community = spaceBloc.state.communityList
.firstWhere((item) => item.uuid == space.communityUuid);
spaceBloc.add(OnSpaceSelected(community, space.uuid, []));
spaceBloc.add(OnSpaceSelected(community, space.uuid, const []));
}).toList();
// if (updatedCommunities.isNotEmpty) {
@ -548,7 +549,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
final roleId = roles
.firstWhere((element) =>
element.type ==
res.roleType.toString().toLowerCase().replaceAll("_", " "))
res.roleType.toLowerCase().replaceAll('_', ' '))
.uuid;
debugPrint('Role ID: $roleId');
roleSelected = roleId;
@ -604,14 +605,14 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
void _updateChildrenCheckStatus(TreeNode node, bool isChecked) {
for (var child in node.children) {
for (final child in node.children) {
child.isChecked = isChecked;
_updateChildrenCheckStatus(child, isChecked);
}
}
void _updateParentCheckStatus(TreeNode node) {
TreeNode? parent = _findParent(updatedCommunities, node);
final parent = _findParent(updatedCommunities, node);
if (parent != null) {
parent.isChecked = _areAllChildrenChecked(parent);
_updateParentCheckStatus(parent);
@ -626,7 +627,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
}
TreeNode? _findParent(List<TreeNode> nodes, TreeNode target) {
for (var node in nodes) {
for (final node in nodes) {
if (node.children.contains(target)) {
return node;
}

View File

@ -48,7 +48,7 @@ class RoleEvent extends UsersEvent {
class PermissionEvent extends UsersEvent {
final String? roleUuid;
const PermissionEvent({this.roleUuid = ""});
const PermissionEvent({this.roleUuid = ''});
@override
List<Object?> get props => [roleUuid];
}

View File

@ -17,7 +17,7 @@ class PermissionOption {
return PermissionOption(
id: json['id'] ?? '',
title: json['title'] != null
? json['title'].toString().toLowerCase().replaceAll("_", " ")
? json['title'].toString().toLowerCase().replaceAll('_', ' ')
: '',
isChecked: json['isChecked'] ?? false,
isHighlighted: json['isHighlighted'] ?? false,

View File

@ -14,4 +14,4 @@ class TreeNode {
this.isExpanded = false,
this.children = const [],
});
}
}

View File

@ -29,12 +29,13 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
child: BlocConsumer<UsersBloc, UsersState>(
listener: (context, state) {},
builder: (context, state) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
final blocRole = BlocProvider.of<UsersBloc>(context);
return Dialog(
child: Container(
decoration: const BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(20))),
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(20))),
width: 900,
child: Column(
children: [
@ -43,7 +44,7 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
padding: EdgeInsets.all(8.0),
child: SizedBox(
child: Text(
"Add New User",
'Add New User',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
@ -61,9 +62,10 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStep1Indicator(1, "Basics", _blocRole),
_buildStep2Indicator(2, "Spaces", _blocRole),
_buildStep3Indicator(3, "Role & Permissions", _blocRole),
_buildStep1Indicator(1, 'Basics', blocRole),
_buildStep2Indicator(2, 'Spaces', blocRole),
_buildStep3Indicator(
3, 'Role & Permissions', blocRole),
],
),
),
@ -101,31 +103,35 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
onTap: () {
Navigator.of(context).pop();
},
child: const Text("Cancel"),
child: const Text('Cancel'),
),
InkWell(
onTap: () {
_blocRole.add(const CheckEmailEvent());
blocRole.add(const CheckEmailEvent());
setState(() {
if (currentStep < 3) {
currentStep++;
if (currentStep == 2) {
_blocRole.add(const CheckStepStatus(isEditUser: false));
blocRole.add(const CheckStepStatus(
isEditUser: false));
} else if (currentStep == 3) {
_blocRole.add(const CheckSpacesStepStatus());
blocRole.add(const CheckSpacesStepStatus());
}
} else {
_blocRole.add(SendInviteUsers(context: context));
blocRole
.add(SendInviteUsers(context: context));
}
});
},
child: Text(
currentStep < 3 ? "Next" : "Save",
currentStep < 3 ? 'Next' : 'Save',
style: TextStyle(
color: (_blocRole.isCompleteSpaces == false ||
_blocRole.isCompleteBasics == false ||
_blocRole.isCompleteRolePermissions == false) &&
color: (blocRole.isCompleteSpaces == false ||
blocRole.isCompleteBasics ==
false ||
blocRole.isCompleteRolePermissions ==
false) &&
currentStep == 3
? ColorsManager.grayColor
: ColorsManager.secondaryColor),
@ -196,8 +202,12 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],
@ -260,8 +270,12 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],
@ -291,7 +305,7 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
currentStep = step;
step3 = step;
bloc.add(const CheckSpacesStepStatus());
bloc.add(CheckStepStatus(isEditUser: false));
bloc.add(const CheckStepStatus(isEditUser: false));
});
},
child: Column(
@ -318,8 +332,12 @@ class _AddNewUserDialogState extends State<AddNewUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],

View File

@ -15,12 +15,12 @@ class BasicsView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<UsersBloc, UsersState>(builder: (context, state) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
final blocRole = BlocProvider.of<UsersBloc>(context);
if (state is BasicsStepInvalidState) {
_blocRole.formKey.currentState?.validate();
blocRole.formKey.currentState?.validate();
}
return Form(
key: _blocRole.formKey,
key: blocRole.formKey,
child: ListView(
shrinkWrap: true,
children: [
@ -57,7 +57,7 @@ class BasicsView extends StatelessWidget {
child: Row(
children: [
const Text(
" * ",
' * ',
style: TextStyle(
color: ColorsManager.red,
fontWeight: FontWeight.w900,
@ -84,9 +84,9 @@ class BasicsView extends StatelessWidget {
// _blocRole.add(const ValidateBasicsStep());
// });
// },
controller: _blocRole.firstNameController,
controller: blocRole.firstNameController,
decoration: inputTextFormDeco(
hintText: "Enter first name",
hintText: 'Enter first name',
).copyWith(
hintStyle: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w400,
@ -117,7 +117,7 @@ class BasicsView extends StatelessWidget {
child: Row(
children: [
const Text(
" * ",
' * ',
style: TextStyle(
color: ColorsManager.red,
fontWeight: FontWeight.w900,
@ -140,10 +140,10 @@ class BasicsView extends StatelessWidget {
// _blocRole.add(ValidateBasicsStep());
// });
// },
controller: _blocRole.lastNameController,
controller: blocRole.lastNameController,
style: const TextStyle(color: Colors.black),
decoration:
inputTextFormDeco(hintText: "Enter last name")
inputTextFormDeco(hintText: 'Enter last name')
.copyWith(
hintStyle: context.textTheme.bodyMedium
?.copyWith(
@ -172,7 +172,7 @@ class BasicsView extends StatelessWidget {
child: Row(
children: [
const Text(
" * ",
' * ',
style: TextStyle(
color: ColorsManager.red,
fontWeight: FontWeight.w900,
@ -199,9 +199,9 @@ class BasicsView extends StatelessWidget {
// _blocRole.add(ValidateBasicsStep());
// });
// },
controller: _blocRole.emailController,
controller: blocRole.emailController,
style: const TextStyle(color: ColorsManager.blackColor),
decoration: inputTextFormDeco(hintText: "name@example.com")
decoration: inputTextFormDeco(hintText: 'name@example.com')
.copyWith(
hintStyle: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w400,
@ -218,9 +218,10 @@ class BasicsView extends StatelessWidget {
if (!emailRegex.hasMatch(value)) {
return 'Enter a valid Email Address';
}
if (_blocRole.checkEmailValid != "Valid email") {
return _blocRole.checkEmailValid;
if (blocRole.checkEmailValid != 'Valid email') {
return blocRole.checkEmailValid;
}
return null;
// return null;
},
),
@ -254,7 +255,7 @@ class BasicsView extends StatelessWidget {
const TextStyle(color: ColorsManager.blackColor),
textInputAction: TextInputAction.done,
decoration: inputTextFormDeco(
hintText: "05x xxx xxxx",
hintText: '05x xxx xxxx',
).copyWith(
hintStyle: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w400,
@ -264,32 +265,32 @@ class BasicsView extends StatelessWidget {
initialCountryCode: 'AE',
countries: const [
Country(
name: "United Arab Emirates",
name: 'United Arab Emirates',
nameTranslations: {
"en": "United Arab Emirates",
"ar": "الإمارات العربية المتحدة",
'en': 'United Arab Emirates',
'ar': 'الإمارات العربية المتحدة',
},
flag: "🇦🇪",
code: "AE",
dialCode: "971",
flag: '🇦🇪',
code: 'AE',
dialCode: '971',
minLength: 9,
maxLength: 9,
),
Country(
name: "Saudi Arabia",
name: 'Saudi Arabia',
nameTranslations: {
"en": "Saudi Arabia",
"ar": "السعودية",
'en': 'Saudi Arabia',
'ar': 'السعودية',
},
flag: "🇸🇦",
code: "SA",
dialCode: "966",
flag: '🇸🇦',
code: 'SA',
dialCode: '966',
minLength: 9,
maxLength: 9,
),
],
style: const TextStyle(color: Colors.black),
controller: _blocRole.phoneController,
controller: blocRole.phoneController,
)
],
),
@ -314,11 +315,11 @@ class BasicsView extends StatelessWidget {
Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
controller: _blocRole.jobTitleController,
controller: blocRole.jobTitleController,
style:
const TextStyle(color: ColorsManager.blackColor),
decoration: inputTextFormDeco(
hintText: "Job Title (Optional)")
hintText: 'Job Title (Optional)')
.copyWith(
hintStyle: context.textTheme.bodyMedium?.copyWith(
fontWeight: FontWeight.w400,

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart';
@ -19,7 +18,7 @@ class TreeView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
final blocRole = BlocProvider.of<UsersBloc>(context);
return BlocProvider(
create: (_) => UsersBloc(),
// ..add(const LoadCommunityAndSpacesEvent()),
@ -34,7 +33,7 @@ class TreeView extends StatelessWidget {
return const Center(child: CircularProgressIndicator());
}
return SingleChildScrollView(
child: _buildTree(_blocRole.updatedCommunities, _blocRole),
child: _buildTree(blocRole.updatedCommunities, blocRole),
);
},
),
@ -48,7 +47,7 @@ class TreeView extends StatelessWidget {
}) {
return Column(
children: nodes.map((node) {
return Container(
return ColoredBox(
color: node.isHighlighted ? Colors.blue.shade50 : Colors.transparent,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,

View File

@ -1,10 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:syncrow_web/utils/color_manager.dart';
class DeleteUserDialog extends StatefulWidget {
final Function()? onTapDelete;
DeleteUserDialog({super.key, this.onTapDelete});
const DeleteUserDialog({super.key, this.onTapDelete});
@override
_DeleteUserDialogState createState() => _DeleteUserDialogState();
@ -35,7 +34,7 @@ class _DeleteUserDialogState extends State<DeleteUserDialog> {
padding: EdgeInsets.all(8.0),
child: SizedBox(
child: Text(
"Delete User",
'Delete User',
style: TextStyle(
color: ColorsManager.red,
fontSize: 18,
@ -54,7 +53,7 @@ class _DeleteUserDialogState extends State<DeleteUserDialog> {
child: Padding(
padding: EdgeInsets.only(left: 25, right: 25, top: 10, bottom: 10),
child: Text(
"Are you sure you want to delete this user?",
'Are you sure you want to delete this user?',
textAlign: TextAlign.center,
),
)),

View File

@ -1,7 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_status.dart';
@ -31,15 +30,17 @@ class _EditUserDialogState extends State<EditUserDialog> {
..add(GetUserByIdEvent(uuid: widget.userId)),
child: BlocConsumer<UsersBloc, UsersState>(listener: (context, state) {
if (state is SpacesLoadedState) {
BlocProvider.of<UsersBloc>(context).add(GetUserByIdEvent(uuid: widget.userId));
BlocProvider.of<UsersBloc>(context)
.add(GetUserByIdEvent(uuid: widget.userId));
}
}, builder: (context, state) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
final blocRole = BlocProvider.of<UsersBloc>(context);
return Dialog(
child: Container(
decoration: const BoxDecoration(
color: Colors.white, borderRadius: BorderRadius.all(Radius.circular(20))),
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(20))),
width: 900,
child: Column(
children: [
@ -48,7 +49,7 @@ class _EditUserDialogState extends State<EditUserDialog> {
padding: EdgeInsets.all(8.0),
child: SizedBox(
child: Text(
"Edit User",
'Edit User',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w700,
@ -66,9 +67,10 @@ class _EditUserDialogState extends State<EditUserDialog> {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildStep1Indicator(1, "Basics", _blocRole),
_buildStep2Indicator(2, "Spaces", _blocRole),
_buildStep3Indicator(3, "Role & Permissions", _blocRole),
_buildStep1Indicator(1, 'Basics', blocRole),
_buildStep2Indicator(2, 'Spaces', blocRole),
_buildStep3Indicator(
3, 'Role & Permissions', blocRole),
],
),
),
@ -106,7 +108,7 @@ class _EditUserDialogState extends State<EditUserDialog> {
onTap: () {
Navigator.of(context).pop();
},
child: const Text("Cancel"),
child: const Text('Cancel'),
),
InkWell(
onTap: () {
@ -116,22 +118,24 @@ class _EditUserDialogState extends State<EditUserDialog> {
if (currentStep < 3) {
currentStep++;
if (currentStep == 2) {
_blocRole.add(CheckStepStatus(isEditUser: true));
blocRole.add(
const CheckStepStatus(isEditUser: true));
} else if (currentStep == 3) {
_blocRole.add(const CheckSpacesStepStatus());
blocRole.add(const CheckSpacesStepStatus());
}
} else {
_blocRole
.add(EditInviteUsers(context: context, userId: widget.userId!));
blocRole.add(EditInviteUsers(
context: context, userId: widget.userId!));
}
});
},
child: Text(
currentStep < 3 ? "Next" : "Save",
currentStep < 3 ? 'Next' : 'Save',
style: TextStyle(
color: (_blocRole.isCompleteSpaces == false ||
_blocRole.isCompleteBasics == false ||
_blocRole.isCompleteRolePermissions == false) &&
color: (blocRole.isCompleteSpaces == false ||
blocRole.isCompleteBasics == false ||
blocRole.isCompleteRolePermissions ==
false) &&
currentStep == 3
? ColorsManager.grayColor
: ColorsManager.secondaryColor),
@ -172,7 +176,7 @@ class _EditUserDialogState extends State<EditUserDialog> {
bloc.add(const CheckSpacesStepStatus());
currentStep = step;
Future.delayed(const Duration(milliseconds: 500), () {
bloc.add(ValidateBasicsStep());
bloc.add(const ValidateBasicsStep());
});
});
@ -204,8 +208,12 @@ class _EditUserDialogState extends State<EditUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],
@ -233,7 +241,7 @@ class _EditUserDialogState extends State<EditUserDialog> {
onTap: () {
setState(() {
currentStep = step;
bloc.add(CheckStepStatus(isEditUser: true));
bloc.add(const CheckStepStatus(isEditUser: true));
if (step3 == 3) {
bloc.add(const CheckRoleStepStatus());
}
@ -263,8 +271,12 @@ class _EditUserDialogState extends State<EditUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],
@ -294,7 +306,7 @@ class _EditUserDialogState extends State<EditUserDialog> {
currentStep = step;
step3 = step;
bloc.add(const CheckSpacesStepStatus());
bloc.add(CheckStepStatus(isEditUser: true));
bloc.add(const CheckStepStatus(isEditUser: true));
});
},
child: Column(
@ -321,8 +333,12 @@ class _EditUserDialogState extends State<EditUserDialog> {
label,
style: TextStyle(
fontSize: 16,
color: currentStep == step ? ColorsManager.blackColor : ColorsManager.greyColor,
fontWeight: currentStep == step ? FontWeight.bold : FontWeight.normal,
color: currentStep == step
? ColorsManager.blackColor
: ColorsManager.greyColor,
fontWeight: currentStep == step
? FontWeight.bold
: FontWeight.normal,
),
),
],

View File

@ -7,7 +7,7 @@ import 'package:syncrow_web/utils/extension/build_context_x.dart';
class PermissionManagement extends StatefulWidget {
final UsersBloc? bloc;
const PermissionManagement({Key? key, this.bloc}) : super(key: key);
const PermissionManagement({super.key, this.bloc});
@override
_PermissionManagementState createState() => _PermissionManagementState();
@ -16,25 +16,25 @@ class PermissionManagement extends StatefulWidget {
class _PermissionManagementState extends State<PermissionManagement> {
void toggleOptionById(String id) {
setState(() {
for (var mainOption in widget.bloc!.permissions) {
for (final mainOption in widget.bloc!.permissions) {
if (mainOption.id == id) {
final isChecked =
checkifOneOfthemChecked(mainOption) == CheckState.all;
mainOption.isChecked = !isChecked;
for (var subOption in mainOption.subOptions) {
for (final subOption in mainOption.subOptions) {
subOption.isChecked = !isChecked;
for (var child in subOption.subOptions) {
for (final child in subOption.subOptions) {
child.isChecked = !isChecked;
}
}
return;
}
for (var subOption in mainOption.subOptions) {
for (final subOption in mainOption.subOptions) {
if (subOption.id == id) {
subOption.isChecked = !subOption.isChecked;
for (var child in subOption.subOptions) {
for (final child in subOption.subOptions) {
child.isChecked = subOption.isChecked;
}
mainOption.isChecked =
@ -42,7 +42,7 @@ class _PermissionManagementState extends State<PermissionManagement> {
return;
}
for (var child in subOption.subOptions) {
for (final child in subOption.subOptions) {
if (child.id == id) {
child.isChecked = !child.isChecked;
subOption.isChecked =
@ -58,17 +58,17 @@ class _PermissionManagementState extends State<PermissionManagement> {
}
CheckState checkifOneOfthemChecked(PermissionOption mainOption) {
bool allSelected = true;
bool someSelected = false;
var allSelected = true;
var someSelected = false;
for (var subOption in mainOption.subOptions) {
for (final subOption in mainOption.subOptions) {
if (subOption.isChecked) {
someSelected = true;
} else {
allSelected = false;
}
for (var child in subOption.subOptions) {
for (final child in subOption.subOptions) {
if (child.isChecked) {
someSelected = true;
} else {
@ -143,7 +143,7 @@ class _PermissionManagementState extends State<PermissionManagement> {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
ColoredBox(
color: option.isHighlighted
? Colors.blue.shade50
: Colors.white,
@ -208,7 +208,7 @@ class _PermissionManagementState extends State<PermissionManagement> {
itemCount: subOption.subOptions.length,
itemBuilder: (context, index) {
final child = subOption.subOptions[index];
return Container(
return ColoredBox(
color: option.isHighlighted
? Colors.blue.shade50
: Colors.white,
@ -260,7 +260,7 @@ class _PermissionManagementState extends State<PermissionManagement> {
)
],
);
}).toList(),
}),
],
);
},
@ -268,28 +268,27 @@ class _PermissionManagementState extends State<PermissionManagement> {
}
}
// Container(
// height: 50,
// width: 120,
// child: CheckboxListTile(
// activeColor: ColorsManager.dialogBlueTitle,
// selectedTileColor: child.isHighlighted
// ? Colors.blue.shade50
// : Colors.white,
// dense: true,
// controlAffinity:
// ListTileControlAffinity.leading,
// title: Text(
// child.title,
// style: context.textTheme.bodyMedium?.copyWith(
// fontWeight: FontWeight.w400,
// fontSize: 12,
// color: ColorsManager.lightGreyColor),
// ),
// value: child.isChecked,
// onChanged: (value) =>
// toggleOptionById(child.id),
// enabled: false,
// ),
// ),
// Container(
// height: 50,
// width: 120,
// child: CheckboxListTile(
// activeColor: ColorsManager.dialogBlueTitle,
// selectedTileColor: child.isHighlighted
// ? Colors.blue.shade50
// : Colors.white,
// dense: true,
// controlAffinity:
// ListTileControlAffinity.leading,
// title: Text(
// child.title,
// style: context.textTheme.bodyMedium?.copyWith(
// fontWeight: FontWeight.w400,
// fontSize: 12,
// color: ColorsManager.lightGreyColor),
// ),
// value: child.isChecked,
// onChanged: (value) =>
// toggleOptionById(child.id),
// enabled: false,
// ),
// ),

View File

@ -47,9 +47,9 @@ Future<void> showPopUpFilterMenu({
width: 25,
),
title: Text(
"Sort A to Z",
'Sort A to Z',
style: TextStyle(
color: isSelected == "Asc"
color: isSelected == 'Asc'
? ColorsManager.blackColor
: ColorsManager.grayColor),
),
@ -72,16 +72,16 @@ Future<void> showPopUpFilterMenu({
width: 25,
),
title: Text(
"Sort Z to A",
'Sort Z to A',
style: TextStyle(
color: isSelected == "Desc"
color: isSelected == 'Desc'
? ColorsManager.blackColor
: ColorsManager.grayColor),
),
),
const Divider(),
const Text(
"Filter by ",
'Filter by ',
style: TextStyle(fontWeight: FontWeight.bold),
),
Container(
@ -113,7 +113,8 @@ Future<void> showPopUpFilterMenu({
),
Text(
item,
style: TextStyle(color: ColorsManager.grayColor),
style: const TextStyle(
color: ColorsManager.grayColor),
),
],
);
@ -136,12 +137,12 @@ Future<void> showPopUpFilterMenu({
onTap: () {
Navigator.of(context).pop(); // Close the menu
},
child: const Text("Cancel"),
child: const Text('Cancel'),
),
GestureDetector(
onTap: onOkPressed,
child: const Text(
"OK",
'OK',
style: TextStyle(
color: ColorsManager.spaceColor,
),

View File

@ -31,7 +31,7 @@ class _RoleDropdownState extends State<RoleDropdown> {
const Row(
children: [
Text(
" * ",
' * ',
style: TextStyle(
color: ColorsManager.red,
fontWeight: FontWeight.w900,
@ -39,7 +39,7 @@ class _RoleDropdownState extends State<RoleDropdown> {
),
),
Text(
"Role",
'Role',
style: TextStyle(
fontWeight: FontWeight.bold,
fontSize: 16,
@ -77,7 +77,7 @@ class _RoleDropdownState extends State<RoleDropdown> {
hint: const Padding(
padding: EdgeInsets.only(left: 10),
child: Text(
"Please Select",
'Please Select',
style: TextStyle(
color: ColorsManager.textGray,
),

View File

@ -16,11 +16,11 @@ class RolesAndPermission extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<UsersBloc, UsersState>(builder: (context, state) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
return Container(
final blocRole = BlocProvider.of<UsersBloc>(context);
return ColoredBox(
color: Colors.white,
child: Form(
key: _blocRole.formKey,
key: blocRole.formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
@ -39,7 +39,7 @@ class RolesAndPermission extends StatelessWidget {
width: 350,
height: 100,
child: RoleDropdown(
bloc: _blocRole,
bloc: blocRole,
)),
const SizedBox(height: 10),
Expanded(
@ -69,11 +69,10 @@ class RolesAndPermission extends StatelessWidget {
child: TextFormField(
style:
const TextStyle(color: Colors.black),
controller:
_blocRole.roleSearchController,
controller: blocRole.roleSearchController,
onChanged: (value) {
_blocRole.add(SearchPermission(
nodes: _blocRole.permissions,
blocRole.add(SearchPermission(
nodes: blocRole.permissions,
searchTerm: value));
},
decoration: textBoxDecoration(radios: 20)!
@ -107,10 +106,10 @@ class RolesAndPermission extends StatelessWidget {
child: Container(
color: ColorsManager.circleRolesBackground,
padding: const EdgeInsets.all(8.0),
child: Container(
child: ColoredBox(
color: ColorsManager.whiteColors,
child: PermissionManagement(
bloc: _blocRole,
bloc: blocRole,
))))
],
),

View File

@ -11,19 +11,21 @@ class SpacesAccessView extends StatelessWidget {
@override
Widget build(BuildContext context) {
return BlocBuilder<UsersBloc, UsersState>(builder: (context, state) {
final _blocRole = BlocProvider.of<UsersBloc>(context);
return Container(
final blocRole = BlocProvider.of<UsersBloc>(context);
return ColoredBox(
color: Colors.white,
child: Form(
key: _blocRole.formKey,
key: blocRole.formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Text(
'Spaces access',
style: context.textTheme.bodyLarge
?.copyWith(fontWeight: FontWeight.w700, fontSize: 20, color: Colors.black),
style: context.textTheme.bodyLarge?.copyWith(
fontWeight: FontWeight.w700,
fontSize: 20,
color: Colors.black),
),
const SizedBox(
height: 35,

View File

@ -6,8 +6,6 @@ import 'package:syncrow_web/pages/roles_and_permission/model/roles_user_model.da
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_event.dart';
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/bloc/user_table_state.dart';
import 'package:syncrow_web/services/user_permission.dart';
import 'package:syncrow_web/utils/constants/strings_manager.dart';
import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart';
class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
UserTableBloc() : super(TableInitial()) {
@ -60,20 +58,20 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
final dateB = _parseDateTime(b.createdDate);
return dateB.compareTo(dateA);
});
for (var user in users) {
for (final user in users) {
roleTypes.add(user.roleType.toString());
}
for (var user in users) {
for (final user in users) {
jobTitle.add(user.jobTitle.toString());
}
for (var user in users) {
createdBy.add(user.invitedBy.toString());
for (final user in users) {
createdBy.add(user.invitedBy);
}
initialUsers = List.from(users);
roleTypes = roleTypes.toSet().toList();
jobTitle = jobTitle.toSet().toList();
createdBy = createdBy.toSet().toList();
_handlePageChange(ChangePage(1), emit);
_handlePageChange(const ChangePage(1), emit);
totalUsersCount = initialUsers;
add(ChangePage(currentPage));
emit(UsersLoadedState(users: users));
@ -86,7 +84,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
DeleteUserEvent event, Emitter<UserTableState> emit) async {
emit(UsersLoadingState());
try {
bool res = await UserPermissionApi().deleteUserById(event.userId);
final res = await UserPermissionApi().deleteUserById(event.userId);
if (res == true) {
Navigator.of(event.context).pop(true);
} else {
@ -104,8 +102,8 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
emit(UsersLoadingState());
bool res = await UserPermissionApi().changeUserStatusById(event.userId,
event.newStatus == "disabled" ? false : true, projectUuid);
final res = await UserPermissionApi().changeUserStatusById(event.userId,
event.newStatus == 'disabled' ? false : true, projectUuid);
if (res == true) {
add(const GetUsers());
}
@ -121,13 +119,13 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
selectedJobTitles.clear();
selectedCreatedBy.clear();
selectedStatuses.clear();
if (currentSortOrder == "Asc") {
if (currentSortOrder == 'Asc') {
emit(UsersLoadingState());
currentSortOrder = "";
currentSortOrder = '';
users = List.from(users);
} else {
emit(UsersLoadingState());
currentSortOrder = "Asc";
currentSortOrder = 'Asc';
users.sort((a, b) => a.firstName
.toString()
.toLowerCase()
@ -146,13 +144,13 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
selectedJobTitles.clear();
selectedCreatedBy.clear();
selectedStatuses.clear();
if (currentSortOrder == "Desc") {
if (currentSortOrder == 'Desc') {
emit(UsersLoadingState());
currentSortOrder = "";
currentSortOrder = '';
users = List.from(initialUsers);
} else {
emit(UsersLoadingState());
currentSortOrder = "Desc";
currentSortOrder = 'Desc';
users.sort((a, b) => b.firstName!.compareTo(a.firstName!));
}
currentSortJopTitle = '';
@ -168,15 +166,15 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
selectedJobTitles.clear();
selectedCreatedBy.clear();
selectedStatuses.clear();
if (currentSortOrderDate == "NewestToOldest") {
if (currentSortOrderDate == 'NewestToOldest') {
emit(UsersLoadingState());
currentSortOrder = "";
currentSortOrderDate = "";
currentSortOrder = '';
currentSortOrderDate = '';
users = List.from(initialUsers);
emit(UsersLoadedState(users: users));
} else {
emit(UsersLoadingState());
currentSortOrder = "NewestToOldest";
currentSortOrder = 'NewestToOldest';
users.sort((a, b) {
final dateA = _parseDateTime(a.createdDate);
final dateB = _parseDateTime(b.createdDate);
@ -192,10 +190,10 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
selectedJobTitles.clear();
selectedCreatedBy.clear();
selectedStatuses.clear();
if (currentSortOrderDate == "OldestToNewest") {
if (currentSortOrderDate == 'OldestToNewest') {
emit(UsersLoadingState());
currentSortOrder = "";
currentSortOrderDate = "";
currentSortOrder = '';
currentSortOrderDate = '';
users = List.from(initialUsers);
emit(UsersLoadedState(users: users));
} else {
@ -205,7 +203,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
final dateB = _parseDateTime(b.createdDate);
return dateA.compareTo(dateB);
});
currentSortOrder = "OldestToNewest";
currentSortOrder = 'OldestToNewest';
emit(UsersLoadedState(users: users));
}
}
@ -228,7 +226,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
emit(TableSearch());
final query = event.query.toLowerCase();
final filteredUsers = initialUsers.where((user) {
final fullName = "${user.firstName} ${user.lastName}".toLowerCase();
final fullName = '${user.firstName} ${user.lastName}'.toLowerCase();
final email = user.email.toLowerCase();
return fullName.contains(query) || email.contains(query);
}).toList();
@ -283,22 +281,22 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
return selectedRoles.contains(user.roleType);
}).toList();
if (event.sortOrder == "Asc") {
currentSortOrder = "Asc";
if (event.sortOrder == 'Asc') {
currentSortOrder = 'Asc';
filteredUsers.sort((a, b) => a.firstName
.toString()
.toLowerCase()
.compareTo(b.firstName.toString().toLowerCase()));
} else if (event.sortOrder == "Desc") {
currentSortOrder = "Desc";
} else if (event.sortOrder == 'Desc') {
currentSortOrder = 'Desc';
filteredUsers.sort((a, b) => b.firstName!.compareTo(a.firstName!));
} else {}
currentSortOrder = "";
currentSortOrder = '';
currentSortCreatedDate = '';
currentSortStatus = '';
currentSortCreatedBy = '';
currentSortJopTitle = '';
currentSortOrderDate = "";
currentSortOrderDate = '';
totalUsersCount = filteredUsers;
@ -313,22 +311,22 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
if (selectedJobTitles.isEmpty) return true;
return selectedJobTitles.contains(user.jobTitle);
}).toList();
if (event.sortOrder == "Asc") {
currentSortOrder = "Asc";
if (event.sortOrder == 'Asc') {
currentSortOrder = 'Asc';
filteredUsers.sort((a, b) => a.firstName
.toString()
.toLowerCase()
.compareTo(b.firstName.toString().toLowerCase()));
} else if (event.sortOrder == "Desc") {
currentSortOrder = "Desc";
} else if (event.sortOrder == 'Desc') {
currentSortOrder = 'Desc';
filteredUsers.sort((a, b) => b.firstName!.compareTo(a.firstName!));
} else {}
currentSortOrder = "";
currentSortOrder = '';
currentSortCreatedDate = '';
currentSortStatus = '';
currentSortCreatedBy = '';
currentSortRole = '';
currentSortOrderDate = "";
currentSortOrderDate = '';
totalUsersCount = filteredUsers;
@ -344,21 +342,21 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
return selectedCreatedBy.contains(user.invitedBy);
}).toList();
if (event.sortOrder == "Asc") {
currentSortOrder = "Asc";
if (event.sortOrder == 'Asc') {
currentSortOrder = 'Asc';
filteredUsers.sort((a, b) => a.firstName
.toString()
.toLowerCase()
.compareTo(b.firstName.toString().toLowerCase()));
} else if (event.sortOrder == "Desc") {
currentSortOrder = "Desc";
} else if (event.sortOrder == 'Desc') {
currentSortOrder = 'Desc';
filteredUsers.sort((a, b) => b.firstName!.compareTo(a.firstName!));
} else {}
currentSortOrder = '';
currentSortRole = '';
currentSortCreatedDate = '';
currentSortStatus = '';
currentSortOrderDate = "";
currentSortOrderDate = '';
totalUsersCount = filteredUsers;
@ -386,14 +384,14 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
}
});
}).toList();
if (event.sortOrder == "Asc") {
currentSortOrder = "Asc";
if (event.sortOrder == 'Asc') {
currentSortOrder = 'Asc';
filteredUsers.sort((a, b) => a.firstName
.toString()
.toLowerCase()
.compareTo(b.firstName.toString().toLowerCase()));
} else if (event.sortOrder == "Desc") {
currentSortOrder = "Desc";
} else if (event.sortOrder == 'Desc') {
currentSortOrder = 'Desc';
filteredUsers.sort((a, b) => b.firstName!.compareTo(a.firstName!));
totalUsersCount = filteredUsers;
} else {}
@ -401,7 +399,7 @@ class UserTableBloc extends Bloc<UserTableEvent, UserTableState> {
currentSortRole = '';
currentSortCreatedDate = '';
currentSortCreatedBy = '';
currentSortOrderDate = "";
currentSortOrderDate = '';
emit(UsersLoadedState(users: filteredUsers));
}

View File

@ -64,7 +64,7 @@ class DateOldestToNewestEvent extends UserTableEvent {
class SearchUsers extends UserTableEvent {
final String query;
SearchUsers(this.query);
const SearchUsers(this.query);
@override
List<Object?> get props => [];
}
@ -72,7 +72,7 @@ class SearchUsers extends UserTableEvent {
class ChangePage extends UserTableEvent {
final int pageNumber;
ChangePage(this.pageNumber);
const ChangePage(this.pageNumber);
@override
List<Object> get props => [pageNumber];
@ -93,6 +93,7 @@ class FilterUsersByRoleEvent extends UserTableEvent {
final String? sortOrder;
const FilterUsersByRoleEvent({this.selectedRoles, this.sortOrder});
@override
List<Object?> get props => [selectedRoles, sortOrder];
}
@ -101,6 +102,7 @@ class FilterUsersByJobEvent extends UserTableEvent {
final String? sortOrder;
const FilterUsersByJobEvent({this.selectedJob, this.sortOrder});
@override
List<Object?> get props => [selectedJob, sortOrder];
}
@ -110,6 +112,7 @@ class FilterUsersByCreatedEvent extends UserTableEvent {
final String? sortOrder;
const FilterUsersByCreatedEvent({this.selectedCreatedBy, this.sortOrder});
@override
List<Object?> get props => [selectedCreatedBy, sortOrder];
}
@ -118,6 +121,7 @@ class FilterUsersByDeActevateEvent extends UserTableEvent {
final String? sortOrder;
const FilterUsersByDeActevateEvent({this.selectedActivate, this.sortOrder});
@override
List<Object?> get props => [selectedActivate, sortOrder];
}
@ -125,14 +129,14 @@ class FilterOptionsEvent extends UserTableEvent {
final String query;
final List<String> fullOptions;
FilterOptionsEvent({required this.query, required this.fullOptions});
const FilterOptionsEvent({required this.query, required this.fullOptions});
@override
List<Object?> get props => [query, fullOptions];
}
class FilterClearEvent extends UserTableEvent {
FilterClearEvent();
const FilterClearEvent();
@override
List<Object?> get props => [];
}

View File

@ -9,10 +9,12 @@ final class TableInitial extends UserTableState {
@override
List<Object> get props => [];
}
final class TableSearch extends UserTableState {
@override
List<Object> get props => [];
}
final class RolesLoadingState extends UserTableState {
@override
List<Object> get props => [];

View File

@ -8,9 +8,8 @@ Future<void> showDateFilterMenu({
Function()? zToaTap,
String? isSelected,
}) async {
final RenderBox overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
final RelativeRect position = RelativeRect.fromRect(
final overlay = Overlay.of(context).context.findRenderObject()! as RenderBox;
final position = RelativeRect.fromRect(
Rect.fromLTRB(
overlay.size.width / 3,
240,
@ -39,9 +38,9 @@ Future<void> showDateFilterMenu({
width: 25,
),
title: Text(
"Sort from newest to oldest",
'Sort from newest to oldest',
style: TextStyle(
color: isSelected == "NewestToOldest"
color: isSelected == 'NewestToOldest'
? Colors.black
: Colors.blueGrey),
),
@ -55,9 +54,9 @@ Future<void> showDateFilterMenu({
width: 25,
),
title: Text(
"Sort from oldest to newest",
'Sort from oldest to newest',
style: TextStyle(
color: isSelected == "OldestToNewest"
color: isSelected == 'OldestToNewest'
? Colors.black
: Colors.blueGrey),
),

View File

@ -8,9 +8,8 @@ Future<void> showDeActivateFilterMenu({
Function()? zToaTap,
String? isSelected,
}) async {
final RenderBox overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
final RelativeRect position = RelativeRect.fromRect(
final overlay = Overlay.of(context).context.findRenderObject()! as RenderBox;
final position = RelativeRect.fromRect(
Rect.fromLTRB(
overlay.size.width / 2,
240,
@ -39,9 +38,9 @@ Future<void> showDeActivateFilterMenu({
width: 25,
),
title: Text(
"Sort A to Z",
'Sort A to Z',
style: TextStyle(
color: isSelected == "NewestToOldest"
color: isSelected == 'NewestToOldest'
? Colors.black
: Colors.blueGrey),
),
@ -55,9 +54,9 @@ Future<void> showDeActivateFilterMenu({
width: 25,
),
title: Text(
"Sort Z to A",
'Sort Z to A',
style: TextStyle(
color: isSelected == "OldestToNewest"
color: isSelected == 'OldestToNewest'
? Colors.black
: Colors.blueGrey),
),

View File

@ -8,9 +8,8 @@ Future<void> showNameMenu({
Function()? zToATap,
String? isSelected,
}) async {
final RenderBox overlay =
Overlay.of(context).context.findRenderObject() as RenderBox;
final RelativeRect position = RelativeRect.fromRect(
final overlay = Overlay.of(context).context.findRenderObject()! as RenderBox;
final position = RelativeRect.fromRect(
Rect.fromLTRB(
overlay.size.width / 35,
240,
@ -39,9 +38,9 @@ Future<void> showNameMenu({
width: 25,
),
title: Text(
"Sort A to Z",
'Sort A to Z',
style: TextStyle(
color: isSelected == "Asc" ? Colors.black : Colors.blueGrey),
color: isSelected == 'Asc' ? Colors.black : Colors.blueGrey),
),
),
),
@ -53,9 +52,9 @@ Future<void> showNameMenu({
width: 25,
),
title: Text(
"Sort Z to A",
'Sort Z to A',
style: TextStyle(
color: isSelected == "Desc" ? Colors.black : Colors.blueGrey),
color: isSelected == 'Desc' ? Colors.black : Colors.blueGrey),
),
),
),

View File

@ -17,8 +17,7 @@ class _HeaderColumn extends StatelessWidget {
required this.showFilter,
required this.onResize,
this.onFilter,
Key? key,
}) : super(key: key);
});
@override
Widget build(BuildContext context) {
@ -71,8 +70,7 @@ class _TableRow extends StatelessWidget {
required this.cells,
required this.columnWidths,
required this.isLast,
Key? key,
}) : super(key: key);
});
@override
Widget build(BuildContext context) {
@ -116,9 +114,9 @@ class DynamicTableScreen extends StatefulWidget {
required this.titles,
required this.rows,
required this.onFilter,
Key? key,
super.key,
required this.tableSize,
}) : super(key: key);
});
@override
_DynamicTableScreenState createState() => _DynamicTableScreenState();
@ -139,12 +137,12 @@ class _DynamicTableScreenState extends State<DynamicTableScreen> {
void _handleColumnResize(int index, double delta) {
setState(() {
double newWidth = columnWidths[index] + delta;
var newWidth = columnWidths[index] + delta;
newWidth = newWidth.clamp(_minColumnWidth, _maxColumnWidth);
double actualDelta = newWidth - columnWidths[index];
final actualDelta = newWidth - columnWidths[index];
if (actualDelta == 0) return;
int nextIndex = (index + 1) % columnWidths.length;
final nextIndex = (index + 1) % columnWidths.length;
columnWidths[index] = newWidth;
columnWidths[nextIndex] = (columnWidths[nextIndex] - actualDelta)
.clamp(_minColumnWidth, _maxColumnWidth);
@ -256,7 +254,7 @@ class _DynamicTableScreenState extends State<DynamicTableScreen> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildHeader(),
Container(height: widget.tableSize - 37, child: _buildBody()),
SizedBox(height: widget.tableSize - 37, child: _buildBody()),
],
),
),

View File

@ -21,11 +21,11 @@ import 'package:syncrow_web/utils/extension/build_context_x.dart';
import 'package:syncrow_web/utils/style.dart';
class UsersPage extends StatelessWidget {
UsersPage({super.key});
const UsersPage({super.key});
@override
Widget build(BuildContext context) {
final TextEditingController searchController = TextEditingController();
final searchController = TextEditingController();
Widget actionButton(
{bool isActive = false, required String title, Function()? onTap}) {
@ -36,9 +36,9 @@ class UsersPage extends StatelessWidget {
child: Text(
title,
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: isActive == false && title != "Delete"
color: isActive == false && title != 'Delete'
? Colors.grey
: title == "Delete"
: title == 'Delete'
? ColorsManager.red
: ColorsManager.spaceColor,
fontWeight: FontWeight.w400,
@ -54,11 +54,11 @@ class UsersPage extends StatelessWidget {
padding: const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(20)),
color: status == "invited"
? ColorsManager.invitedOrange.withOpacity(0.5)
: status == "active"
? ColorsManager.activeGreen.withOpacity(0.5)
: ColorsManager.disabledPink.withOpacity(0.5),
color: status == 'invited'
? ColorsManager.invitedOrange.withValues(alpha: 0.5)
: status == 'active'
? ColorsManager.activeGreen.withValues(alpha: 0.5)
: ColorsManager.disabledPink.withValues(alpha: 0.5),
),
child: Padding(
padding:
@ -70,9 +70,9 @@ class UsersPage extends StatelessWidget {
Text(
status,
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: status == "invited"
color: status == 'invited'
? ColorsManager.invitedOrangeText
: status == "active"
: status == 'active'
? ColorsManager.activeGreenText
: ColorsManager.disabledRedText,
fontWeight: FontWeight.w400,
@ -96,9 +96,9 @@ class UsersPage extends StatelessWidget {
padding:
const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
child: SvgPicture.asset(
status == "invited"
status == 'invited'
? Assets.invitedIcon
: status == "active"
: status == 'active'
? Assets.activeUser
: Assets.deActiveUser,
height: 35,
@ -111,7 +111,7 @@ class UsersPage extends StatelessWidget {
return BlocBuilder<UserTableBloc, UserTableState>(
builder: (context, state) {
final screenSize = MediaQuery.of(context).size;
final _blocRole = BlocProvider.of<UserTableBloc>(context);
final blocRole = BlocProvider.of<UserTableBloc>(context);
if (state is UsersLoadingState) {
return const Center(child: CircularProgressIndicator());
} else if (state is UsersLoadedState) {
@ -134,10 +134,10 @@ class UsersPage extends StatelessWidget {
controller: searchController,
onChanged: (value) {
final bloc = context.read<UserTableBloc>();
bloc.add(FilterClearEvent());
bloc.add(const FilterClearEvent());
bloc.add(SearchUsers(value));
if (value == '') {
bloc.add(ChangePage(1));
bloc.add(const ChangePage(1));
}
},
style: const TextStyle(color: Colors.black),
@ -170,7 +170,7 @@ class UsersPage extends StatelessWidget {
},
).then((v) {
if (v != null) {
_blocRole.add(const GetUsers());
blocRole.add(const GetUsers());
}
});
},
@ -193,7 +193,7 @@ class UsersPage extends StatelessWidget {
],
),
const SizedBox(height: 20),
Container(
SizedBox(
height: screenSize.height * 0.65,
child: DynamicTableScreen(
tableSize: screenSize.height * 0.65,
@ -201,7 +201,7 @@ class UsersPage extends StatelessWidget {
if (columnIndex == 0) {
showNameMenu(
context: context,
isSelected: _blocRole.currentSortOrder,
isSelected: blocRole.currentSortOrder,
aToZTap: () {
context
.read<UserTableBloc>()
@ -215,13 +215,13 @@ class UsersPage extends StatelessWidget {
);
}
if (columnIndex == 2) {
final Map<String, bool> checkboxStates = {
for (var item in _blocRole.jobTitle)
item: _blocRole.selectedJobTitles.contains(item),
final checkboxStates = <String, bool>{
for (final item in blocRole.jobTitle)
item: blocRole.selectedJobTitles.contains(item),
};
final RenderBox overlay = Overlay.of(context)
final overlay = Overlay.of(context)
.context
.findRenderObject() as RenderBox;
.findRenderObject()! as RenderBox;
showPopUpFilterMenu(
position: RelativeRect.fromLTRB(
@ -230,40 +230,40 @@ class UsersPage extends StatelessWidget {
overlay.size.width / 4,
0,
),
list: _blocRole.jobTitle,
list: blocRole.jobTitle,
context: context,
checkboxStates: checkboxStates,
isSelected: _blocRole.currentSortJopTitle,
isSelected: blocRole.currentSortJopTitle,
onOkPressed: () {
searchController.clear();
_blocRole.add(FilterClearEvent());
blocRole.add(const FilterClearEvent());
final selectedItems = checkboxStates.entries
.where((entry) => entry.value)
.map((entry) => entry.key)
.toList();
Navigator.of(context).pop();
_blocRole.add(FilterUsersByJobEvent(
blocRole.add(FilterUsersByJobEvent(
selectedJob: selectedItems,
sortOrder: _blocRole.currentSortJopTitle,
sortOrder: blocRole.currentSortJopTitle,
));
},
onSortAtoZ: (v) {
_blocRole.currentSortJopTitle = v;
blocRole.currentSortJopTitle = v;
},
onSortZtoA: (v) {
_blocRole.currentSortJopTitle = v;
blocRole.currentSortJopTitle = v;
},
);
}
if (columnIndex == 3) {
final Map<String, bool> checkboxStates = {
for (var item in _blocRole.roleTypes)
item: _blocRole.selectedRoles.contains(item),
final checkboxStates = <String, bool>{
for (final item in blocRole.roleTypes)
item: blocRole.selectedRoles.contains(item),
};
final RenderBox overlay = Overlay.of(context)
final overlay = Overlay.of(context)
.context
.findRenderObject() as RenderBox;
.findRenderObject()! as RenderBox;
showPopUpFilterMenu(
position: RelativeRect.fromLTRB(
overlay.size.width / 4,
@ -271,13 +271,13 @@ class UsersPage extends StatelessWidget {
overlay.size.width / 4,
0,
),
list: _blocRole.roleTypes,
list: blocRole.roleTypes,
context: context,
checkboxStates: checkboxStates,
isSelected: _blocRole.currentSortRole,
isSelected: blocRole.currentSortRole,
onOkPressed: () {
searchController.clear();
_blocRole.add(FilterClearEvent());
blocRole.add(const FilterClearEvent());
final selectedItems = checkboxStates.entries
.where((entry) => entry.value)
.map((entry) => entry.key)
@ -286,20 +286,20 @@ class UsersPage extends StatelessWidget {
context.read<UserTableBloc>().add(
FilterUsersByRoleEvent(
selectedRoles: selectedItems,
sortOrder: _blocRole.currentSortRole));
sortOrder: blocRole.currentSortRole));
},
onSortAtoZ: (v) {
_blocRole.currentSortRole = v;
blocRole.currentSortRole = v;
},
onSortZtoA: (v) {
_blocRole.currentSortRole = v;
blocRole.currentSortRole = v;
},
);
}
if (columnIndex == 4) {
showDateFilterMenu(
context: context,
isSelected: _blocRole.currentSortOrder,
isSelected: blocRole.currentSortOrder,
aToZTap: () {
context
.read<UserTableBloc>()
@ -313,13 +313,13 @@ class UsersPage extends StatelessWidget {
);
}
if (columnIndex == 6) {
final Map<String, bool> checkboxStates = {
for (var item in _blocRole.createdBy)
item: _blocRole.selectedCreatedBy.contains(item),
final checkboxStates = <String, bool>{
for (final item in blocRole.createdBy)
item: blocRole.selectedCreatedBy.contains(item),
};
final RenderBox overlay = Overlay.of(context)
final overlay = Overlay.of(context)
.context
.findRenderObject() as RenderBox;
.findRenderObject()! as RenderBox;
showPopUpFilterMenu(
position: RelativeRect.fromLTRB(
overlay.size.width / 1,
@ -327,39 +327,39 @@ class UsersPage extends StatelessWidget {
overlay.size.width / 4,
0,
),
list: _blocRole.createdBy,
list: blocRole.createdBy,
context: context,
checkboxStates: checkboxStates,
isSelected: _blocRole.currentSortCreatedBy,
isSelected: blocRole.currentSortCreatedBy,
onOkPressed: () {
searchController.clear();
_blocRole.add(FilterClearEvent());
blocRole.add(const FilterClearEvent());
final selectedItems = checkboxStates.entries
.where((entry) => entry.value)
.map((entry) => entry.key)
.toList();
Navigator.of(context).pop();
_blocRole.add(FilterUsersByCreatedEvent(
blocRole.add(FilterUsersByCreatedEvent(
selectedCreatedBy: selectedItems,
sortOrder: _blocRole.currentSortCreatedBy));
sortOrder: blocRole.currentSortCreatedBy));
},
onSortAtoZ: (v) {
_blocRole.currentSortCreatedBy = v;
blocRole.currentSortCreatedBy = v;
},
onSortZtoA: (v) {
_blocRole.currentSortCreatedBy = v;
blocRole.currentSortCreatedBy = v;
},
);
}
if (columnIndex == 7) {
final Map<String, bool> checkboxStates = {
for (var item in _blocRole.status)
item: _blocRole.selectedStatuses.contains(item),
final checkboxStates = <String, bool>{
for (final item in blocRole.status)
item: blocRole.selectedStatuses.contains(item),
};
final RenderBox overlay = Overlay.of(context)
final overlay = Overlay.of(context)
.context
.findRenderObject() as RenderBox;
.findRenderObject()! as RenderBox;
showPopUpFilterMenu(
position: RelativeRect.fromLTRB(
overlay.size.width / 0,
@ -367,34 +367,34 @@ class UsersPage extends StatelessWidget {
overlay.size.width / 5,
0,
),
list: _blocRole.status,
list: blocRole.status,
context: context,
checkboxStates: checkboxStates,
isSelected: _blocRole.currentSortStatus,
isSelected: blocRole.currentSortStatus,
onOkPressed: () {
searchController.clear();
_blocRole.add(FilterClearEvent());
blocRole.add(const FilterClearEvent());
final selectedItems = checkboxStates.entries
.where((entry) => entry.value)
.map((entry) => entry.key)
.toList();
Navigator.of(context).pop();
_blocRole.add(FilterUsersByDeActevateEvent(
blocRole.add(FilterUsersByDeActevateEvent(
selectedActivate: selectedItems,
sortOrder: _blocRole.currentSortStatus));
sortOrder: blocRole.currentSortStatus));
},
onSortAtoZ: (v) {
_blocRole.currentSortStatus = v;
blocRole.currentSortStatus = v;
},
onSortZtoA: (v) {
_blocRole.currentSortStatus = v;
blocRole.currentSortStatus = v;
},
);
}
if (columnIndex == 8) {
showDeActivateFilterMenu(
context: context,
isSelected: _blocRole.currentSortOrderDate,
isSelected: blocRole.currentSortOrderDate,
aToZTap: () {
context
.read<UserTableBloc>()
@ -409,16 +409,16 @@ class UsersPage extends StatelessWidget {
}
},
titles: const [
"Full Name",
"Email Address",
"Job Title",
"Role",
"Creation Date",
"Creation Time",
"Created By",
"Status",
"De/Activate",
"Action"
'Full Name',
'Email Address',
'Job Title',
'Role',
'Creation Date',
'Creation Time',
'Created By',
'Status',
'De/Activate',
'Action'
],
rows: state.users.map((user) {
return [
@ -439,7 +439,7 @@ class UsersPage extends StatelessWidget {
? 'disabled'
: user.status,
userId: user.uuid,
onTap: user.status != "invited"
onTap: user.status != 'invited'
? () {
context.read<UserTableBloc>().add(
ChangeUserStatus(
@ -452,35 +452,36 @@ class UsersPage extends StatelessWidget {
),
Row(
children: [
user.isEnabled != false
? actionButton(
isActive: true,
title: "Edit",
onTap: () {
context
.read<SpaceTreeBloc>()
.add(ClearCachedData());
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return EditUserDialog(
userId: user.uuid);
},
).then((v) {
if (v != null) {
if (v != null) {
_blocRole.add(const GetUsers());
}
}
});
if (user.isEnabled != false)
actionButton(
isActive: true,
title: 'Edit',
onTap: () {
context
.read<SpaceTreeBloc>()
.add(ClearCachedData());
showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return EditUserDialog(
userId: user.uuid);
},
)
: actionButton(
title: "Edit",
),
).then((v) {
if (v != null) {
if (v != null) {
blocRole.add(const GetUsers());
}
}
});
},
)
else
actionButton(
title: 'Edit',
),
actionButton(
title: "Delete",
title: 'Delete',
onTap: () {
showDialog(
context: context,
@ -489,7 +490,7 @@ class UsersPage extends StatelessWidget {
return DeleteUserDialog(
onTapDelete: () async {
try {
_blocRole.add(DeleteUserEvent(
blocRole.add(DeleteUserEvent(
user.uuid, context));
await Future.delayed(
const Duration(seconds: 2));
@ -501,7 +502,7 @@ class UsersPage extends StatelessWidget {
},
).then((v) {
if (v != null) {
_blocRole.add(const GetUsers());
blocRole.add(const GetUsers());
}
});
},
@ -529,10 +530,10 @@ class UsersPage extends StatelessWidget {
const Icon(Icons.keyboard_double_arrow_right),
firstPageIcon:
const Icon(Icons.keyboard_double_arrow_left),
totalPages: (_blocRole.totalUsersCount.length /
_blocRole.itemsPerPage)
totalPages: (blocRole.totalUsersCount.length /
blocRole.itemsPerPage)
.ceil(),
currentPage: _blocRole.currentPage,
currentPage: blocRole.currentPage,
onPageChanged: (int pageNumber) {
context
.read<UserTableBloc>()