diff --git a/env.file b/env.file index 71638e979..f915cbf58 100644 --- a/env.file +++ b/env.file @@ -1,3 +1,3 @@ -SERVER_URL=http://localhost +SERVER_URL=https://gateway.upn.integration-open-paas.org DOMAIN_REDIRECT_URL=http://localhost:3000 WEB_OIDC_CLIENT_ID=teammail-web \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/emails_forward_creator_binding.dart b/lib/features/mails_forward_creator/presentation/emails_forward_creator_binding.dart new file mode 100644 index 000000000..b9bdf7ca2 --- /dev/null +++ b/lib/features/mails_forward_creator/presentation/emails_forward_creator_binding.dart @@ -0,0 +1,63 @@ +import 'package:contact/data/datasource/auto_complete_datasource.dart'; +import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; +import 'package:contact/data/network/contact_api.dart'; +import 'package:get/get.dart'; +import 'package:tmail_ui_user/features/base/base_bindings.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource/contact_datasource.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource_impl/contact_datasource_impl.dart'; +import 'package:tmail_ui_user/features/composer/data/repository/auto_complete_repository_impl.dart'; +import 'package:tmail_ui_user/features/composer/data/repository/contact_repository_impl.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart'; + +class EmailsForwardCreatorBindings extends BaseBindings { + + final Set _dataSources = {}; + + @override + void bindingsController() { + Get.lazyPut(() => EmailsForwardCreatorController( + Get.find(), + Get.find(), + )); + } + + @override + void bindingsDataSource() { + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsDataSourceImpl() { + _dataSources.clear(); + Get.lazyPut(() => ContactDataSourceImpl()); + Get.lazyPut(() => TMailContactDataSourceImpl(Get.find())); + _dataSources.add(Get.find()); + } + + @override + void bindingsInteractor() { + Get.lazyPut(() => GetDeviceContactSuggestionsInteractor(Get.find())); + Get.lazyPut(() => GetAutoCompleteInteractor(Get.find())); + Get.lazyPut(() => GetAutoCompleteWithDeviceContactInteractor( + Get.find(), + Get.find() + )); + } + + @override + void bindingsRepository() { + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => Get.find()); + } + + @override + void bindingsRepositoryImpl() { + Get.lazyPut(() => ContactRepositoryImpl(Get.find())); + Get.lazyPut(() => AutoCompleteRepositoryImpl(_dataSources)); + } +} \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/mails_forward_creator_controller.dart b/lib/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart similarity index 75% rename from lib/features/mails_forward_creator/presentation/mails_forward_creator_controller.dart rename to lib/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart index 8bb37a69c..8de801c2a 100644 --- a/lib/features/mails_forward_creator/presentation/mails_forward_creator_controller.dart +++ b/lib/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart @@ -3,6 +3,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:flutter/cupertino.dart'; import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; @@ -12,19 +13,21 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart'; import 'package:tmail_ui_user/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/session_extension.dart'; -class RulesFilterCreatorController extends BaseController { +class EmailsForwardCreatorController extends BaseController { final inputEmailForwardController = TextEditingController(); final ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact; late AccountId _accountId; + late Session? _session; late GetAutoCompleteWithDeviceContactInteractor _getAutoCompleteWithDeviceContactInteractor; late GetAutoCompleteInteractor _getAutoCompleteInteractor; - final listEmailForwards = [].obs; + final listEmailForwards = [].obs; - RulesFilterCreatorController( + EmailsForwardCreatorController( this._getAutoCompleteWithDeviceContactInteractor, this._getAutoCompleteInteractor, ); @@ -51,12 +54,15 @@ class RulesFilterCreatorController extends BaseController { final arguments = Get.arguments; if (arguments is MailsForwardCreatorArguments) { _accountId = arguments.accountId; + _session = arguments.session; } } Future> getAutoCompleteSuggestion( {required String word}) async { - log('ComposerController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource'); + log('EmailsForwardCreatorController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource'); + + if(_session?.hasSupportAutoComplete != true) return []; _getAutoCompleteWithDeviceContactInteractor = Get.find(); _getAutoCompleteInteractor = Get.find(); @@ -75,7 +81,13 @@ class RulesFilterCreatorController extends BaseController { (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); } - void _clearAll() { + void addToListEmailForwards(EmailAddress emailAddress) { + if(emailAddress.email !=null && emailAddress.email!.isNotEmpty) { + listEmailForwards.add(emailAddress); + } + } + + void clearAll() { inputEmailForwardController.clear(); } @@ -83,4 +95,10 @@ class RulesFilterCreatorController extends BaseController { FocusScope.of(context).unfocus(); popBack(); } + + void addEmailForwards(BuildContext context) { + inputEmailForwardController.clear(); + FocusScope.of(context).unfocus(); + popBack(result: listEmailForwards.toList()); + } } \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/emails_forward_creator_view.dart b/lib/features/mails_forward_creator/presentation/emails_forward_creator_view.dart new file mode 100644 index 000000000..52bd41f83 --- /dev/null +++ b/lib/features/mails_forward_creator/presentation/emails_forward_creator_view.dart @@ -0,0 +1,313 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:model/model.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/email_forward_creator_item_widget.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/emails_forward_input_with_drop_list_field_builder.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +class EmailsForwardCreatorView extends GetWidget { + + final _imagePaths = Get.find(); + final _responsiveUtils = Get.find(); + + EmailsForwardCreatorView({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ResponsiveWidget( + responsiveUtils: _responsiveUtils, + mobile: Scaffold( + backgroundColor: Colors.black38, + body: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: SafeArea( + child: Align( + alignment: Alignment.bottomCenter, + child: Card( + color: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + )), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + )), + width: double.infinity, + height: _responsiveUtils.getSizeScreenHeight(context) - 70, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16)), + child: _buildRulesFilterFormOnMobile(context) + ) + ) + ) + ), + ), + ) + ), + tablet: Scaffold( + backgroundColor: Colors.black38, + body: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Align(alignment: Alignment.bottomCenter, child: Card( + color: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + )), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + )), + width: double.infinity, + height: _responsiveUtils.getSizeScreenHeight(context) * 0.7, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16)), + child: _buildRulesFilterFormOnTablet(context) + ) + ) + )), + ) + ), + desktop: Scaffold( + backgroundColor: Colors.black38, + body: GestureDetector( + onTap: () => FocusScope.of(context).unfocus(), + child: Align(alignment: Alignment.center, child: Card( + color: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(16))), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(16))), + width: _responsiveUtils.getSizeScreenWidth(context) * 0.6, + height: _responsiveUtils.getSizeScreenHeight(context) * 0.7, + child: ClipRRect( + borderRadius: const BorderRadius.all(Radius.circular(16)), + child: _buildRulesFilterFormOnDesktop(context) + ) + ) + ) + ), + ) + ) + ); + } + + Widget _buildRulesFilterFormOnDesktop(BuildContext context) { + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Align( + alignment: Alignment.centerRight, + child: buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icCloseMailbox, + fit: BoxFit.fill), + tooltip: AppLocalizations.of(context).close, + onTap: () => controller.closeView(context)), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: (EmailsForwardInputWithDropListFieldBuilder( + AppLocalizations.of(context).emailForwardLabel, + controller.inputEmailForwardController) + ..addOnSelectedSuggestionAction((newEmailAddress) { + controller.addToListEmailForwards(newEmailAddress); + controller.clearAll(); + }) + ..addOnSummitedCallbackAction((pattern) { + if (pattern != null && pattern.trim().isNotEmpty) { + controller.addToListEmailForwards(EmailAddress(null, pattern.trim())); + controller.clearAll(); + } + }) + ..addOnSuggestionCallbackAction((pattern) { + if (pattern != null) { + controller.getAutoCompleteSuggestion(word: pattern.trim()); + } + })) + .build(), + ), + Expanded( + child: Obx(() => ListView.builder( + itemCount: controller.listEmailForwards.length, + itemBuilder: (BuildContext context, int index) { + final item = controller.listEmailForwards[index]; + return EmailForwardCreatorItemWidget( + emailForward: item.emailAddress, + onDelete: () { + controller.listEmailForwards.removeAt(index); + } + ); + }, + )), + ), + ]); + } + + Widget _buildRulesFilterFormOnTablet(BuildContext context) { + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Align( + alignment: Alignment.centerRight, + child: buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icCloseMailbox, + fit: BoxFit.fill), + tooltip: AppLocalizations.of(context).close, + onTap: () => controller.closeView(context)), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: (EmailsForwardInputWithDropListFieldBuilder( + AppLocalizations.of(context).emailForwardLabel, + controller.inputEmailForwardController) + ..addOnSelectedSuggestionAction((newEmailAddress) { + controller.addToListEmailForwards(newEmailAddress); + controller.clearAll(); + }) + ..addOnSummitedCallbackAction((pattern) { + if (pattern != null && pattern.trim().isNotEmpty) { + controller.addToListEmailForwards(EmailAddress(null, pattern.trim())); + controller.clearAll(); + } + }) + ..addOnSuggestionCallbackAction((pattern) { + if (pattern != null) { + controller.getAutoCompleteSuggestion(word: pattern.trim()); + } + })) + .build(), + ), + Expanded( + child: Obx(() => ListView.builder( + itemCount: controller.listEmailForwards.length, + itemBuilder: (BuildContext context, int index) { + final item = controller.listEmailForwards[index]; + return EmailForwardCreatorItemWidget( + emailForward: item.emailAddress, + onDelete: () { + controller.listEmailForwards.removeAt(index); + } + ); + }, + )), + ), + ]); + } + + Widget _buildRulesFilterFormOnMobile(BuildContext context) { + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + Align( + alignment: Alignment.centerRight, + child: buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icCloseMailbox, + fit: BoxFit.fill), + tooltip: AppLocalizations.of(context).close, + onTap: () => controller.closeView(context)), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: (EmailsForwardInputWithDropListFieldBuilder( + AppLocalizations.of(context).emailForwardLabel, + controller.inputEmailForwardController) + ..addOnSelectedSuggestionAction((newEmailAddress) { + controller.addToListEmailForwards(newEmailAddress); + controller.clearAll(); + }) + ..addOnSummitedCallbackAction((pattern) { + if (pattern != null && pattern.trim().isNotEmpty) { + controller.addToListEmailForwards(EmailAddress(null, pattern.trim())); + controller.clearAll(); + } + }) + ..addOnSuggestionCallbackAction((pattern) { + if (pattern != null) { + controller.getAutoCompleteSuggestion(word: pattern.trim()); + } + })) + .build(), + ), + Expanded( + child: Obx(() => ListView.builder( + itemCount: controller.listEmailForwards.length, + itemBuilder: (BuildContext context, int index) { + final item = controller.listEmailForwards[index]; + return EmailForwardCreatorItemWidget( + emailForward: item.emailAddress, + onDelete: () { + controller.listEmailForwards.removeAt(index); + } + ); + }, + )), + ), + ]); + } + + Widget _buildButtonAddNewEmailsForward(BuildContext context) { + if (!_responsiveUtils.isMobile(context)) { + return (ButtonBuilder(_imagePaths.icAddEmailForward) + ..key(const Key('button_add_emails_forward_creator')) + ..decoration(BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.colorTextButton)) + ..paddingIcon(const EdgeInsets.only(right: 8)) + ..iconColor(Colors.white) + ..maxWidth(130) + ..size(20) + ..radiusSplash(10) + ..padding(const EdgeInsets.symmetric(vertical: 12)) + ..textStyle(const TextStyle( + fontSize: 17, + color: Colors.white, + fontWeight: FontWeight.w500, + )) + ..onPressActionClick(() => controller.addEmailForwards(context)) + ..text( + AppLocalizations.of(context).addEmailForward, + isVertical: false, + )) + .build(); + } else { + return (ButtonBuilder(_imagePaths.icAddEmailForward) + ..key(const Key('button_add_emails_forward_creator')) + ..decoration(BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: AppColor.colorTextButton)) + ..paddingIcon(const EdgeInsets.only(right: 8)) + ..iconColor(Colors.white) + ..size(20) + ..radiusSplash(10) + ..padding(const EdgeInsets.symmetric(vertical: 12)) + ..textStyle(const TextStyle( + fontSize: 17, + color: Colors.white, + fontWeight: FontWeight.w500, + )) + ..onPressActionClick(() => controller.addEmailForwards(context)) + ..text( + AppLocalizations.of(context).addEmailForward, + isVertical: false, + )) + .build(); + } + } + +} \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/mails_forward_creator_binding.dart b/lib/features/mails_forward_creator/presentation/mails_forward_creator_binding.dart deleted file mode 100644 index 00783459e..000000000 --- a/lib/features/mails_forward_creator/presentation/mails_forward_creator_binding.dart +++ /dev/null @@ -1,72 +0,0 @@ -import 'package:contact/data/datasource/auto_complete_datasource.dart'; -import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart'; -import 'package:contact/data/network/contact_api.dart'; -import 'package:core/data/model/source_type/data_source_type.dart'; -import 'package:get/get.dart'; -import 'package:tmail_ui_user/features/base/base_bindings.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart'; -import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/autocomplete_bindings.dart'; -import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart'; - -class MailsForwardCreatorBindings extends BaseBindings { - - @override - void dependencies() { - _bindingsUtils(); - super.dependencies(); - } - - void _bindingsUtils() { - Get.lazyPut(() => AutoCompleteBindings()); - } - - @override - void bindingsController() { - Get.lazyPut(() => RulesFilterCreatorController( - Get.find(), - Get.find(), - Get.find() - )); - } - - @override - void bindingsDataSource() { - Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); - } - - @override - void bindingsDataSourceImpl() { - Get.lazyPut(() => TMailContactDataSourceImpl(Get.find())); - } - - @override - void bindingsInteractor() { - Get.lazyPut(() => VerifyNameInteractor()); - Get.lazyPut(() => GetAllMailboxInteractor(Get.find())); - } - - @override - void bindingsRepository() { - Get.lazyPut(() => Get.find()); - } - - @override - void bindingsRepositoryImpl() { - Get.lazyPut(() => MailboxRepositoryImpl( - { - DataSourceType.network: Get.find(), - DataSourceType.local: Get.find() - }, - Get.find(), - )); - } -} \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/mails_forward_creator_view.dart b/lib/features/mails_forward_creator/presentation/mails_forward_creator_view.dart deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart b/lib/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart index bc7a2c5da..4b168d400 100644 --- a/lib/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart +++ b/lib/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart @@ -1,12 +1,13 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; class MailsForwardCreatorArguments with EquatableMixin { final AccountId accountId; - - MailsForwardCreatorArguments(this.accountId); + final Session? session; + MailsForwardCreatorArguments(this.accountId, this.session); @override - List get props => [accountId]; + List get props => [accountId, session]; } \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/widgets/email_forward_creator_item_widget.dart b/lib/features/mails_forward_creator/presentation/widgets/email_forward_creator_item_widget.dart new file mode 100644 index 000000000..5b63db02f --- /dev/null +++ b/lib/features/mails_forward_creator/presentation/widgets/email_forward_creator_item_widget.dart @@ -0,0 +1,43 @@ +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:get/get.dart'; + +class EmailForwardCreatorItemWidget extends StatelessWidget { + final _responsiveUtils = Get.find(); + final _imagePaths = Get.find(); + final VoidCallback onDelete; + final String emailForward; + + EmailForwardCreatorItemWidget({ + Key? key, + required this.emailForward, + required this.onDelete, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.only( + top: 15, + bottom: 15, + left: _responsiveUtils.isMobile(context) ? 16 : 24, + right: _responsiveUtils.isMobile(context) ? 0 : 24), + color: Colors.white, + child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [ + Text(emailForward, + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.black)), + const Spacer(), + buildIconWeb( + icon: SvgPicture.asset( + _imagePaths.icDeleteEmailAddress, + fit: BoxFit.fill, + ), + onTap: onDelete), + ]), + ); + } +} diff --git a/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_decoration_builder.dart b/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_decoration_builder.dart new file mode 100644 index 000000000..1fae8195e --- /dev/null +++ b/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_decoration_builder.dart @@ -0,0 +1,37 @@ + +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; + +class EmailsForwardInputDecorationBuilder extends InputDecorationBuilder { + + @override + InputDecoration build() { + return InputDecoration( + enabledBorder: enabledBorder ?? const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderCreateMailbox)), + focusedBorder: enabledBorder ?? const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(width: 1, color: AppColor.colorTextButton)), + errorBorder: errorBorder ?? const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderErrorVerifyName)), + focusedErrorBorder: errorBorder ?? const OutlineInputBorder( + borderRadius: BorderRadius.all(Radius.circular(10)), + borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderErrorVerifyName)), + prefixText: prefixText, + labelText: labelText, + floatingLabelBehavior: FloatingLabelBehavior.never, + labelStyle: labelStyle ?? const TextStyle(color: Colors.black, fontSize: 16), + hintText: hintText, + isDense: true, + hintStyle: hintStyle ?? const TextStyle(color: AppColor.colorHintInputCreateMailbox, fontSize: 16), + contentPadding: contentPadding ?? const EdgeInsets.symmetric(horizontal: 12, vertical: 12), + errorText: errorText, + errorStyle: errorTextStyle ?? const TextStyle(color: AppColor.colorInputBorderErrorVerifyName, fontSize: 13), + filled: true, + fillColor: errorText?.isNotEmpty == true + ? AppColor.colorInputBackgroundErrorVerifyName + : AppColor.colorInputBackgroundCreateMailbox); + } +} \ No newline at end of file diff --git a/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_with_drop_list_field_builder.dart b/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_with_drop_list_field_builder.dart new file mode 100644 index 000000000..3ef29bd99 --- /dev/null +++ b/lib/features/mails_forward_creator/presentation/widgets/emails_forward_input_with_drop_list_field_builder.dart @@ -0,0 +1,91 @@ + +import 'package:core/core.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_typeahead/flutter_typeahead.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/emails_forward_input_decoration_builder.dart'; + +typedef OnSelectedSuggestionAction = Function(EmailAddress emailAddress); +typedef OnSuggestionCallbackAction = Function(String? pattern); +typedef OnSummitedCallbackAction = Function(String? pattern); + + +class EmailsForwardInputWithDropListFieldBuilder { + + final String hintText; + final TextEditingController editingController; + + OnSelectedSuggestionAction? _onSelectedSuggestionAction; + OnSuggestionCallbackAction? _onSuggestionCallbackAction; + OnSummitedCallbackAction? _onSummitedCallbackAction; + + EmailsForwardInputWithDropListFieldBuilder( + this.hintText, + this.editingController, + ); + + void addOnSelectedSuggestionAction(OnSelectedSuggestionAction action) { + _onSelectedSuggestionAction = action; + } + + void addOnSuggestionCallbackAction(OnSuggestionCallbackAction action) { + _onSuggestionCallbackAction = action; + } + + void addOnSummitedCallbackAction(OnSummitedCallbackAction action) { + _onSummitedCallbackAction = action; + } + + Widget build() { + return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ + const SizedBox(height: 8), + TypeAheadFormField( + textFieldConfiguration: TextFieldConfiguration( + controller: editingController, + onSubmitted: (pattern) { + if (_onSummitedCallbackAction != null) { + _onSummitedCallbackAction!(pattern); + } + }, + textInputAction: TextInputAction.done, + decoration: (EmailsForwardInputDecorationBuilder() + ..setContentPadding(const EdgeInsets.symmetric( + vertical: BuildUtils.isWeb ? 16 : 12, + horizontal: 12)) + ..setHintText(hintText)) + .build() + ), + debounceDuration: const Duration(milliseconds: 500), + suggestionsCallback: (pattern) async { + if (_onSuggestionCallbackAction != null) { + return _onSuggestionCallbackAction!(pattern); + } else { + return []; + } + }, + itemBuilder: (BuildContext context, emailAddress) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), + child: Text(emailAddress.email ?? '', + style: const TextStyle( + fontSize: 14, + fontWeight: FontWeight.normal, + color: Colors.black)), + ); + }, + onSuggestionSelected: (emailSelected) { + if (_onSelectedSuggestionAction != null) { + _onSelectedSuggestionAction!(emailSelected); + } + }, + suggestionsBoxDecoration: SuggestionsBoxDecoration( + borderRadius: BorderRadius.circular(14) + ), + noItemsFoundBuilder: (context) => const SizedBox(), + hideOnEmpty: true, + hideOnError: true, + hideOnLoading: true, + ) + ]); + } +} \ No newline at end of file diff --git a/lib/features/manage_account/presentation/forward/forward_controller.dart b/lib/features/manage_account/presentation/forward/forward_controller.dart index df333fc6b..f60f9c11b 100644 --- a/lib/features/manage_account/presentation/forward/forward_controller.dart +++ b/lib/features/manage_account/presentation/forward/forward_controller.dart @@ -13,6 +13,9 @@ import 'package:pointer_interceptor/pointer_interceptor.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/delete_recipient_in_forwarding_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/delete_recipient_in_forwarding_state.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_forward_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_recipient_in_forwarding_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_forward_interactor.dart'; @@ -216,18 +219,17 @@ class ForwardController extends BaseController { void goToAddEmailsForward() async { final accountId = _accountDashBoardController.accountId.value; if (accountId != null) { - // final newEmailRuleFilter = await push( - // AppRoutes.EMAILS_FORWARD_CREATOR, - // arguments: RulesFilterCreatorArguments(accountId)); - // - // if (newEmailRuleFilter is TMailRule) { - // _createNewRuleFilterAction( - // accountId, - // CreateNewEmailRuleFilterRequest( - // listEmailRule, - // newEmailRuleFilter) - // ); - // } + final listEmail = await push( + AppRoutes.EMAILS_FORWARD_CREATOR, + arguments: MailsForwardCreatorArguments(accountId, _accountDashBoardController.sessionCurrent.value)); + + if (listEmail is List) { + _addEmailsForward(listEmail); + } } } + + void _addEmailsForward(List listEmailAddress) { + + } } \ No newline at end of file diff --git a/lib/main/localizations/app_localizations.dart b/lib/main/localizations/app_localizations.dart index 74f4af5bb..cf3fa2526 100644 --- a/lib/main/localizations/app_localizations.dart +++ b/lib/main/localizations/app_localizations.dart @@ -2140,4 +2140,11 @@ class AppLocalizations { name: 'addEmailForward', ); } + + String get emailForwardLabel { + return Intl.message( + 'Name or Email address', + name: 'emailForwardLabel', + ); + } } \ No newline at end of file diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index deb49ff69..27744beb0 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -9,6 +9,8 @@ import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart'; import 'package:tmail_ui_user/features/home/presentation/home_view.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart' deferred as identity_creator; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_binding.dart'; +import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_view.dart' deferred as emails_forward_creator; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart'; import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_view.dart' deferred as rules_filter_creator; import 'package:tmail_ui_user/features/login/presentation/login_bindings.dart'; @@ -80,5 +82,12 @@ class AppPages { rules_filter_creator.loadLibrary, () => rules_filter_creator.RuleFilterCreatorView()), binding: RulesFilterCreatorBindings()), - ]; + GetPage( + name: AppRoutes.EMAILS_FORWARD_CREATOR, + opaque: false, + page: () => DeferredWidget( + emails_forward_creator.loadLibrary, + () => emails_forward_creator.EmailsForwardCreatorView()), + binding: EmailsForwardCreatorBindings()), +]; }