TF-831: create email_forward_creator view
This commit is contained in:
@@ -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
|
||||
@@ -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<AutoCompleteDataSource> _dataSources = {};
|
||||
|
||||
@override
|
||||
void bindingsController() {
|
||||
Get.lazyPut(() => EmailsForwardCreatorController(
|
||||
Get.find<GetAutoCompleteWithDeviceContactInteractor>(),
|
||||
Get.find<GetAutoCompleteInteractor>(),
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {
|
||||
Get.lazyPut<ContactDataSource>(() => Get.find<ContactDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
_dataSources.clear();
|
||||
Get.lazyPut(() => ContactDataSourceImpl());
|
||||
Get.lazyPut(() => TMailContactDataSourceImpl(Get.find<ContactAPI>()));
|
||||
_dataSources.add(Get.find<TMailContactDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(() => GetDeviceContactSuggestionsInteractor(Get.find<ContactRepository>()));
|
||||
Get.lazyPut(() => GetAutoCompleteInteractor(Get.find<AutoCompleteRepository>()));
|
||||
Get.lazyPut(() => GetAutoCompleteWithDeviceContactInteractor(
|
||||
Get.find<GetAutoCompleteInteractor>(),
|
||||
Get.find<GetDeviceContactSuggestionsInteractor>()
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {
|
||||
Get.lazyPut<ContactRepository>(() => Get.find<ContactRepositoryImpl>());
|
||||
Get.lazyPut<AutoCompleteRepository>(() => Get.find<AutoCompleteRepositoryImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.lazyPut(() => ContactRepositoryImpl(Get.find<ContactDataSource>()));
|
||||
Get.lazyPut(() => AutoCompleteRepositoryImpl(_dataSources));
|
||||
}
|
||||
}
|
||||
+23
-5
@@ -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 = <String>[].obs;
|
||||
final listEmailForwards = <EmailAddress>[].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<List<EmailAddress>> getAutoCompleteSuggestion(
|
||||
{required String word}) async {
|
||||
log('ComposerController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource');
|
||||
log('EmailsForwardCreatorController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource');
|
||||
|
||||
if(_session?.hasSupportAutoComplete != true) return <EmailAddress>[];
|
||||
|
||||
_getAutoCompleteWithDeviceContactInteractor = Get.find<GetAutoCompleteWithDeviceContactInteractor>();
|
||||
_getAutoCompleteInteractor = Get.find<GetAutoCompleteInteractor>();
|
||||
@@ -75,7 +81,13 @@ class RulesFilterCreatorController extends BaseController {
|
||||
(success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[]));
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
@@ -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<EmailsForwardCreatorController> {
|
||||
|
||||
final _imagePaths = Get.find<ImagePaths>();
|
||||
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<VerifyNameInteractor>(),
|
||||
Get.find<GetAllMailboxInteractor>(),
|
||||
Get.find<TreeBuilder>()
|
||||
));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSource() {
|
||||
Get.lazyPut<AutoCompleteDataSource>(() => Get.find<TMailContactDataSourceImpl>());
|
||||
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsDataSourceImpl() {
|
||||
Get.lazyPut(() => TMailContactDataSourceImpl(Get.find<ContactAPI>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsInteractor() {
|
||||
Get.lazyPut(() => VerifyNameInteractor());
|
||||
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepository() {
|
||||
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
||||
}
|
||||
|
||||
@override
|
||||
void bindingsRepositoryImpl() {
|
||||
Get.lazyPut(() => MailboxRepositoryImpl(
|
||||
{
|
||||
DataSourceType.network: Get.find<MailboxDataSource>(),
|
||||
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||
},
|
||||
Get.find<StateDataSource>(),
|
||||
));
|
||||
}
|
||||
}
|
||||
+4
-3
@@ -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<Object?> get props => [accountId];
|
||||
List<Object?> get props => [accountId, session];
|
||||
}
|
||||
+43
@@ -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<ResponsiveUtils>();
|
||||
final _imagePaths = Get.find<ImagePaths>();
|
||||
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),
|
||||
]),
|
||||
);
|
||||
}
|
||||
}
|
||||
+37
@@ -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);
|
||||
}
|
||||
}
|
||||
+91
@@ -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<EmailAddress>(
|
||||
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,
|
||||
)
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -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<EmailAddress>) {
|
||||
_addEmailsForward(listEmail);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _addEmailsForward(List<EmailAddress> listEmailAddress) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -2140,4 +2140,11 @@ class AppLocalizations {
|
||||
name: 'addEmailForward',
|
||||
);
|
||||
}
|
||||
|
||||
String get emailForwardLabel {
|
||||
return Intl.message(
|
||||
'Name or Email address',
|
||||
name: 'emailForwardLabel',
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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()),
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user