|
|
|
|
@ -10,8 +10,7 @@ import 'package:test_sa/views/widgets/bottom_sheets/selection_bottom_sheet.dart'
|
|
|
|
|
import '../../models/base.dart';
|
|
|
|
|
import '../app_style/app_color.dart';
|
|
|
|
|
|
|
|
|
|
class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier>
|
|
|
|
|
extends StatefulWidget {
|
|
|
|
|
class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier> extends StatefulWidget {
|
|
|
|
|
final BuildContext context;
|
|
|
|
|
final Function(T) onSelect;
|
|
|
|
|
final T initialValue;
|
|
|
|
|
@ -38,12 +37,10 @@ class SingleItemDropDownMenu<T extends Base, X extends LoadingListNotifier>
|
|
|
|
|
}) : super(key: key);
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
State<SingleItemDropDownMenu<T, X>> createState() =>
|
|
|
|
|
_SingleItemDropDownMenuState<T, X>();
|
|
|
|
|
State<SingleItemDropDownMenu<T, X>> createState() => _SingleItemDropDownMenuState<T, X>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
X extends LoadingListNotifier> extends State<SingleItemDropDownMenu<T, X>> {
|
|
|
|
|
class _SingleItemDropDownMenuState<T extends Base, X extends LoadingListNotifier> extends State<SingleItemDropDownMenu<T, X>> {
|
|
|
|
|
T _selectedItem;
|
|
|
|
|
X provider;
|
|
|
|
|
|
|
|
|
|
@ -53,15 +50,11 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
provider = Provider.of<X>(widget.context);
|
|
|
|
|
}
|
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
|
final result =
|
|
|
|
|
(X == NullableLoadingProvider ? widget.staticData : provider.items)
|
|
|
|
|
?.where((element) {
|
|
|
|
|
final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) {
|
|
|
|
|
return element.identifier == widget.initialValue.identifier;
|
|
|
|
|
});
|
|
|
|
|
if (result?.isNotEmpty ?? false) _selectedItem = result.first;
|
|
|
|
|
if (widget.onSelect != null &&
|
|
|
|
|
(widget.initialValue?.identifier ?? "") !=
|
|
|
|
|
(_selectedItem?.identifier ?? "")) {
|
|
|
|
|
if (widget.onSelect != null && (widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) {
|
|
|
|
|
widget.onSelect(_selectedItem);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -76,9 +69,7 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
@override
|
|
|
|
|
void didUpdateWidget(covariant SingleItemDropDownMenu<T, X> oldWidget) {
|
|
|
|
|
if (widget.initialValue != null) {
|
|
|
|
|
final result =
|
|
|
|
|
(X == NullableLoadingProvider ? widget.staticData : provider.items)
|
|
|
|
|
?.where((element) {
|
|
|
|
|
final result = (X == NullableLoadingProvider ? widget.staticData : provider.items)?.where((element) {
|
|
|
|
|
return element.identifier == widget.initialValue.identifier;
|
|
|
|
|
});
|
|
|
|
|
if (result?.isNotEmpty ?? false) {
|
|
|
|
|
@ -86,9 +77,7 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
} else {
|
|
|
|
|
_selectedItem = null;
|
|
|
|
|
}
|
|
|
|
|
if (widget.onSelect != null &&
|
|
|
|
|
(widget.initialValue?.identifier ?? "") !=
|
|
|
|
|
(_selectedItem?.identifier ?? "")) {
|
|
|
|
|
if (widget.onSelect != null && (widget.initialValue?.identifier ?? "") != (_selectedItem?.identifier ?? "")) {
|
|
|
|
|
widget.onSelect(_selectedItem);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
@ -99,15 +88,10 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
|
bool isEmpty =
|
|
|
|
|
((X == NullableLoadingProvider ? widget.staticData : provider.items)
|
|
|
|
|
?.isEmpty ??
|
|
|
|
|
true);
|
|
|
|
|
bool isEmpty = ((X == NullableLoadingProvider ? widget.staticData : provider.items)?.isEmpty ?? true);
|
|
|
|
|
return AppLoadingManager(
|
|
|
|
|
isLoading: widget.loading ??
|
|
|
|
|
((X == NullableLoadingProvider) ? false : provider.loading),
|
|
|
|
|
isFailedLoading:
|
|
|
|
|
(X == NullableLoadingProvider) ? false : provider.items == null,
|
|
|
|
|
isLoading: widget.loading ?? ((X == NullableLoadingProvider) ? false : provider.loading),
|
|
|
|
|
isFailedLoading: (X == NullableLoadingProvider) ? false : provider.items == null,
|
|
|
|
|
stateCode: (X == NullableLoadingProvider) ? 200 : provider.stateCode,
|
|
|
|
|
onRefresh: () async {
|
|
|
|
|
if (X != NullableLoadingProvider) {
|
|
|
|
|
@ -125,25 +109,19 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
? AppColor.neutral40
|
|
|
|
|
: widget.backgroundColor ?? AppColor.background(context),
|
|
|
|
|
borderRadius: BorderRadius.circular(10),
|
|
|
|
|
boxShadow: [
|
|
|
|
|
BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)
|
|
|
|
|
],
|
|
|
|
|
boxShadow: [BoxShadow(color: Colors.black.withOpacity(0.05), blurRadius: 10)],
|
|
|
|
|
),
|
|
|
|
|
child: Stack(
|
|
|
|
|
alignment: Alignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
if (widget.enabled)
|
|
|
|
|
const PositionedDirectional(
|
|
|
|
|
end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
|
|
|
|
|
if (widget.enabled) const PositionedDirectional(end: 0, child: Icon(Icons.keyboard_arrow_down_rounded)),
|
|
|
|
|
Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
widget.title,
|
|
|
|
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
|
|
|
|
color: context.isDark ? null : AppColor.neutral20,
|
|
|
|
|
fontWeight: FontWeight.w500),
|
|
|
|
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(color: context.isDark ? null : AppColor.neutral20, fontWeight: FontWeight.w500),
|
|
|
|
|
),
|
|
|
|
|
DropdownButton<T>(
|
|
|
|
|
value: _selectedItem,
|
|
|
|
|
@ -153,9 +131,7 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
elevation: 0,
|
|
|
|
|
isExpanded: true,
|
|
|
|
|
hint: Text(
|
|
|
|
|
isEmpty || widget.enabled == false
|
|
|
|
|
? context.translation.noDataFound
|
|
|
|
|
: context.translation.select,
|
|
|
|
|
isEmpty || widget.enabled == false ? context.translation.noDataFound : context.translation.select,
|
|
|
|
|
style: Theme.of(context).textTheme.bodyLarge,
|
|
|
|
|
),
|
|
|
|
|
style: TextStyle(color: Theme.of(context).primaryColor),
|
|
|
|
|
@ -169,10 +145,7 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
});
|
|
|
|
|
widget.onSelect(isNull ? null : newValue);
|
|
|
|
|
},
|
|
|
|
|
items: ((X == NullableLoadingProvider)
|
|
|
|
|
? widget.staticData
|
|
|
|
|
: provider.items)
|
|
|
|
|
?.map<DropdownMenuItem<T>>((value) {
|
|
|
|
|
items: ((X == NullableLoadingProvider) ? widget.staticData : provider.items)?.map<DropdownMenuItem<T>>((value) {
|
|
|
|
|
return DropdownMenuItem<T>(
|
|
|
|
|
value: value,
|
|
|
|
|
child: Text(
|
|
|
|
|
@ -181,31 +154,29 @@ class _SingleItemDropDownMenuState<T extends Base,
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
})?.toList(),
|
|
|
|
|
).onPress(widget.showAsBottomSheet ? () async{
|
|
|
|
|
|
|
|
|
|
T _selectedT = (await showModalBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
isScrollControlled: true,
|
|
|
|
|
shape: const RoundedRectangleBorder(
|
|
|
|
|
borderRadius: BorderRadius.vertical(
|
|
|
|
|
top: Radius.circular(20),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
|
|
|
|
builder: (BuildContext context) => SelectionBottomSheet(
|
|
|
|
|
items: ((X == NullableLoadingProvider)
|
|
|
|
|
? widget.staticData
|
|
|
|
|
: provider.items),
|
|
|
|
|
selectedItem: _selectedItem,
|
|
|
|
|
title: widget.title,
|
|
|
|
|
builderString: (emp) => emp?.name ?? "",
|
|
|
|
|
),
|
|
|
|
|
)) as T;
|
|
|
|
|
if(_selectedT !=null) {
|
|
|
|
|
widget.onSelect(_selectedT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} : null),
|
|
|
|
|
).onPress(widget.showAsBottomSheet
|
|
|
|
|
? () async {
|
|
|
|
|
T _selectedT = (await showModalBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
isScrollControlled: true,
|
|
|
|
|
shape: const RoundedRectangleBorder(
|
|
|
|
|
borderRadius: BorderRadius.vertical(
|
|
|
|
|
top: Radius.circular(20),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
clipBehavior: Clip.antiAliasWithSaveLayer,
|
|
|
|
|
builder: (BuildContext context) => SelectionBottomSheet(
|
|
|
|
|
items: ((X == NullableLoadingProvider) ? widget.staticData : provider.items),
|
|
|
|
|
selectedItem: _selectedItem,
|
|
|
|
|
title: widget.title,
|
|
|
|
|
builderString: (emp) => emp?.name ?? "",
|
|
|
|
|
),
|
|
|
|
|
)) as T;
|
|
|
|
|
if (_selectedT != null) {
|
|
|
|
|
widget.onSelect(_selectedT);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
: null),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
|