Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
59c7f9f
[locker] Improve multiselect UX and refactor scroll logic
AmanRajSinghMourya Dec 31, 2025
5665557
[locker] Add multiselect support to home page
AmanRajSinghMourya Dec 31, 2025
a2638c3
[locker] Add ownership checks for multiselect actions and simplify sc…
AmanRajSinghMourya Jan 1, 2026
c08c355
[locker] Add collection multiselect with ownership checks and animati…
AmanRajSinghMourya Jan 1, 2026
dac5227
[locker] Fix Select All to respect collection filter
AmanRajSinghMourya Jan 1, 2026
43693b7
[locker] Fix notifier not updating when filters cleared
AmanRajSinghMourya Jan 1, 2026
4fafde1
[locker] Format file_selection_overlay_bar.dart
AmanRajSinghMourya Jan 1, 2026
e5fe188
Minor UI fixes
AmanRajSinghMourya Jan 2, 2026
8aee24f
[locker] Add leave option for shared collections and improve UI consi…
AmanRajSinghMourya Jan 7, 2026
cdaaa9a
[locker] Swap Important/Share buttons and add shared file ownership c…
AmanRajSinghMourya Jan 7, 2026
e1b1104
minor fix
AmanRajSinghMourya Jan 7, 2026
ab20bfc
Merge branch 'main' into multiselect
AmanRajSinghMourya Jan 7, 2026
c560003
Merge branch 'main' into multiselect
AmanRajSinghMourya Jan 9, 2026
72fa28f
Enhance file sharing indicators and adjust icon sizes
AmanRajSinghMourya Jan 9, 2026
63a46fd
removed pop up menu from collections and file
AmanRajSinghMourya Jan 9, 2026
18bca5f
Remove unused overflow actions from ItemListView and TrashPage
AmanRajSinghMourya Jan 9, 2026
9a3ac6e
Refactor IconButtonWidget to simplify padding and improve layout
AmanRajSinghMourya Jan 9, 2026
d45bc0f
Update displayed files notifier to use post-frame callback for better…
AmanRajSinghMourya Jan 9, 2026
88aaddb
Merge branch 'main' into multiselect
AmanRajSinghMourya Jan 12, 2026
c8baa3a
consistency
AmanRajSinghMourya Jan 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions mobile/apps/locker/lib/l10n/app_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@
}
},
"collectionCannotBeDeleted": "This collection cannot be deleted",
"collectionCannotBeEdited": "This collection cannot be edited",
"collectionCannotBeShared": "This collection cannot be shared",
"deleteCollection": "Delete collection",
"deleteCollectionConfirmation": "Are you sure you want to delete \"{collectionName}\"?",
"@deleteCollectionConfirmation": {
Expand Down
12 changes: 12 additions & 0 deletions mobile/apps/locker/lib/l10n/app_localizations.dart
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,18 @@ abstract class AppLocalizations {
/// **'This collection cannot be deleted'**
String get collectionCannotBeDeleted;

/// No description provided for @collectionCannotBeEdited.
///
/// In en, this message translates to:
/// **'This collection cannot be edited'**
String get collectionCannotBeEdited;

/// No description provided for @collectionCannotBeShared.
///
/// In en, this message translates to:
/// **'This collection cannot be shared'**
String get collectionCannotBeShared;

/// No description provided for @deleteCollection.
///
/// In en, this message translates to:
Expand Down
6 changes: 6 additions & 0 deletions mobile/apps/locker/lib/l10n/app_localizations_en.dart
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,12 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get collectionCannotBeDeleted => 'This collection cannot be deleted';

@override
String get collectionCannotBeEdited => 'This collection cannot be edited';

@override
String get collectionCannotBeShared => 'This collection cannot be shared';

@override
String get deleteCollection => 'Delete collection';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,12 @@ String typeToString(CollectionType type) {
extension CollectionTypeExtn on CollectionType {
bool get canDelete =>
this != CollectionType.favorites && this != CollectionType.uncategorized;

bool get canEdit =>
this != CollectionType.favorites && this != CollectionType.uncategorized;

bool get canShare =>
this != CollectionType.favorites && this != CollectionType.uncategorized;
}

enum CollectionParticipantRole {
Expand Down
82 changes: 25 additions & 57 deletions mobile/apps/locker/lib/ui/components/collection_list_widget.dart
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,11 @@ import "package:locker/models/selected_collections.dart";
import "package:locker/services/collections/collections_service.dart";
import "package:locker/services/collections/models/collection.dart";
import "package:locker/services/configuration.dart";
import "package:locker/ui/components/collection_popup_menu_widget.dart";
import "package:locker/ui/components/item_list_view.dart";
import "package:locker/ui/pages/collection_page.dart";
import "package:locker/ui/sharing/album_share_info_widget.dart";

class CollectionListWidget extends StatelessWidget {
final Collection collection;
final List<OverflowMenuAction>? overflowActions;
final bool isLastItem;
final SelectedCollections? selectedCollections;
final void Function(Collection)? onTapCallback;
Expand All @@ -26,7 +23,6 @@ class CollectionListWidget extends StatelessWidget {
const CollectionListWidget({
super.key,
required this.collection,
this.overflowActions,
this.isLastItem = false,
this.selectedCollections,
this.onTapCallback,
Expand Down Expand Up @@ -150,7 +146,7 @@ class CollectionListWidget extends StatelessWidget {
final bool isSelected =
selectedCollections?.isCollectionSelected(collection) ?? false;
return AnimatedContainer(
duration: const Duration(milliseconds: 200),
duration: const Duration(milliseconds: 300),
curve: Curves.easeOut,
decoration: BoxDecoration(
border: Border.all(
Expand All @@ -166,58 +162,30 @@ class CollectionListWidget extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
collectionRowWidget,
isFavourite
? const SizedBox.shrink()
: AnimatedSwitcher(
duration: const Duration(milliseconds: 200),
switchInCurve: Curves.easeOut,
switchOutCurve: Curves.easeIn,
child: isSelected
? IconButtonWidget(
key: const ValueKey("selected"),
icon: Icons.check_circle_rounded,
iconButtonType: IconButtonType.secondary,
iconColor: colorScheme.primary700,
)
: showSharingIndicator
? Row(
key: const ValueKey("shared"),
mainAxisSize: MainAxisSize.min,
children: [
if (hasSharees)
_buildShareesAvatars(
collection.sharees
.whereType<User>()
.toList(),
),
CollectionPopupMenuWidget(
collection: collection,
overflowActions: overflowActions,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: HugeIcon(
icon: HugeIcons
.strokeRoundedMoreVertical,
color: colorScheme.textBase,
),
),
),
],
)
: CollectionPopupMenuWidget(
key: const ValueKey("menu"),
collection: collection,
overflowActions: overflowActions,
child: Padding(
padding: const EdgeInsets.all(12.0),
child: HugeIcon(
icon:
HugeIcons.strokeRoundedMoreVertical,
color: colorScheme.textBase,
),
),
),
),
if (!isFavourite)
Padding(
padding: const EdgeInsets.only(right: 12.0),
child: AnimatedSwitcher(
duration: const Duration(milliseconds: 300),
switchInCurve: Curves.easeOut,
switchOutCurve: Curves.easeIn,
child: isSelected
? IconButtonWidget(
key: const ValueKey("selected"),
icon: Icons.check_circle_rounded,
iconButtonType: IconButtonType.secondary,
iconColor: colorScheme.primary700,
)
: (showSharingIndicator && hasSharees)
? _buildShareesAvatars(
collection.sharees.whereType<User>().toList(),
)
: const SizedBox(
key: ValueKey("unselected"),
width: 12,
),
),
),
],
),
);
Expand Down
Loading