diff --git a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart index d97972d4..6e833787 100644 --- a/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart +++ b/lib/pages/device_managment/all_devices/widgets/device_managment_body.dart @@ -8,7 +8,7 @@ import 'package:syncrow_web/pages/device_managment/all_devices/models/devices_mo import 'package:syncrow_web/pages/device_managment/all_devices/widgets/device_search_filters.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_batch_control_dialog.dart'; import 'package:syncrow_web/pages/device_managment/shared/device_control_dialog.dart'; -import 'package:syncrow_web/pages/space_tree/view/side_tree_view.dart'; +import 'package:syncrow_web/pages/space_tree/view/space_tree_view.dart'; import 'package:syncrow_web/utils/format_date_time.dart'; import 'package:syncrow_web/utils/helpers/responsice_layout_helper/responsive_layout_helper.dart'; import 'package:syncrow_web/utils/style.dart'; @@ -63,7 +63,7 @@ class DeviceManagementBody extends StatelessWidget with HelperResponsiveLayout { return Row( children: [ const Expanded( - child: SideTreeView( + child: SpaceTreeView( // onSelectAction: (String communityId, String spaceId) { // context.read().add(FetchDevices(communityId, spaceId)); // }, diff --git a/lib/pages/routines/view/routines_view.dart b/lib/pages/routines/view/routines_view.dart index e7601729..8485cfca 100644 --- a/lib/pages/routines/view/routines_view.dart +++ b/lib/pages/routines/view/routines_view.dart @@ -5,7 +5,7 @@ import 'package:syncrow_web/pages/routines/view/create_new_routine_view.dart'; import 'package:syncrow_web/pages/routines/widgets/main_routine_view/fetch_routine_scenes_automation.dart'; import 'package:syncrow_web/pages/routines/widgets/main_routine_view/routine_view_card.dart'; import 'package:syncrow_web/pages/space_tree/bloc/space_tree_bloc.dart'; -import 'package:syncrow_web/pages/space_tree/view/side_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/snack_bar.dart'; @@ -41,7 +41,7 @@ class _RoutinesViewState extends State { // // ..add(LoadAutomation(spaceId)); // }, // ) - SideTreeView()), + SpaceTreeView()), Expanded( flex: 3, child: Padding( diff --git a/lib/pages/space_tree/bloc/space_tree_bloc.dart b/lib/pages/space_tree/bloc/space_tree_bloc.dart index 78da9fd2..120ce274 100644 --- a/lib/pages/space_tree/bloc/space_tree_bloc.dart +++ b/lib/pages/space_tree/bloc/space_tree_bloc.dart @@ -83,9 +83,10 @@ class SpaceTreeBloc extends Bloc { _onCommunitySelected(OnCommunitySelected event, Emitter emit) async { try { - List updatedSelectedCommunities = List.from(state.selectedCommunities); - List updatedSelectedSpaces = List.from(state.selectedSpaces); - List updatedSoldChecks = List.from(state.soldCheck); + List updatedSelectedCommunities = + List.from(state.selectedCommunities.toSet().toList()); + List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); List childrenIds = _getAllChildIds(event.children); @@ -111,13 +112,19 @@ class SpaceTreeBloc extends Bloc { _onSpaceSelected(OnSpaceSelected event, Emitter emit) async { try { - List updatedSelectedCommunities = List.from(state.selectedCommunities); - List updatedSelectedSpaces = List.from(state.selectedSpaces); - List updatedSoldChecks = List.from(state.soldCheck); + List updatedSelectedCommunities = + List.from(state.selectedCommunities.toSet().toList()); + List updatedSelectedSpaces = List.from(state.selectedSpaces.toSet().toList()); + List updatedSoldChecks = List.from(state.soldCheck.toSet().toList()); List childrenIds = _getAllChildIds(event.children); + bool isChildSelected = false; - // List childrenIds = _getAllChildSpaceIds(event.communityId); + for (String id in childrenIds) { + if (updatedSelectedSpaces.contains(id)) { + isChildSelected = true; + } + } if (!updatedSelectedSpaces.contains(event.spaceId) && !updatedSoldChecks.contains(event.spaceId)) { @@ -127,20 +134,36 @@ class SpaceTreeBloc extends Bloc { if (childrenIds.isNotEmpty) { updatedSelectedSpaces.addAll(childrenIds); } - } else if (!updatedSoldChecks.contains(event.spaceId) && childrenIds.isNotEmpty) { + + List spaces = _getThePathToChild(event.communityId, event.spaceId); + for (String space in spaces) { + if (!updatedSelectedSpaces.contains(space) && !updatedSoldChecks.contains(space)) { + updatedSoldChecks.add(space); + } + } + } else if (!updatedSoldChecks.contains(event.spaceId) && + childrenIds.isNotEmpty && + isChildSelected) { // Second click: Unselect space but keep children updatedSelectedSpaces.remove(event.spaceId); updatedSoldChecks.add(event.spaceId); } else { // Third click: Unselect space and all its children - if (!_anySpacesSelectedInCommunity(event.communityId)) { - updatedSelectedCommunities.remove(event.communityId); - } updatedSelectedSpaces.remove(event.spaceId); if (childrenIds.isNotEmpty) { updatedSelectedSpaces.removeWhere(childrenIds.contains); + updatedSoldChecks.removeWhere(childrenIds.contains); } updatedSoldChecks.remove(event.spaceId); + + List parents = _getThePathToChild(event.communityId, event.spaceId); + if (!_parentSelected(parents, updatedSelectedSpaces)) { + updatedSoldChecks.removeWhere(parents.contains); + } + if (!_anySpacesSelectedInCommunity( + event.communityId, updatedSelectedSpaces, updatedSoldChecks)) { + updatedSelectedCommunities.remove(event.communityId); + } } emit(state.copyWith( @@ -153,6 +176,15 @@ class SpaceTreeBloc extends Bloc { } } + _parentSelected(List parents, List selectedSpaces) { + for (String space in parents) { + if (selectedSpaces.contains(space)) { + return true; + } + } + return false; + } + _onSearch(SearchQueryEvent event, Emitter emit) async { try { List communities = List.from(state.communityList); @@ -193,17 +225,59 @@ class SpaceTreeBloc extends Bloc { return ids; } - bool _anySpacesSelectedInCommunity(String communityId) { + bool _anySpacesSelectedInCommunity( + String communityId, List selectedSpaces, List partialCheckedList) { bool result = false; for (var community in state.communityList) { if (community.uuid == communityId) { List ids = _getAllChildIds(community.spaces); for (var id in ids) { - result = state.selectedSpaces.contains(id); - break; + result = selectedSpaces.contains(id) || partialCheckedList.contains(id); + if (result) { + return result; + } } } } return result; } + + List _getThePathToChild(String communityId, String selectedSpaceId) { + List ids = []; + for (var community in state.communityList) { + if (community.uuid == communityId) { + for (var space in community.spaces) { + List list = []; + list.add(space.uuid!); + ids = _getAllParentsIds(space, selectedSpaceId, List.from(list)); + if (ids.isNotEmpty) { + return ids; + } + } + } + } + return ids; + } + + List _getAllParentsIds(SpaceModel child, String spaceId, List listIds) { + List ids = listIds; + + ids.add(child.uuid ?? ''); + + if (child.uuid == spaceId) { + return ids; + } + + if (child.children.isNotEmpty) { + for (var space in child.children) { + var result = _getAllParentsIds(space, spaceId, List.from(ids)); + if (result.isNotEmpty) { + return result; + } + } + } + + ids.removeLast(); + return []; + } } diff --git a/lib/pages/space_tree/view/side_tree_view.dart b/lib/pages/space_tree/view/space_tree_view.dart similarity index 98% rename from lib/pages/space_tree/view/side_tree_view.dart rename to lib/pages/space_tree/view/space_tree_view.dart index 4725d09b..f5dfbc84 100644 --- a/lib/pages/space_tree/view/side_tree_view.dart +++ b/lib/pages/space_tree/view/space_tree_view.dart @@ -10,8 +10,8 @@ import 'package:syncrow_web/pages/spaces_management/all_spaces/model/space_model import 'package:syncrow_web/utils/color_manager.dart'; import 'package:syncrow_web/utils/style.dart'; -class SideTreeView extends StatelessWidget { - const SideTreeView({super.key}); +class SpaceTreeView extends StatelessWidget { + const SpaceTreeView({super.key}); @override Widget build(BuildContext context) {