container chip for unassigned
This commit is contained in:
+14
-8
@@ -205,15 +205,21 @@ class _TabSheetHeader extends HookConsumerWidget {
|
|||||||
return ContainerChips(
|
return ContainerChips(
|
||||||
selectedContainer: selectedContainer,
|
selectedContainer: selectedContainer,
|
||||||
onSelected: (container) async {
|
onSelected: (container) async {
|
||||||
final result = await ref
|
if (container != null) {
|
||||||
.read(selectedContainerProvider.notifier)
|
final result = await ref
|
||||||
.setContainerId(container.id);
|
.read(selectedContainerProvider.notifier)
|
||||||
|
.setContainerId(container.id);
|
||||||
|
|
||||||
if (context.mounted &&
|
if (context.mounted &&
|
||||||
result == SetContainerResult.successHasProxy) {
|
result == SetContainerResult.successHasProxy) {
|
||||||
await ref
|
await ref
|
||||||
.read(startProxyControllerProvider.notifier)
|
.read(startProxyControllerProvider.notifier)
|
||||||
.maybeStartProxy(context);
|
.maybeStartProxy(context);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ref
|
||||||
|
.read(selectedContainerProvider.notifier)
|
||||||
|
.clearContainer();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onDeleted: (container) {
|
onDeleted: (container) {
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||||
|
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:nullability/nullability.dart';
|
import 'package:nullability/nullability.dart';
|
||||||
import 'package:weblibre/core/providers/global_drop.dart';
|
import 'package:weblibre/core/providers/global_drop.dart';
|
||||||
import 'package:weblibre/core/routing/routes.dart';
|
import 'package:weblibre/core/routing/routes.dart';
|
||||||
import 'package:weblibre/data/models/drag_data.dart';
|
import 'package:weblibre/data/models/drag_data.dart';
|
||||||
|
import 'package:weblibre/features/geckoview/features/tabs/data/entities/container_filter.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
|
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
|
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart';
|
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart';
|
||||||
@@ -17,7 +19,7 @@ class ContainerChips extends HookConsumerWidget {
|
|||||||
|
|
||||||
final ContainerData? selectedContainer;
|
final ContainerData? selectedContainer;
|
||||||
final bool Function(ContainerDataWithCount)? containerFilter;
|
final bool Function(ContainerDataWithCount)? containerFilter;
|
||||||
final void Function(ContainerDataWithCount)? onSelected;
|
final void Function(ContainerDataWithCount?)? onSelected;
|
||||||
final void Function(ContainerDataWithCount)? onDeleted;
|
final void Function(ContainerDataWithCount)? onDeleted;
|
||||||
|
|
||||||
final ValueListenable<TextEditingValue>? searchTextListenable;
|
final ValueListenable<TextEditingValue>? searchTextListenable;
|
||||||
@@ -149,6 +151,35 @@ class ContainerChips extends HookConsumerWidget {
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
prefixListItems: [
|
||||||
|
Consumer(
|
||||||
|
builder: (context, ref, child) {
|
||||||
|
final tabCount = ref.watch(
|
||||||
|
containerTabCountProvider(
|
||||||
|
// ignore: provider_parameters
|
||||||
|
ContainerFilterById(containerId: null),
|
||||||
|
).select((value) => value.valueOrNull ?? 0),
|
||||||
|
);
|
||||||
|
|
||||||
|
return FilterChip(
|
||||||
|
avatar: const Icon(MdiIcons.folderHidden),
|
||||||
|
labelPadding: (tabCount > 0)
|
||||||
|
? null
|
||||||
|
: const EdgeInsets.only(right: 2.0),
|
||||||
|
label: (tabCount > 0)
|
||||||
|
? Text(tabCount.toString())
|
||||||
|
: const SizedBox.shrink(),
|
||||||
|
selected: selectedContainer == null,
|
||||||
|
showCheckmark: false,
|
||||||
|
onSelected: (value) {
|
||||||
|
if (value) {
|
||||||
|
onSelected?.call(null);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
],
|
||||||
availableItems: availableContainers,
|
availableItems: availableContainers,
|
||||||
selectedItem: selectedContainer,
|
selectedItem: selectedContainer,
|
||||||
onSelected: onSelected,
|
onSelected: onSelected,
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ class _BadgeWrapper extends StatelessWidget {
|
|||||||
|
|
||||||
class SelectableChips<T extends S, S, K> extends StatelessWidget {
|
class SelectableChips<T extends S, S, K> extends StatelessWidget {
|
||||||
final List<T> availableItems;
|
final List<T> availableItems;
|
||||||
|
final List<Widget> prefixListItems;
|
||||||
final S? selectedItem;
|
final S? selectedItem;
|
||||||
final int maxCount;
|
final int maxCount;
|
||||||
final bool deleteIcon;
|
final bool deleteIcon;
|
||||||
@@ -44,6 +45,7 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
|
|||||||
this.itemBadgeCount,
|
this.itemBadgeCount,
|
||||||
this.itemWrap,
|
this.itemWrap,
|
||||||
this.itemTooltip,
|
this.itemTooltip,
|
||||||
|
this.prefixListItems = const [],
|
||||||
required this.availableItems,
|
required this.availableItems,
|
||||||
this.selectedItem,
|
this.selectedItem,
|
||||||
this.maxCount = 25,
|
this.maxCount = 25,
|
||||||
@@ -75,9 +77,16 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
|
|||||||
//Improve list performance by not rendering outside screen at all
|
//Improve list performance by not rendering outside screen at all
|
||||||
cacheExtent: 0,
|
cacheExtent: 0,
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
itemCount: items.length,
|
itemCount: prefixListItems.length + items.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final item = items[index];
|
if (index < prefixListItems.length) {
|
||||||
|
return Padding(
|
||||||
|
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
|
||||||
|
child: prefixListItems[index],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
final item = items[index - prefixListItems.length];
|
||||||
final child = Padding(
|
final child = Padding(
|
||||||
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
|
padding: const EdgeInsets.only(right: 8.0, top: 4.0),
|
||||||
child: _BadgeWrapper(
|
child: _BadgeWrapper(
|
||||||
|
|||||||
Reference in New Issue
Block a user