TF-682 Update padding advanced search form on landscape tablet

This commit is contained in:
dab246
2022-07-04 11:50:48 +07:00
committed by Dat H. Pham
parent 93177d042d
commit be625472c6
10 changed files with 124 additions and 68 deletions
@@ -124,4 +124,12 @@ class ResponsiveUtils {
return isLandscapeTablet(context) || isDesktop(context); return isLandscapeTablet(context) || isDesktop(context);
} }
} }
bool landscapeTabletSupported(BuildContext context) {
if (BuildUtils.isWeb) {
return isTabletLarge(context);
} else {
return isLandscapeTablet(context);
}
}
} }
@@ -94,7 +94,6 @@ class AdvancedFilterController extends GetxController {
} }
if(lastTextForm.isNotEmpty && !searchController.searchEmailFilter.value.from.contains(lastTextForm.value)){ if(lastTextForm.isNotEmpty && !searchController.searchEmailFilter.value.from.contains(lastTextForm.value)){
print(lastTextForm);
searchController.updateFilterEmail( searchController.updateFilterEmail(
from: searchController.searchEmailFilter.value.from..add(lastTextForm.value), from: searchController.searchEmailFilter.value.from..add(lastTextForm.value),
); );
@@ -108,7 +107,6 @@ class AdvancedFilterController extends GetxController {
); );
lastTextTo.value = ''; lastTextTo.value = '';
} }
searchController.updateFilterEmail( searchController.updateFilterEmail(
@@ -281,7 +281,6 @@ class MailboxDashBoardController extends ReloadableController {
bool get isDrawerOpen => scaffoldKey.currentState?.isDrawerOpen == true; bool get isDrawerOpen => scaffoldKey.currentState?.isDrawerOpen == true;
bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE; bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
void searchEmail(BuildContext context, String value) { void searchEmail(BuildContext context, String value) {
@@ -436,7 +436,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
widthFactor: 1, widthFactor: 1,
), ),
), ),
portalFollower:const AdvancedSearchFilterOverlay(), portalFollower: const AdvancedSearchFilterOverlay(),
child: QuickSearchInputForm<PresentationEmail, RecentSearch>( child: QuickSearchInputForm<PresentationEmail, RecentSearch>(
textFieldConfiguration: QuickSearchTextFieldConfiguration( textFieldConfiguration: QuickSearchTextFieldConfiguration(
controller: searchController.searchInputController, controller: searchController.searchInputController,
@@ -121,7 +121,8 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
}) { }) {
final child = [ final child = [
SizedBox( SizedBox(
width: _responsiveUtils.isMobile(context) ? null : 112, width: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? null : 112,
child: Text( child: Text(
advancedSearchFilterField.getTitle(context), advancedSearchFilterField.getTitle(context),
style: const TextStyle( style: const TextStyle(
@@ -131,27 +132,39 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
), ),
), ),
const Padding(padding: EdgeInsets.all(4)), const Padding(padding: EdgeInsets.all(4)),
_responsiveUtils.isMobile(context) if (_responsiveUtils.isMobile(context))
? _buildTextField( _buildTextField(
isSelectFormList: isSelectFormList, isSelectFormList: isSelectFormList,
onTap: onTap, onTap: onTap,
context: context, context: context,
advancedSearchFilterField: advancedSearchFilterField, advancedSearchFilterField: advancedSearchFilterField,
textEditingController: textEditingController, textEditingController: textEditingController,
) )
: Expanded( else if (_responsiveUtils.landscapeTabletSupported(context))
child: _buildTextFieldFilterForWeb( if (advancedSearchFilterField == AdvancedSearchFilterField.date)
isSelectFormList: isSelectFormList, const DateDropDownButton()
onTap: onTap, else
context: context, _buildTextField(
advancedSearchFilterField: advancedSearchFilterField, isSelectFormList: isSelectFormList,
textEditingController: textEditingController, onTap: onTap,
), context: context,
) advancedSearchFilterField: advancedSearchFilterField,
textEditingController: textEditingController,
)
else
Expanded(
child: _buildTextFieldFilterForWeb(
isSelectFormList: isSelectFormList,
onTap: onTap,
context: context,
advancedSearchFilterField: advancedSearchFilterField,
textEditingController: textEditingController,
),
)
]; ];
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.symmetric(vertical: 8),
child: _responsiveUtils.isMobile(context) child: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? Column( ? Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -191,7 +204,8 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
}) { }) {
final child = [ final child = [
SizedBox( SizedBox(
width: _responsiveUtils.isMobile(context) ? null : 112, width: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? null : 112,
child: Text( child: Text(
advancedSearchFilterField.getTitle(context), advancedSearchFilterField.getTitle(context),
style: const TextStyle( style: const TextStyle(
@@ -201,7 +215,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
), ),
), ),
const Padding(padding: EdgeInsets.all(4)), const Padding(padding: EdgeInsets.all(4)),
_responsiveUtils.isMobile(context) _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? TextFieldAutoCompleteEmailAddress( ? TextFieldAutoCompleteEmailAddress(
optionsBuilder: (word) async { optionsBuilder: (word) async {
return controller.getAutoCompleteSuggestion(word: word); return controller.getAutoCompleteSuggestion(word: word);
@@ -274,7 +288,7 @@ class AdvancedSearchInputForm extends GetWidget<AdvancedFilterController>
]; ];
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 8), padding: const EdgeInsets.symmetric(vertical: 8),
child: _responsiveUtils.isMobile(context) child: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? Column( ? Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
@@ -16,24 +16,25 @@ class AdvancedSearchFilterFormBottomView
final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>(); final ResponsiveUtils _responsiveUtils = Get.find<ResponsiveUtils>();
return Padding( return Padding(
padding: padding: EdgeInsets.only(
EdgeInsets.only(top: _responsiveUtils.isMobile(context) ? 8 : 20), top: _responsiveUtils.isMobile(context) ||
_responsiveUtils.landscapeTabletSupported(context) ? 8 : 20),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
if (_responsiveUtils.isMobile(context)) if (_responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context))
_buildCheckboxHasAttachment(context), ...[
_buildCheckboxHasAttachment(context),
const SizedBox(height: 24)
],
Row( Row(
mainAxisAlignment: _responsiveUtils.isMobile(context) mainAxisAlignment: _responsiveUtils.isMobile(context) || _responsiveUtils.landscapeTabletSupported(context)
? MainAxisAlignment.spaceEvenly ? MainAxisAlignment.spaceEvenly
: MainAxisAlignment.end, : MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: [ children: [
if (!_responsiveUtils.isMobile(context))...[ if (!_responsiveUtils.isMobile(context) && !_responsiveUtils.landscapeTabletSupported(context))
_buildCheckboxHasAttachment(context), Expanded(child: _buildCheckboxHasAttachment(context)),
const Spacer(),
],
..._buildListButton(context, _responsiveUtils), ..._buildListButton(context, _responsiveUtils),
], ],
), ),
@@ -44,7 +45,7 @@ class AdvancedSearchFilterFormBottomView
List<Widget> _buildListButton( List<Widget> _buildListButton(
BuildContext context, ResponsiveUtils responsiveUtils) { BuildContext context, ResponsiveUtils responsiveUtils) {
if (responsiveUtils.isMobile(context)) { if (responsiveUtils.isMobile(context) || responsiveUtils.landscapeTabletSupported(context)) {
return [ return [
Expanded( Expanded(
child: _buildButton( child: _buildButton(
@@ -130,16 +131,14 @@ class AdvancedSearchFilterFormBottomView
}) { }) {
return InkWell( return InkWell(
onTap: onAction, onTap: onAction,
onTapDown: (_) {
onAction.call();
},
child: Container( child: Container(
height: 44, height: 44,
padding: EdgeInsets.symmetric( padding: EdgeInsets.symmetric(
horizontal: responsiveUtils.isMobile(context) ? 0 : 26), horizontal: responsiveUtils.isMobile(context) || responsiveUtils.landscapeTabletSupported(context)
? 0 : 26),
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: maxWidth: responsiveUtils.isMobile(context) || responsiveUtils.landscapeTabletSupported(context)
responsiveUtils.isMobile(context) ? double.infinity : 144), ? double.infinity : 144),
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(10), color: colorButton), borderRadius: BorderRadius.circular(10), color: colorButton),
@@ -1,22 +1,30 @@
import 'package:core/presentation/extensions/color_extension.dart'; import 'package:core/presentation/extensions/color_extension.dart';
import 'package:core/presentation/utils/responsive_utils.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/widgets/advanced_search/advanced_search_filter_form.dart';
class AdvancedSearchFilterOverlay extends StatelessWidget { class AdvancedSearchFilterOverlay extends StatelessWidget {
const AdvancedSearchFilterOverlay({Key? key}) : super(key: key); const AdvancedSearchFilterOverlay({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final responsiveUtils = Get.find<ResponsiveUtils>();
return Padding( return Padding(
padding: const EdgeInsets.only(top: 8), padding: const EdgeInsets.only(top: 8, bottom: 16),
child: Container( child: Container(
constraints: const BoxConstraints( constraints: BoxConstraints(
minWidth: 660, minWidth: 660,
maxHeight: 568, maxHeight: _getHeightOverlay(context, responsiveUtils),
), ),
width: 660, width: 660,
height: MediaQuery.of(context).size.height, height: _getHeightOverlay(context, responsiveUtils),
padding: const EdgeInsets.all(32), padding: responsiveUtils.landscapeTabletSupported(context)
? EdgeInsets.zero
: const EdgeInsets.all(24),
decoration: BoxDecoration( decoration: BoxDecoration(
color: Colors.white, color: Colors.white,
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
@@ -29,11 +37,31 @@ class AdvancedSearchFilterOverlay extends StatelessWidget {
]), ]),
child: SingleChildScrollView( child: SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 28, vertical: 12), padding: EdgeInsets.symmetric(
horizontal: responsiveUtils.landscapeTabletSupported(context)
? 16 : 28,
vertical: responsiveUtils.landscapeTabletSupported(context)
? 16 : 12),
child: AdvancedSearchInputForm(), child: AdvancedSearchInputForm(),
), ),
), ),
), ),
); );
} }
double _getHeightOverlay(BuildContext context, ResponsiveUtils responsiveUtils) {
const double maxHeightTopBar = 160;
const double maxHeightOverlay = 568;
final currentHeight = responsiveUtils.getSizeScreenHeight(context);
double maxHeightForm = maxHeightOverlay;
if (currentHeight < maxHeightOverlay) {
maxHeightForm = currentHeight > maxHeightTopBar
? currentHeight - maxHeightTopBar
: currentHeight;
}
log('AdvancedSearchFilterOverlay::_getHeightOverlay(): maxHeightForm: $maxHeightForm');
return maxHeightForm;
}
} }
@@ -21,21 +21,25 @@ class IconOpenAdvancedSearchWidget extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Obx( return Obx(
() => buildIconWeb( () => Padding(
minSize: 0, padding: const EdgeInsets.only(right: 8),
iconPadding: const EdgeInsets.only(right: 8), child: buildIconWeb(
icon: SvgPicture.asset(_imagePaths.icFilterAdvanced, splashRadius: 15,
color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.isAdvancedSearchHasApply.isTrue minSize: 40,
? AppColor.colorFilterMessageEnabled iconPadding: const EdgeInsets.only(right: 2),
: AppColor.colorFilterMessageDisabled, icon: SvgPicture.asset(_imagePaths.icFilterAdvanced,
width: 16, color: searchController.isAdvancedSearchViewOpen.isTrue || searchController.isAdvancedSearchHasApply.isTrue
height: 16), ? AppColor.colorFilterMessageEnabled
onTap: () { : AppColor.colorFilterMessageDisabled,
if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.isAdvancedSearchHasApply.isFalse){ width: 16,
advancedFilterController.initSearchFilterField(context); height: 16),
} onTap: () {
searchController.showAdvancedFilterView(_parentContext); if(searchController.isAdvancedSearchViewOpen.isFalse && searchController.isAdvancedSearchHasApply.isFalse){
}), advancedFilterController.initSearchFilterField(context);
}
searchController.showAdvancedFilterView(_parentContext);
}),
),
); );
} }
} }
@@ -802,6 +802,9 @@ class ThreadController extends BaseController {
bool isSearchActive() => searchController.isSearchActive(); bool isSearchActive() => searchController.isSearchActive();
bool get isAllSearchInActive => !searchController.isSearchActive() &&
searchController.isAdvancedSearchViewOpen.isFalse;
void enableSearch(BuildContext context) { void enableSearch(BuildContext context) {
searchController.enableSearch(); searchController.enableSearch();
} }
@@ -401,9 +401,12 @@ class ThreadView extends GetWidget<ThreadController> with AppLoaderMixin,
} }
Widget _buildFloatingButtonCompose(BuildContext context) { Widget _buildFloatingButtonCompose(BuildContext context) {
if (_responsiveUtils.isWebDesktop(context)) {
return const SizedBox.shrink();
}
return Obx(() { return Obx(() {
if (!controller.isSearchActive() if (controller.isAllSearchInActive) {
&& (!BuildUtils.isWeb || (BuildUtils.isWeb && !_responsiveUtils.isDesktop(context)))) {
return Container( return Container(
padding: BuildUtils.isWeb padding: BuildUtils.isWeb
? EdgeInsets.zero ? EdgeInsets.zero