TF-682 Update padding advanced search form on landscape tablet
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
-1
@@ -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,
|
||||||
|
|||||||
+36
-22
@@ -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,
|
||||||
|
|||||||
+18
-19
@@ -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),
|
||||||
|
|||||||
+34
-6
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+19
-15
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user