mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-15 01:35:25 +00:00
Added space tree to the add user dialog
This commit is contained in:
@ -1,5 +1,6 @@
|
|||||||
import 'package:bloc/bloc.dart';
|
import 'package:bloc/bloc.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
|
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
|
||||||
import 'package:syncrow_web/pages/common/custom_dialog.dart';
|
import 'package:syncrow_web/pages/common/custom_dialog.dart';
|
||||||
import 'package:syncrow_web/pages/roles_and_permission/model/edit_user_model.dart';
|
import 'package:syncrow_web/pages/roles_and_permission/model/edit_user_model.dart';
|
||||||
@ -8,14 +9,13 @@ 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/bloc/users_status.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/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/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/spaces_management/all_spaces/model/community_model.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/pages/spaces_management/all_spaces/model/space_model.dart';
|
||||||
import 'package:syncrow_web/services/space_mana_api.dart';
|
import 'package:syncrow_web/services/space_mana_api.dart';
|
||||||
import 'package:syncrow_web/services/user_permission.dart';
|
import 'package:syncrow_web/services/user_permission.dart';
|
||||||
import 'package:syncrow_web/utils/constants/assets.dart';
|
import 'package:syncrow_web/utils/constants/assets.dart';
|
||||||
import 'package:syncrow_web/utils/constants/strings_manager.dart';
|
import 'package:syncrow_web/utils/navigation_service.dart';
|
||||||
import 'package:syncrow_web/utils/constants/temp_const.dart';
|
|
||||||
import 'package:syncrow_web/utils/helpers/shared_preferences_helper.dart';
|
|
||||||
|
|
||||||
class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
||||||
UsersBloc() : super(UsersInitial()) {
|
UsersBloc() : super(UsersInitial()) {
|
||||||
@ -62,11 +62,11 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
int numberSpaces = 0;
|
int numberSpaces = 0;
|
||||||
int numberRole = 0;
|
int numberRole = 0;
|
||||||
|
|
||||||
void isCompleteSpacesFun(
|
void isCompleteSpacesFun(CheckSpacesStepStatus event, Emitter<UsersState> emit) {
|
||||||
CheckSpacesStepStatus event, Emitter<UsersState> emit) {
|
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
List<String> selectedIds = getSelectedIds(updatedCommunities);
|
var spaceBloc = NavigationService.navigatorKey.currentContext!.read<SpaceTreeBloc>();
|
||||||
isCompleteSpaces = selectedIds.isNotEmpty;
|
|
||||||
|
isCompleteSpaces = spaceBloc.state.selectedCommunities.isNotEmpty;
|
||||||
emit(ChangeStatusSteps());
|
emit(ChangeStatusSteps());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,19 +76,16 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
emit(ChangeStatusSteps());
|
emit(ChangeStatusSteps());
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<List<SpaceModel>> _fetchSpacesForCommunity(
|
Future<List<SpaceModel>> _fetchSpacesForCommunity(String communityUuid) async {
|
||||||
String communityUuid) async {
|
|
||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
|
|
||||||
return await CommunitySpaceManagementApi()
|
return await CommunitySpaceManagementApi().getSpaceHierarchy(communityUuid, projectUuid);
|
||||||
.getSpaceHierarchy(communityUuid, projectUuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TreeNode> updatedCommunities = [];
|
List<TreeNode> updatedCommunities = [];
|
||||||
List<TreeNode> spacesNodes = [];
|
List<TreeNode> spacesNodes = [];
|
||||||
List<String> communityIds = [];
|
List<String> communityIds = [];
|
||||||
_onLoadCommunityAndSpaces(
|
_onLoadCommunityAndSpaces(LoadCommunityAndSpacesEvent event, Emitter<UsersState> emit) async {
|
||||||
LoadCommunityAndSpacesEvent event, Emitter<UsersState> emit) async {
|
|
||||||
try {
|
try {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
@ -98,8 +95,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
communityIds = communities.map((community) => community.uuid).toList();
|
communityIds = communities.map((community) => community.uuid).toList();
|
||||||
updatedCommunities = await Future.wait(
|
updatedCommunities = await Future.wait(
|
||||||
communities.map((community) async {
|
communities.map((community) async {
|
||||||
List<SpaceModel> spaces =
|
List<SpaceModel> spaces = await _fetchSpacesForCommunity(community.uuid);
|
||||||
await _fetchSpacesForCommunity(community.uuid);
|
|
||||||
spacesNodes = _buildTreeNodes(spaces);
|
spacesNodes = _buildTreeNodes(spaces);
|
||||||
return TreeNode(
|
return TreeNode(
|
||||||
uuid: community.uuid,
|
uuid: community.uuid,
|
||||||
@ -126,8 +122,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
// Build tree nodes from your data model.
|
// Build tree nodes from your data model.
|
||||||
List<TreeNode> _buildTreeNodes(List<SpaceModel> spaces) {
|
List<TreeNode> _buildTreeNodes(List<SpaceModel> spaces) {
|
||||||
return spaces.map((space) {
|
return spaces.map((space) {
|
||||||
List<TreeNode> childNodes =
|
List<TreeNode> childNodes = space.children.isNotEmpty ? _buildTreeNodes(space.children) : [];
|
||||||
space.children.isNotEmpty ? _buildTreeNodes(space.children) : [];
|
|
||||||
return TreeNode(
|
return TreeNode(
|
||||||
uuid: space.uuid!,
|
uuid: space.uuid!,
|
||||||
title: space.name,
|
title: space.name,
|
||||||
@ -188,8 +183,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
bool _searchAndHighlightNodes(List<TreeNode> nodes, String searchTerm) {
|
bool _searchAndHighlightNodes(List<TreeNode> nodes, String searchTerm) {
|
||||||
bool anyMatch = false;
|
bool anyMatch = false;
|
||||||
for (var node in nodes) {
|
for (var node in nodes) {
|
||||||
bool isMatch =
|
bool isMatch = node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
||||||
node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
|
||||||
bool childMatch = _searchAndHighlightNodes(node.children, searchTerm);
|
bool childMatch = _searchAndHighlightNodes(node.children, searchTerm);
|
||||||
node.isHighlighted = isMatch || childMatch;
|
node.isHighlighted = isMatch || childMatch;
|
||||||
|
|
||||||
@ -201,8 +195,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
List<TreeNode> _filterNodes(List<TreeNode> nodes, String searchTerm) {
|
List<TreeNode> _filterNodes(List<TreeNode> nodes, String searchTerm) {
|
||||||
List<TreeNode> filteredNodes = [];
|
List<TreeNode> filteredNodes = [];
|
||||||
for (var node in nodes) {
|
for (var node in nodes) {
|
||||||
bool isMatch =
|
bool isMatch = node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
||||||
node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
|
||||||
List<TreeNode> filteredChildren = _filterNodes(node.children, searchTerm);
|
List<TreeNode> filteredChildren = _filterNodes(node.children, searchTerm);
|
||||||
if (isMatch || filteredChildren.isNotEmpty) {
|
if (isMatch || filteredChildren.isNotEmpty) {
|
||||||
node.isHighlighted = isMatch;
|
node.isHighlighted = isMatch;
|
||||||
@ -314,8 +307,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
_getPermissions(PermissionEvent event, Emitter<UsersState> emit) async {
|
_getPermissions(PermissionEvent event, Emitter<UsersState> emit) async {
|
||||||
try {
|
try {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
permissions = await UserPermissionApi().fetchPermission(
|
permissions = await UserPermissionApi()
|
||||||
event.roleUuid == "" ? roles.first.uuid : event.roleUuid);
|
.fetchPermission(event.roleUuid == "" ? roles.first.uuid : event.roleUuid);
|
||||||
roleSelected = event.roleUuid!;
|
roleSelected = event.roleUuid!;
|
||||||
emit(RolePermissionInitial());
|
emit(RolePermissionInitial());
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -326,8 +319,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
bool _searchRolePermission(List<PermissionOption> nodes, String searchTerm) {
|
bool _searchRolePermission(List<PermissionOption> nodes, String searchTerm) {
|
||||||
bool anyMatch = false;
|
bool anyMatch = false;
|
||||||
for (var node in nodes) {
|
for (var node in nodes) {
|
||||||
bool isMatch =
|
bool isMatch = node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
||||||
node.title.toLowerCase().contains(searchTerm.toLowerCase());
|
|
||||||
bool childMatch = _searchRolePermission(node.subOptions, searchTerm);
|
bool childMatch = _searchRolePermission(node.subOptions, searchTerm);
|
||||||
node.isHighlighted = isMatch || childMatch;
|
node.isHighlighted = isMatch || childMatch;
|
||||||
anyMatch = anyMatch || node.isHighlighted;
|
anyMatch = anyMatch || node.isHighlighted;
|
||||||
@ -340,9 +332,15 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
|
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
List<String> selectedIds = getSelectedIds(updatedCommunities)
|
// List<String> selectedIds =
|
||||||
.where((id) => !communityIds.contains(id))
|
// getSelectedIds(updatedCommunities).where((id) => !communityIds.contains(id)).toList();
|
||||||
.toList();
|
|
||||||
|
List<String> selectedSpacesId = [];
|
||||||
|
var spaceBloc = NavigationService.navigatorKey.currentContext!.read<SpaceTreeBloc>();
|
||||||
|
for (var community in spaceBloc.state.selectedCommunities) {
|
||||||
|
selectedSpacesId.addAll(spaceBloc.state.selectedCommunityAndSpaces[community] ?? []);
|
||||||
|
}
|
||||||
|
// List<String> selectedIds = getSelectedIds(updatedCommunities);
|
||||||
|
|
||||||
bool res = await UserPermissionApi().sendInviteUser(
|
bool res = await UserPermissionApi().sendInviteUser(
|
||||||
email: emailController.text,
|
email: emailController.text,
|
||||||
@ -351,7 +349,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
lastName: lastNameController.text,
|
lastName: lastNameController.text,
|
||||||
phoneNumber: phoneController.text,
|
phoneNumber: phoneController.text,
|
||||||
roleUuid: roleSelected,
|
roleUuid: roleSelected,
|
||||||
spaceUuids: selectedIds,
|
spaceUuids: selectedSpacesId,
|
||||||
projectUuid: projectUuid);
|
projectUuid: projectUuid);
|
||||||
|
|
||||||
if (res) {
|
if (res) {
|
||||||
@ -384,9 +382,8 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
_editInviteUser(EditInviteUsers event, Emitter<UsersState> emit) async {
|
_editInviteUser(EditInviteUsers event, Emitter<UsersState> emit) async {
|
||||||
try {
|
try {
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
List<String> selectedIds = getSelectedIds(updatedCommunities)
|
List<String> selectedIds =
|
||||||
.where((id) => !communityIds.contains(id))
|
getSelectedIds(updatedCommunities).where((id) => !communityIds.contains(id)).toList();
|
||||||
.toList();
|
|
||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
|
|
||||||
bool res = await UserPermissionApi().editInviteUser(
|
bool res = await UserPermissionApi().editInviteUser(
|
||||||
@ -439,8 +436,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
|
|
||||||
String checkEmailValid = '';
|
String checkEmailValid = '';
|
||||||
|
|
||||||
Future<void> checkEmail(
|
Future<void> checkEmail(CheckEmailEvent event, Emitter<UsersState> emit) async {
|
||||||
CheckEmailEvent event, Emitter<UsersState> emit) async {
|
|
||||||
emit(UsersLoadingState());
|
emit(UsersLoadingState());
|
||||||
String? res = await UserPermissionApi().checkEmail(
|
String? res = await UserPermissionApi().checkEmail(
|
||||||
emailController.text,
|
emailController.text,
|
||||||
@ -464,8 +460,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
isEmailValid &&
|
isEmailValid &&
|
||||||
isEmailServerValid;
|
isEmailServerValid;
|
||||||
} else {
|
} else {
|
||||||
isCompleteBasics = firstNameController.text.isNotEmpty &&
|
isCompleteBasics = firstNameController.text.isNotEmpty && lastNameController.text.isNotEmpty;
|
||||||
lastNameController.text.isNotEmpty;
|
|
||||||
}
|
}
|
||||||
emit(ChangeStatusSteps());
|
emit(ChangeStatusSteps());
|
||||||
emit(ValidateBasics());
|
emit(ValidateBasics());
|
||||||
@ -505,8 +500,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
final projectUuid = await ProjectManager.getProjectUUID() ?? '';
|
||||||
|
|
||||||
if (event.uuid?.isNotEmpty ?? false) {
|
if (event.uuid?.isNotEmpty ?? false) {
|
||||||
final res =
|
final res = await UserPermissionApi().fetchUserById(event.uuid, projectUuid);
|
||||||
await UserPermissionApi().fetchUserById(event.uuid, projectUuid);
|
|
||||||
|
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
// Populate the text controllers
|
// Populate the text controllers
|
||||||
@ -525,8 +519,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
}
|
}
|
||||||
final roleId = roles
|
final roleId = roles
|
||||||
.firstWhere((element) =>
|
.firstWhere((element) =>
|
||||||
element.type ==
|
element.type == res.roleType.toString().toLowerCase().replaceAll("_", " "))
|
||||||
res.roleType.toString().toLowerCase().replaceAll("_", " "))
|
|
||||||
.uuid;
|
.uuid;
|
||||||
debugPrint('Role ID: $roleId');
|
debugPrint('Role ID: $roleId');
|
||||||
roleSelected = roleId;
|
roleSelected = roleId;
|
||||||
@ -537,16 +530,14 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
if (uuidsToMark.contains(node.uuid)) {
|
if (uuidsToMark.contains(node.uuid)) {
|
||||||
node.isChecked = true;
|
node.isChecked = true;
|
||||||
debugPrint(
|
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 {
|
||||||
debugPrint(
|
debugPrint('${' ' * level}Node ID: ${node.uuid}, Title: ${node.title}');
|
||||||
'${' ' * 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);
|
||||||
@ -599,8 +590,7 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
bool _areAllChildrenChecked(TreeNode node) {
|
bool _areAllChildrenChecked(TreeNode node) {
|
||||||
return node.children.isNotEmpty &&
|
return node.children.isNotEmpty &&
|
||||||
node.children.every((child) =>
|
node.children.every((child) =>
|
||||||
child.isChecked &&
|
child.isChecked && (child.children.isEmpty || _areAllChildrenChecked(child)));
|
||||||
(child.children.isEmpty || _areAllChildrenChecked(child)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TreeNode? _findParent(List<TreeNode> nodes, TreeNode target) {
|
TreeNode? _findParent(List<TreeNode> nodes, TreeNode target) {
|
||||||
@ -615,4 +605,16 @@ class UsersBloc extends Bloc<UsersEvent, UsersState> {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> close() {
|
||||||
|
emailController.dispose();
|
||||||
|
firstNameController.dispose();
|
||||||
|
lastNameController.dispose();
|
||||||
|
emailController.dispose();
|
||||||
|
phoneController.dispose();
|
||||||
|
jobTitleController.dispose();
|
||||||
|
roleSearchController.dispose();
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.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_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_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/bloc/users_status.dart';
|
||||||
|
@ -1,14 +1,9 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:flutter_svg/svg.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_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';
|
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/view/build_tree_view.dart';
|
import 'package:syncrow_web/pages/space_tree/view/space_tree_view.dart';
|
||||||
import 'package:syncrow_web/utils/color_manager.dart';
|
|
||||||
import 'package:syncrow_web/utils/constants/assets.dart';
|
|
||||||
import 'package:syncrow_web/utils/extension/build_context_x.dart';
|
import 'package:syncrow_web/utils/extension/build_context_x.dart';
|
||||||
import 'package:syncrow_web/utils/style.dart';
|
|
||||||
|
|
||||||
class SpacesAccessView extends StatelessWidget {
|
class SpacesAccessView extends StatelessWidget {
|
||||||
final String? userId;
|
final String? userId;
|
||||||
@ -27,10 +22,8 @@ class SpacesAccessView extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'Spaces access',
|
'Spaces access',
|
||||||
style: context.textTheme.bodyLarge?.copyWith(
|
style: context.textTheme.bodyLarge
|
||||||
fontWeight: FontWeight.w700,
|
?.copyWith(fontWeight: FontWeight.w700, fontSize: 20, color: Colors.black),
|
||||||
fontSize: 20,
|
|
||||||
color: Colors.black),
|
|
||||||
),
|
),
|
||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 35,
|
height: 35,
|
||||||
@ -42,77 +35,78 @@ class SpacesAccessView extends StatelessWidget {
|
|||||||
const SizedBox(
|
const SizedBox(
|
||||||
height: 25,
|
height: 25,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(child: SpaceTreeView(onSelect: () {}))
|
||||||
child: SizedBox(
|
// Expanded(
|
||||||
child: Column(
|
// child: SizedBox(
|
||||||
children: [
|
// child: Column(
|
||||||
Expanded(
|
// children: [
|
||||||
flex: 2,
|
// Expanded(
|
||||||
child: Container(
|
// flex: 2,
|
||||||
decoration: const BoxDecoration(
|
// child: Container(
|
||||||
color: ColorsManager.circleRolesBackground,
|
// decoration: const BoxDecoration(
|
||||||
borderRadius: BorderRadius.only(
|
// color: ColorsManager.circleRolesBackground,
|
||||||
topRight: Radius.circular(20),
|
// borderRadius: BorderRadius.only(
|
||||||
topLeft: Radius.circular(20)),
|
// topRight: Radius.circular(20),
|
||||||
),
|
// topLeft: Radius.circular(20)),
|
||||||
child: Padding(
|
// ),
|
||||||
padding: const EdgeInsets.all(8.0),
|
// child: Padding(
|
||||||
child: Row(
|
// padding: const EdgeInsets.all(8.0),
|
||||||
children: [
|
// child: Row(
|
||||||
Expanded(
|
// children: [
|
||||||
child: Container(
|
// Expanded(
|
||||||
decoration: BoxDecoration(
|
// child: Container(
|
||||||
borderRadius: const BorderRadius.all(
|
// decoration: BoxDecoration(
|
||||||
Radius.circular(20)),
|
// borderRadius: const BorderRadius.all(
|
||||||
border: Border.all(
|
// Radius.circular(20)),
|
||||||
color: ColorsManager.grayBorder)),
|
// border: Border.all(
|
||||||
child: TextFormField(
|
// color: ColorsManager.grayBorder)),
|
||||||
style:
|
// child: TextFormField(
|
||||||
const TextStyle(color: Colors.black),
|
// style:
|
||||||
// controller: _blocRole.firstNameController,
|
// const TextStyle(color: Colors.black),
|
||||||
onChanged: (value) {
|
// // controller: _blocRole.firstNameController,
|
||||||
_blocRole.add(SearchAnode(
|
// onChanged: (value) {
|
||||||
nodes: _blocRole.updatedCommunities,
|
// _blocRole.add(SearchAnode(
|
||||||
searchTerm: value));
|
// nodes: _blocRole.updatedCommunities,
|
||||||
},
|
// searchTerm: value));
|
||||||
decoration: textBoxDecoration(radios: 20)!
|
// },
|
||||||
.copyWith(
|
// decoration: textBoxDecoration(radios: 20)!
|
||||||
fillColor: Colors.white,
|
// .copyWith(
|
||||||
suffixIcon: Padding(
|
// fillColor: Colors.white,
|
||||||
padding:
|
// suffixIcon: Padding(
|
||||||
const EdgeInsets.only(right: 16),
|
// padding:
|
||||||
child: SvgPicture.asset(
|
// const EdgeInsets.only(right: 16),
|
||||||
Assets.textFieldSearch,
|
// child: SvgPicture.asset(
|
||||||
width: 24,
|
// Assets.textFieldSearch,
|
||||||
height: 24,
|
// width: 24,
|
||||||
),
|
// height: 24,
|
||||||
),
|
// ),
|
||||||
hintStyle: context.textTheme.bodyMedium
|
// ),
|
||||||
?.copyWith(
|
// hintStyle: context.textTheme.bodyMedium
|
||||||
fontWeight: FontWeight.w400,
|
// ?.copyWith(
|
||||||
fontSize: 12,
|
// fontWeight: FontWeight.w400,
|
||||||
color: ColorsManager.textGray),
|
// fontSize: 12,
|
||||||
),
|
// color: ColorsManager.textGray),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
],
|
// ),
|
||||||
),
|
// ],
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
Expanded(
|
// ),
|
||||||
flex: 7,
|
// Expanded(
|
||||||
child: Container(
|
// flex: 7,
|
||||||
color: ColorsManager.circleRolesBackground,
|
// child: Container(
|
||||||
padding: const EdgeInsets.all(8.0),
|
// color: ColorsManager.circleRolesBackground,
|
||||||
child: Container(
|
// padding: const EdgeInsets.all(8.0),
|
||||||
color: ColorsManager.whiteColors,
|
// child: Container(
|
||||||
child: TreeView(userId: userId))))
|
// color: ColorsManager.whiteColors,
|
||||||
],
|
// child: TreeView(userId: userId))))
|
||||||
),
|
// ],
|
||||||
),
|
// ),
|
||||||
),
|
// ),
|
||||||
|
// ),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -13,6 +13,8 @@ import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/vi
|
|||||||
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/de_activate_filter.dart';
|
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/de_activate_filter.dart';
|
||||||
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/name_filter.dart';
|
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/name_filter.dart';
|
||||||
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/user_table.dart';
|
import 'package:syncrow_web/pages/roles_and_permission/users_page/users_table/view/user_table.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/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/extension/build_context_x.dart';
|
||||||
@ -25,8 +27,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final TextEditingController searchController = TextEditingController();
|
final TextEditingController searchController = TextEditingController();
|
||||||
|
|
||||||
Widget actionButton(
|
Widget actionButton({bool isActive = false, required String title, Function()? onTap}) {
|
||||||
{bool isActive = false, required String title, Function()? onTap}) {
|
|
||||||
return InkWell(
|
return InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
@ -59,8 +60,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
: ColorsManager.disabledPink.withOpacity(0.5),
|
: ColorsManager.disabledPink.withOpacity(0.5),
|
||||||
),
|
),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding: const EdgeInsets.only(left: 10, right: 10, bottom: 5, top: 5),
|
||||||
const EdgeInsets.only(left: 10, right: 10, bottom: 5, top: 5),
|
|
||||||
child: Row(
|
child: Row(
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
@ -84,15 +84,12 @@ class UsersPage extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget changeIconStatus(
|
Widget changeIconStatus(
|
||||||
{required String userId,
|
{required String userId, required String status, required Function()? onTap}) {
|
||||||
required String status,
|
|
||||||
required Function()? onTap}) {
|
|
||||||
return Center(
|
return Center(
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding: const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
|
||||||
const EdgeInsets.only(left: 5, right: 5, bottom: 5, top: 5),
|
|
||||||
child: SvgPicture.asset(
|
child: SvgPicture.asset(
|
||||||
status == "invited"
|
status == "invited"
|
||||||
? Assets.invitedIcon
|
? Assets.invitedIcon
|
||||||
@ -160,6 +157,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
const SizedBox(width: 20),
|
const SizedBox(width: 20),
|
||||||
InkWell(
|
InkWell(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
context.read<SpaceTreeBloc>().add(ClearCachedData());
|
||||||
showDialog(
|
showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: false,
|
barrierDismissible: false,
|
||||||
@ -198,14 +196,10 @@ class UsersPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
isSelected: _blocRole.currentSortOrder,
|
isSelected: _blocRole.currentSortOrder,
|
||||||
aToZTap: () {
|
aToZTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const SortUsersByNameAsc());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const SortUsersByNameAsc());
|
|
||||||
},
|
},
|
||||||
zToaTap: () {
|
zToaTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const SortUsersByNameDesc());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const SortUsersByNameDesc());
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -214,9 +208,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
for (var item in _blocRole.jobTitle)
|
for (var item in _blocRole.jobTitle)
|
||||||
item: _blocRole.selectedJobTitles.contains(item),
|
item: _blocRole.selectedJobTitles.contains(item),
|
||||||
};
|
};
|
||||||
final RenderBox overlay = Overlay.of(context)
|
final RenderBox overlay =
|
||||||
.context
|
Overlay.of(context).context.findRenderObject() as RenderBox;
|
||||||
.findRenderObject() as RenderBox;
|
|
||||||
|
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
position: RelativeRect.fromLTRB(
|
position: RelativeRect.fromLTRB(
|
||||||
@ -256,9 +249,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
for (var item in _blocRole.roleTypes)
|
for (var item in _blocRole.roleTypes)
|
||||||
item: _blocRole.selectedRoles.contains(item),
|
item: _blocRole.selectedRoles.contains(item),
|
||||||
};
|
};
|
||||||
final RenderBox overlay = Overlay.of(context)
|
final RenderBox overlay =
|
||||||
.context
|
Overlay.of(context).context.findRenderObject() as RenderBox;
|
||||||
.findRenderObject() as RenderBox;
|
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
position: RelativeRect.fromLTRB(
|
position: RelativeRect.fromLTRB(
|
||||||
overlay.size.width / 4,
|
overlay.size.width / 4,
|
||||||
@ -278,8 +270,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
.map((entry) => entry.key)
|
.map((entry) => entry.key)
|
||||||
.toList();
|
.toList();
|
||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
context.read<UserTableBloc>().add(
|
context.read<UserTableBloc>().add(FilterUsersByRoleEvent(
|
||||||
FilterUsersByRoleEvent(
|
|
||||||
selectedRoles: selectedItems,
|
selectedRoles: selectedItems,
|
||||||
sortOrder: _blocRole.currentSortRole));
|
sortOrder: _blocRole.currentSortRole));
|
||||||
},
|
},
|
||||||
@ -296,14 +287,10 @@ class UsersPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
isSelected: _blocRole.currentSortOrder,
|
isSelected: _blocRole.currentSortOrder,
|
||||||
aToZTap: () {
|
aToZTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const DateNewestToOldestEvent());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const DateNewestToOldestEvent());
|
|
||||||
},
|
},
|
||||||
zToaTap: () {
|
zToaTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const DateOldestToNewestEvent());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const DateOldestToNewestEvent());
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -312,9 +299,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
for (var item in _blocRole.createdBy)
|
for (var item in _blocRole.createdBy)
|
||||||
item: _blocRole.selectedCreatedBy.contains(item),
|
item: _blocRole.selectedCreatedBy.contains(item),
|
||||||
};
|
};
|
||||||
final RenderBox overlay = Overlay.of(context)
|
final RenderBox overlay =
|
||||||
.context
|
Overlay.of(context).context.findRenderObject() as RenderBox;
|
||||||
.findRenderObject() as RenderBox;
|
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
position: RelativeRect.fromLTRB(
|
position: RelativeRect.fromLTRB(
|
||||||
overlay.size.width / 1,
|
overlay.size.width / 1,
|
||||||
@ -352,9 +338,8 @@ class UsersPage extends StatelessWidget {
|
|||||||
item: _blocRole.selectedStatuses.contains(item),
|
item: _blocRole.selectedStatuses.contains(item),
|
||||||
};
|
};
|
||||||
|
|
||||||
final RenderBox overlay = Overlay.of(context)
|
final RenderBox overlay =
|
||||||
.context
|
Overlay.of(context).context.findRenderObject() as RenderBox;
|
||||||
.findRenderObject() as RenderBox;
|
|
||||||
showPopUpFilterMenu(
|
showPopUpFilterMenu(
|
||||||
position: RelativeRect.fromLTRB(
|
position: RelativeRect.fromLTRB(
|
||||||
overlay.size.width / 0,
|
overlay.size.width / 0,
|
||||||
@ -391,14 +376,10 @@ class UsersPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
isSelected: _blocRole.currentSortOrderDate,
|
isSelected: _blocRole.currentSortOrderDate,
|
||||||
aToZTap: () {
|
aToZTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const DateNewestToOldestEvent());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const DateNewestToOldestEvent());
|
|
||||||
},
|
},
|
||||||
zToaTap: () {
|
zToaTap: () {
|
||||||
context
|
context.read<UserTableBloc>().add(const DateOldestToNewestEvent());
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(const DateOldestToNewestEvent());
|
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -425,23 +406,17 @@ class UsersPage extends StatelessWidget {
|
|||||||
Text(user.createdTime ?? ''),
|
Text(user.createdTime ?? ''),
|
||||||
Text(user.invitedBy),
|
Text(user.invitedBy),
|
||||||
status(
|
status(
|
||||||
status: user.isEnabled == false
|
status: user.isEnabled == false ? 'disabled' : user.status,
|
||||||
? 'disabled'
|
|
||||||
: user.status,
|
|
||||||
),
|
),
|
||||||
changeIconStatus(
|
changeIconStatus(
|
||||||
status: user.isEnabled == false
|
status: user.isEnabled == false ? 'disabled' : user.status,
|
||||||
? 'disabled'
|
|
||||||
: user.status,
|
|
||||||
userId: user.uuid,
|
userId: user.uuid,
|
||||||
onTap: user.status != "invited"
|
onTap: user.status != "invited"
|
||||||
? () {
|
? () {
|
||||||
context.read<UserTableBloc>().add(
|
context.read<UserTableBloc>().add(ChangeUserStatus(
|
||||||
ChangeUserStatus(
|
|
||||||
userId: user.uuid,
|
userId: user.uuid,
|
||||||
newStatus: user.isEnabled == false
|
newStatus:
|
||||||
? 'disabled'
|
user.isEnabled == false ? 'disabled' : user.status));
|
||||||
: user.status));
|
|
||||||
}
|
}
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
@ -456,8 +431,7 @@ class UsersPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: false,
|
barrierDismissible: false,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return EditUserDialog(
|
return EditUserDialog(userId: user.uuid);
|
||||||
userId: user.uuid);
|
|
||||||
},
|
},
|
||||||
).then((v) {
|
).then((v) {
|
||||||
if (v != null) {
|
if (v != null) {
|
||||||
@ -478,13 +452,10 @@ class UsersPage extends StatelessWidget {
|
|||||||
context: context,
|
context: context,
|
||||||
barrierDismissible: false,
|
barrierDismissible: false,
|
||||||
builder: (BuildContext context) {
|
builder: (BuildContext context) {
|
||||||
return DeleteUserDialog(
|
return DeleteUserDialog(onTapDelete: () async {
|
||||||
onTapDelete: () async {
|
|
||||||
try {
|
try {
|
||||||
_blocRole.add(DeleteUserEvent(
|
_blocRole.add(DeleteUserEvent(user.uuid, context));
|
||||||
user.uuid, context));
|
await Future.delayed(const Duration(seconds: 2));
|
||||||
await Future.delayed(
|
|
||||||
const Duration(seconds: 2));
|
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return false;
|
return false;
|
||||||
@ -514,20 +485,14 @@ class UsersPage extends StatelessWidget {
|
|||||||
visiblePagesCount: 4,
|
visiblePagesCount: 4,
|
||||||
buttonRadius: 10,
|
buttonRadius: 10,
|
||||||
selectedButtonColor: ColorsManager.secondaryColor,
|
selectedButtonColor: ColorsManager.secondaryColor,
|
||||||
buttonUnSelectedBorderColor:
|
buttonUnSelectedBorderColor: ColorsManager.grayBorder,
|
||||||
ColorsManager.grayBorder,
|
lastPageIcon: const Icon(Icons.keyboard_double_arrow_right),
|
||||||
lastPageIcon:
|
firstPageIcon: const Icon(Icons.keyboard_double_arrow_left),
|
||||||
const Icon(Icons.keyboard_double_arrow_right),
|
totalPages:
|
||||||
firstPageIcon:
|
(_blocRole.totalUsersCount.length / _blocRole.itemsPerPage).ceil(),
|
||||||
const Icon(Icons.keyboard_double_arrow_left),
|
|
||||||
totalPages: (_blocRole.totalUsersCount.length /
|
|
||||||
_blocRole.itemsPerPage)
|
|
||||||
.ceil(),
|
|
||||||
currentPage: _blocRole.currentPage,
|
currentPage: _blocRole.currentPage,
|
||||||
onPageChanged: (int pageNumber) {
|
onPageChanged: (int pageNumber) {
|
||||||
context
|
context.read<UserTableBloc>().add(ChangePage(pageNumber));
|
||||||
.read<UserTableBloc>()
|
|
||||||
.add(ChangePage(pageNumber));
|
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
Reference in New Issue
Block a user