From 4a0ee3665f75d6b926d39232608a5249fe3e40e7 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 10:02:41 -0400 Subject: [PATCH 1/4] Can't add subclass as parent space --- lib/pages/chat_list/chat_list.dart | 4 ++-- .../children_and_parents_extension.dart | 10 ++++++++++ .../pangea_room_extension/pangea_room_extension.dart | 2 ++ lib/pangea/widgets/class/add_space_toggles.dart | 2 +- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 47fb51235..77df5b07f 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -815,8 +815,8 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) - .where((e) => !(e?.isPangeaClass ?? true)) - .every((e) => r.canIAddSpaceChild(e)), + // .where((e) => !(e?.isPangeaClass ?? true)) + .every((e) => r.canAddAsParentOf(e)), //Pangea# ) .map( diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index 78ab91cc8..e5e7e6003 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -127,4 +127,14 @@ extension ChildrenAndParentsRoomExtension on Room { } return childIds; } + + // Checks if can add chat as child + // Or whether potential child space is ancestor of this + bool _canAddAsParentOf(Room? child) { + if (child == null || !child.isSpace) { + return _canIAddSpaceChild(child); + } + if (id == child.id) return false; + return !child._allSpaceChildRoomIds.contains(id); + } } diff --git a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart index edcd80b04..25694901c 100644 --- a/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/pangea_room_extension.dart @@ -114,6 +114,8 @@ extension PangeaRoom on Room { List get allSpaceChildRoomIds => _allSpaceChildRoomIds; + bool canAddAsParentOf(Room? child) => _canAddAsParentOf(child); + // class_and_exchange_settings DateTime? get rulesUpdatedAt => _rulesUpdatedAt; diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index cfea4dd7b..69122356b 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -146,7 +146,7 @@ class AddToSpaceState extends State { final Room possibleParent = possibleParents[index]; final bool canAdd = !(!possibleParent.isRoomAdmin && widget.mode == AddToClassMode.exchange) && - possibleParent.canIAddSpaceChild(room); + possibleParent.canAddAsParentOf(room); return Opacity( opacity: canAdd ? 1 : 0.5, From aa5d09407ec27d58fe59a5de6996b90488bc540d Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 10:16:43 -0400 Subject: [PATCH 2/4] Make sure user has permission to add space child --- lib/pages/chat_list/chat_list.dart | 1 - .../children_and_parents_extension.dart | 8 +++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 77df5b07f..58b3f9223 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -815,7 +815,6 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) - // .where((e) => !(e?.isPangeaClass ?? true)) .every((e) => r.canAddAsParentOf(e)), //Pangea# ) diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index e5e7e6003..b0350853d 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -128,13 +128,15 @@ extension ChildrenAndParentsRoomExtension on Room { return childIds; } - // Checks if can add chat as child - // Or whether potential child space is ancestor of this + // Checks if has permissions to add child to space + // And whether potential child space is ancestor of this bool _canAddAsParentOf(Room? child) { if (child == null || !child.isSpace) { return _canIAddSpaceChild(child); } if (id == child.id) return false; - return !child._allSpaceChildRoomIds.contains(id); + return _isRoomAdmin && + child._isRoomAdmin && + !child._allSpaceChildRoomIds.contains(id); } } From a2a31e526aa107612c21902deb3f0f182b379c49 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Mon, 17 Jun 2024 12:25:05 -0400 Subject: [PATCH 3/4] Gray out buttons for spaces user isn't admin for --- assets/l10n/intl_en.arb | 5 ++++- lib/pages/chat_list/chat_list.dart | 22 ++++++++++++++++++- .../children_and_parents_extension.dart | 8 +++---- .../widgets/class/add_space_toggles.dart | 10 ++++++--- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/assets/l10n/intl_en.arb b/assets/l10n/intl_en.arb index 84703a551..c8224dccb 100644 --- a/assets/l10n/intl_en.arb +++ b/assets/l10n/intl_en.arb @@ -3970,5 +3970,8 @@ "capacitySetTooLow": "Room capacity cannot be set below the current number of non-admins.", "roomCapacityExplanation": "Room capacity limits the number of non-admins allowed in a room.", "enterNumber": "Please enter a whole number value.", - "buildTranslation": "Build your translation from the choices above" + "buildTranslation": "Build your translation from the choices above", + "nonexistentSelection": "Selection no longer exists.", + "cantAddSpaceChild": "You do not have permission to add a child to this space.", + "roomAddedToSpace": "Room(s) have been added to the selected space." } \ No newline at end of file diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 58b3f9223..f8faceec5 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -797,6 +797,10 @@ class ChatListController extends State // Pangea# Future addToSpace() async { + // #Pangea + final firstSelectedRoom = + Matrix.of(context).client.getRoomById(selectedRoomIds.toList().first); + // Pangea# final selectedSpace = await showConfirmationDialog( context: context, title: L10n.of(context)!.addToSpace, @@ -825,6 +829,12 @@ class ChatListController extends State // label: space // .getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), label: space.nameIncludingParents(context), + textStyle: TextStyle( + color: (firstSelectedRoom == null || + (firstSelectedRoom.isSpace && !space.isRoomAdmin)) + ? Theme.of(context).colorScheme.outline + : Theme.of(context).colorScheme.surfaceTint, + ), // Pangea# ), ) @@ -836,12 +846,19 @@ class ChatListController extends State future: () async { final space = Matrix.of(context).client.getRoomById(selectedSpace)!; // #Pangea + if (firstSelectedRoom == null) { + throw L10n.of(context)!.nonexistentSelection; + } + if (firstSelectedRoom.isSpace && !space.isRoomAdmin) { + throw L10n.of(context)!.cantAddSpaceChild; + } await pangeaAddToSpace( space, selectedRoomIds.toList(), context, pangeaController, ); + // if (space.canSendDefaultStates) { // for (final roomId in selectedRoomIds) { // await space.setSpaceChild(roomId); @@ -854,7 +871,10 @@ class ChatListController extends State if (!mounted) return; ScaffoldMessenger.of(context).showSnackBar( SnackBar( - content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), + // #Pangea + // content: Text(L10n.of(context)!.chatHasBeenAddedToThisSpace), + content: Text(L10n.of(context)!.roomAddedToSpace), + // Pangea# ), ); } diff --git a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart index b0350853d..24dad6c41 100644 --- a/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension/children_and_parents_extension.dart @@ -128,15 +128,13 @@ extension ChildrenAndParentsRoomExtension on Room { return childIds; } - // Checks if has permissions to add child to space - // And whether potential child space is ancestor of this + // Checks if has permissions to add child chat + // Or whether potential child space is ancestor of this bool _canAddAsParentOf(Room? child) { if (child == null || !child.isSpace) { return _canIAddSpaceChild(child); } if (id == child.id) return false; - return _isRoomAdmin && - child._isRoomAdmin && - !child._allSpaceChildRoomIds.contains(id); + return !child._allSpaceChildRoomIds.contains(id); } } diff --git a/lib/pangea/widgets/class/add_space_toggles.dart b/lib/pangea/widgets/class/add_space_toggles.dart index 69122356b..c2ed32efe 100644 --- a/lib/pangea/widgets/class/add_space_toggles.dart +++ b/lib/pangea/widgets/class/add_space_toggles.dart @@ -144,9 +144,13 @@ class AddToSpaceState extends State { Widget getAddToSpaceToggleItem(int index) { final Room possibleParent = possibleParents[index]; - final bool canAdd = !(!possibleParent.isRoomAdmin && - widget.mode == AddToClassMode.exchange) && - possibleParent.canAddAsParentOf(room); + final bool canAdd = (room?.isSpace ?? false) + // Room is space + ? possibleParent.isRoomAdmin && + room!.isRoomAdmin && + possibleParent.canAddAsParentOf(room) + // Room is null or chat + : possibleParent.canAddAsParentOf(room); return Opacity( opacity: canAdd ? 1 : 0.5, From 59ab741168da320d368448a859a6dfb9eb3fce14 Mon Sep 17 00:00:00 2001 From: Kelrap Date: Tue, 18 Jun 2024 14:10:18 -0400 Subject: [PATCH 4/4] Added explanatory comments --- lib/pages/chat_list/chat_list.dart | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index f8faceec5..6397846dd 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -819,6 +819,8 @@ class ChatListController extends State && selectedRoomIds .map((id) => Matrix.of(context).client.getRoomById(id)) + // Only show non-recursion-causing spaces + // Performs a few other checks as well .every((e) => r.canAddAsParentOf(e)), //Pangea# ) @@ -829,6 +831,7 @@ class ChatListController extends State // label: space // .getLocalizedDisplayname(MatrixLocals(L10n.of(context)!)), label: space.nameIncludingParents(context), + // If user is not admin of space, button is grayed out textStyle: TextStyle( color: (firstSelectedRoom == null || (firstSelectedRoom.isSpace && !space.isRoomAdmin)) @@ -849,6 +852,7 @@ class ChatListController extends State if (firstSelectedRoom == null) { throw L10n.of(context)!.nonexistentSelection; } + // If user is not admin of the would-be parent space, does not allow if (firstSelectedRoom.isSpace && !space.isRoomAdmin) { throw L10n.of(context)!.cantAddSpaceChild; }