diff --git a/assets/icons/atoz_icon.png b/assets/icons/atoz_icon.png
new file mode 100644
index 00000000..33a9c351
Binary files /dev/null and b/assets/icons/atoz_icon.png differ
diff --git a/assets/icons/filter_table_icon.svg b/assets/icons/filter_table_icon.svg
new file mode 100644
index 00000000..d90e983e
--- /dev/null
+++ b/assets/icons/filter_table_icon.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/ztoa_icon.png b/assets/icons/ztoa_icon.png
new file mode 100644
index 00000000..003e5725
Binary files /dev/null and b/assets/icons/ztoa_icon.png differ
diff --git a/lib/pages/common/custom_dialog.dart b/lib/pages/common/custom_dialog.dart
index a40ef10f..9899bda4 100644
--- a/lib/pages/common/custom_dialog.dart
+++ b/lib/pages/common/custom_dialog.dart
@@ -12,7 +12,7 @@ Future showCustomDialog({
double? iconWidth,
VoidCallback? onOkPressed,
bool barrierDismissible = false,
- required List actions,
+ List? actions,
}) {
return showDialog(
context: context,
diff --git a/lib/pages/roles_and_permission/model/role_type_model.dart b/lib/pages/roles_and_permission/model/role_type_model.dart
index 1705e25c..16b24ec5 100644
--- a/lib/pages/roles_and_permission/model/role_type_model.dart
+++ b/lib/pages/roles_and_permission/model/role_type_model.dart
@@ -16,7 +16,7 @@ class RoleTypeModel {
uuid: json['uuid'],
createdAt: json['createdAt'],
updatedAt: json['updatedAt'],
- type: json['type'],
+ type: json['type'].toString().toLowerCase().replaceAll("_", " "),
);
}
}
diff --git a/lib/pages/roles_and_permission/users_page/bloc/users_bloc.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart
similarity index 73%
rename from lib/pages/roles_and_permission/users_page/bloc/users_bloc.dart
rename to lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart
index f0e3c9ad..f0ddf01e 100644
--- a/lib/pages/roles_and_permission/users_page/bloc/users_bloc.dart
+++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_bloc.dart
@@ -1,20 +1,19 @@
import 'package:bloc/bloc.dart';
import 'package:flutter/material.dart';
+import 'package:syncrow_web/pages/common/custom_dialog.dart';
import 'package:syncrow_web/pages/roles_and_permission/model/role_type_model.dart';
-import 'package:syncrow_web/pages/roles_and_permission/model/roles_user_model.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/bloc/users_event.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/bloc/users_status.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/model/tree_node_model.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/view/roles_and_permission.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';
+import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/model/permission_option_model.dart';
+import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/model/tree_node_model.dart';
import 'package:syncrow_web/pages/spaces_management/model/community_model.dart';
import 'package:syncrow_web/pages/spaces_management/model/space_model.dart';
import 'package:syncrow_web/services/space_mana_api.dart';
import 'package:syncrow_web/services/user_permission.dart';
+import 'package:syncrow_web/utils/constants/assets.dart';
class UsersBloc extends Bloc {
UsersBloc() : super(UsersInitial()) {
- on(_getUsers);
- on(_changeUserStatus);
on(isCompleteBasicsFun);
on(_onLoadCommunityAndSpaces);
on(searchTreeNode);
@@ -25,6 +24,7 @@ class UsersBloc extends Bloc {
on(_sendInvitUser);
on(_validateBasicsStep);
on(isCompleteRoleFun);
+ on(checkEmail);
}
void _validateBasicsStep(ValidateBasicsStep event, Emitter emit) {
if (formKey.currentState?.validate() ?? false) {
@@ -34,74 +34,8 @@ class UsersBloc extends Bloc {
}
}
- List users = [];
String roleSelected = '';
- Future _getUsers(GetUsers event, Emitter emit) async {
- emit(UsersLoadingState());
- try {
- users = [
- RolesUserModel(
- id: '1',
- userName: 'user 1',
- userEmail: 'test1@test.com',
- action: '',
- createdBy: 'Admin',
- creationDate: '25/10/2024',
- creationTime: '10:30 AM',
- status: 'Invited',
- ),
- RolesUserModel(
- id: '2',
- userName: 'user 2',
- userEmail: 'test2@test.com',
- action: '',
- createdBy: 'Admin',
- creationDate: '25/10/2024',
- creationTime: '10:30 AM',
- status: 'Active',
- ),
- RolesUserModel(
- id: '3',
- userName: 'user 3',
- userEmail: 'test3@test.com',
- action: '',
- createdBy: 'Admin',
- creationDate: '25/10/2024',
- creationTime: '10:30 AM',
- status: 'Disabled',
- ),
- ];
- emit(UsersLoadedState(users: users));
- } catch (e) {
- emit(ErrorState(e.toString()));
- }
- }
-
- void _changeUserStatus(ChangeUserStatus event, Emitter emit) {
- try {
- users = users.map((user) {
- if (user.id == event.userId) {
- return RolesUserModel(
- id: user.id,
- userName: user.userName,
- userEmail: user.userEmail,
- createdBy: user.createdBy,
- creationDate: user.creationDate,
- creationTime: user.creationTime,
- status: event.newStatus,
- action: user.action,
- );
- }
- return user;
- }).toList();
-
- emit(UsersLoadedState(users: users));
- } catch (e) {
- emit(ErrorState(e.toString()));
- }
- }
-
final formKey = GlobalKey();
final TextEditingController firstNameController = TextEditingController();
final TextEditingController lastNameController = TextEditingController();
@@ -109,6 +43,9 @@ class UsersBloc extends Bloc {
final TextEditingController phoneController = TextEditingController();
final TextEditingController jobTitleController = TextEditingController();
+ final TextEditingController roleSearchController = TextEditingController();
+ // final TextEditingController jobTitleController = TextEditingController();
+
bool? isCompleteBasics;
bool? isCompleteRolePermissions;
bool? isCompleteSpaces;
@@ -117,30 +54,6 @@ class UsersBloc extends Bloc {
int numberSpaces = 0;
int numberRole = 0;
- // isCompleteBasicsFun(CheckStepStatus event, Emitter emit) {
- // emit(UsersLoadingState());
- // isCompleteBasics = firstNameController.text.isNotEmpty &&
- // lastNameController.text.isNotEmpty &&
- // emailController.text.isNotEmpty;
- // emit(ChangeStatusSteps());
- // return isCompleteBasics;
- // }
-
- bool isCompleteBasicsFun(CheckStepStatus event, Emitter emit) {
- emit(UsersLoadingState());
-
- final emailRegex = RegExp(
- r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$',
- );
- isCompleteBasics = firstNameController.text.isNotEmpty &&
- lastNameController.text.isNotEmpty &&
- emailController.text.isNotEmpty &&
- emailRegex.hasMatch(emailController.text);
-
- emit(ChangeStatusSteps());
- return isCompleteBasics!;
- }
-
void isCompleteSpacesFun(
CheckSpacesStepStatus event, Emitter emit) {
emit(UsersLoadingState());
@@ -184,7 +97,7 @@ class UsersBloc extends Bloc {
);
}).toList(),
);
- emit(ChangeStatusSteps());
+ emit(SpacesLoadedState());
return updatedCommunities;
} catch (e) {
emit(ErrorState('Error loading communities and spaces: $e'));
@@ -239,6 +152,7 @@ class UsersBloc extends Bloc {
}
List selectedIds = [];
+
List getSelectedIds(List nodes) {
List selectedIds = [];
for (var node in nodes) {
@@ -259,7 +173,7 @@ class UsersBloc extends Bloc {
try {
emit(UsersLoadingState());
roles = await UserPermissionApi().fetchRoles();
- add(PermissionEvent(roleUuid: roles.first.uuid));
+ // add(PermissionEvent(roleUuid: roles.first.uuid));
emit(RolePermissionInitial());
} catch (e) {
emit(ErrorState('Error loading communities and spaces: $e'));
@@ -294,18 +208,40 @@ class UsersBloc extends Bloc {
_sendInvitUser(SendInviteUsers event, Emitter emit) async {
try {
emit(UsersLoadingState());
- List selectedIds = getSelectedIds(updatedCommunities);
- await UserPermissionApi().sendInviteUser(
- email: emailController.text,
- firstName: firstNameController.text,
- jobTitle: jobTitleController.text,
- lastName: lastNameController.text,
- phoneNumber: phoneController.text,
- roleUuid: roleSelected,
- spaceUuids: selectedIds);
+ List selectedIds = getSelectedIds(updatedCommunities) ?? [];
+ bool res = await UserPermissionApi().sendInviteUser(
+ email: emailController.text,
+ firstName: firstNameController.text,
+ jobTitle: jobTitleController.text,
+ lastName: lastNameController.text,
+ phoneNumber: phoneController.text,
+ roleUuid: roleSelected,
+ spaceUuids: selectedIds,
+ );
+ if (res == true) {
+ showCustomDialog(
+ barrierDismissible: false,
+ context: event.context,
+ message: "The invite was sent successfully.",
+ iconPath: Assets.deviceNoteIcon,
+ title: "Invite Success",
+ dialogHeight: MediaQuery.of(event.context).size.height * 0.3,
+ actions: [
+ TextButton(
+ onPressed: () {
+ Navigator.of(event.context).pop();
+ Navigator.of(event.context).pop();
+ },
+ child: const Text('OK'),
+ ),
+ ],
+ );
+ } else {
+ emit(const ErrorState('Failed to send invite.'));
+ }
emit(SaveState());
} catch (e) {
- emit(ErrorState('Error: $e'));
+ emit(ErrorState('Failed to send invite: ${e.toString()}'));
}
}
@@ -319,6 +255,37 @@ class UsersBloc extends Bloc {
emit(ChangeStatusSteps());
}
+ String checkEmailValid = '';
+
+ Future checkEmail(
+ CheckEmailEvent event, Emitter emit) async {
+ emit(UsersLoadingState());
+ String? res = await UserPermissionApi().checkEmail(
+ emailController.text,
+ );
+ checkEmailValid = res!;
+ emit(ChangeStatusSteps());
+ }
+
+ bool isCompleteBasicsFun(CheckStepStatus event, Emitter emit) {
+ emit(UsersLoadingState());
+ add(const CheckEmailEvent());
+ 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';
+ isCompleteBasics = firstNameController.text.isNotEmpty &&
+ lastNameController.text.isNotEmpty &&
+ emailController.text.isNotEmpty &&
+ isEmailValid &&
+ isEmailServerValid;
+
+ emit(ChangeStatusSteps());
+ emit(ValidateBasics());
+ return isCompleteBasics!;
+ }
+
void _clearHighlightsRolePermission(List nodes) {
for (var node in nodes) {
node.isHighlighted = false;
diff --git a/lib/pages/roles_and_permission/users_page/bloc/users_event.dart b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart
similarity index 82%
rename from lib/pages/roles_and_permission/users_page/bloc/users_event.dart
rename to lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart
index 633c1ea5..950726d4 100644
--- a/lib/pages/roles_and_permission/users_page/bloc/users_event.dart
+++ b/lib/pages/roles_and_permission/users_page/add_user_dialog/bloc/users_event.dart
@@ -1,21 +1,17 @@
import 'package:equatable/equatable.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/model/tree_node_model.dart';
-import 'package:syncrow_web/pages/roles_and_permission/users_page/view/roles_and_permission.dart';
+import 'package:flutter/material.dart';
+import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/model/permission_option_model.dart';
+import 'package:syncrow_web/pages/roles_and_permission/users_page/add_user_dialog/model/tree_node_model.dart';
sealed class UsersEvent extends Equatable {
const UsersEvent();
}
-class GetUsers extends UsersEvent {
- const GetUsers();
- @override
- List