TF-612 Add presentation layer for edit email rule filter
This commit is contained in:
@@ -3,6 +3,7 @@ import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/repository/manage_account_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_email_rule_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_email_rule_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_email_rule_filter_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
||||||
|
|
||||||
@@ -14,6 +15,7 @@ class EmailRulesBindings extends BaseBindings {
|
|||||||
Get.find<GetAllRulesInteractor>(),
|
Get.find<GetAllRulesInteractor>(),
|
||||||
Get.find<DeleteEmailRuleInteractor>(),
|
Get.find<DeleteEmailRuleInteractor>(),
|
||||||
Get.find<CreateNewEmailRuleFilterInteractor>(),
|
Get.find<CreateNewEmailRuleFilterInteractor>(),
|
||||||
|
Get.find<EditEmailRuleFilterInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +30,7 @@ class EmailRulesBindings extends BaseBindings {
|
|||||||
Get.lazyPut(() => GetAllRulesInteractor(Get.find<ManageAccountRepository>()));
|
Get.lazyPut(() => GetAllRulesInteractor(Get.find<ManageAccountRepository>()));
|
||||||
Get.lazyPut(() => DeleteEmailRuleInteractor(Get.find<ManageAccountRepository>()));
|
Get.lazyPut(() => DeleteEmailRuleInteractor(Get.find<ManageAccountRepository>()));
|
||||||
Get.lazyPut(() => CreateNewEmailRuleFilterInteractor(Get.find<ManageAccountRepository>()));
|
Get.lazyPut(() => CreateNewEmailRuleFilterInteractor(Get.find<ManageAccountRepository>()));
|
||||||
|
Get.lazyPut(() => EditEmailRuleFilterInteractor(Get.find<ManageAccountRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -1,21 +1,28 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
import 'package:core/presentation/resources/image_paths.dart';
|
import 'package:core/presentation/resources/image_paths.dart';
|
||||||
|
import 'package:core/presentation/utils/app_toast.dart';
|
||||||
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/data/extensions/list_tmail_rule_extensions.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/delete_email_rule_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/delete_email_rule_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_email_rule_filter_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_email_rule_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_email_rule_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_email_rule_filter_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/state/edit_email_rule_filter_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_rules_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_email_rule_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_email_rule_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_email_rule_filter_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_email_rule_filter_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_rules_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/email_rule_bottom_sheet_action_tile_builder.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/email_rule_bottom_sheet_action_tile_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/manage_account_dashboard_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
|
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/rules_filter_creator_arguments.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
@@ -26,16 +33,19 @@ class EmailRulesController extends BaseController {
|
|||||||
final GetAllRulesInteractor _getAllRulesInteractor;
|
final GetAllRulesInteractor _getAllRulesInteractor;
|
||||||
final DeleteEmailRuleInteractor _deleteEmailRuleInteractor;
|
final DeleteEmailRuleInteractor _deleteEmailRuleInteractor;
|
||||||
final CreateNewEmailRuleFilterInteractor _createNewEmailRuleFilterInteractor;
|
final CreateNewEmailRuleFilterInteractor _createNewEmailRuleFilterInteractor;
|
||||||
|
final EditEmailRuleFilterInteractor _editEmailRuleFilterInteractor;
|
||||||
|
|
||||||
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
|
final _accountDashBoardController = Get.find<ManageAccountDashBoardController>();
|
||||||
final _imagePaths = Get.find<ImagePaths>();
|
final _imagePaths = Get.find<ImagePaths>();
|
||||||
|
final _appToast = Get.find<AppToast>();
|
||||||
|
|
||||||
final listEmailRule = <TMailRule>[].obs;
|
final listEmailRule = <TMailRule>[].obs;
|
||||||
|
|
||||||
EmailRulesController(
|
EmailRulesController(
|
||||||
this._getAllRulesInteractor,
|
this._getAllRulesInteractor,
|
||||||
this._deleteEmailRuleInteractor,
|
this._deleteEmailRuleInteractor,
|
||||||
this._createNewEmailRuleFilterInteractor
|
this._createNewEmailRuleFilterInteractor,
|
||||||
|
this._editEmailRuleFilterInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -52,6 +62,8 @@ class EmailRulesController extends BaseController {
|
|||||||
}
|
}
|
||||||
} else if (success is CreateNewRuleFilterSuccess) {
|
} else if (success is CreateNewRuleFilterSuccess) {
|
||||||
_createNewRuleFilterSuccess(success);
|
_createNewRuleFilterSuccess(success);
|
||||||
|
} else if (success is EditEmailRuleFilterSuccess) {
|
||||||
|
_editEmailRuleFilterSuccess(success);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -94,13 +106,57 @@ class EmailRulesController extends BaseController {
|
|||||||
|
|
||||||
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
|
void _createNewRuleFilterSuccess(CreateNewRuleFilterSuccess success) {
|
||||||
if (success.newListRules.isNotEmpty == true) {
|
if (success.newListRules.isNotEmpty == true) {
|
||||||
listEmailRule.clear();
|
if (currentOverlayContext != null && currentContext != null) {
|
||||||
listEmailRule.addAll(success.newListRules);
|
_appToast.showToastWithIcon(
|
||||||
|
currentOverlayContext!,
|
||||||
|
message: AppLocalizations.of(currentContext!).newFilterWasCreated,
|
||||||
|
icon: _imagePaths.icSelected);
|
||||||
|
}
|
||||||
|
log('EmailRulesController::_createNewRuleFilterSuccess(): ${success.newListRules}');
|
||||||
|
listEmailRule.value = success.newListRules;
|
||||||
|
listEmailRule.refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void editEmailRule(TMailRule rule) {
|
void editEmailRule(TMailRule rule) async {
|
||||||
//TODO: editEmailRule
|
final accountId = _accountDashBoardController.accountId.value;
|
||||||
|
if (accountId != null) {
|
||||||
|
final emailRuleFilterChanged = await push(
|
||||||
|
AppRoutes.RULES_FILTER_CREATOR,
|
||||||
|
arguments: RulesFilterCreatorArguments(
|
||||||
|
accountId,
|
||||||
|
actionType: CreatorActionType.edit,
|
||||||
|
tMailRule: rule));
|
||||||
|
|
||||||
|
if (emailRuleFilterChanged is TMailRule) {
|
||||||
|
final newListRuleWithIds = listEmailRule.withIds;
|
||||||
|
_editEmailRuleFilterAction(
|
||||||
|
accountId,
|
||||||
|
EditEmailRuleFilterRequest(newListRuleWithIds, emailRuleFilterChanged)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _editEmailRuleFilterAction(
|
||||||
|
AccountId accountId,
|
||||||
|
EditEmailRuleFilterRequest ruleFilterRequest
|
||||||
|
) {
|
||||||
|
consumeState(_editEmailRuleFilterInteractor.execute(accountId, ruleFilterRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _editEmailRuleFilterSuccess(EditEmailRuleFilterSuccess success) {
|
||||||
|
if (success.listRulesUpdated.isNotEmpty == true) {
|
||||||
|
if (currentOverlayContext != null && currentContext != null) {
|
||||||
|
_appToast.showToastWithIcon(
|
||||||
|
currentOverlayContext!,
|
||||||
|
message: AppLocalizations.of(currentContext!).yourFilterHasBeenUpdated,
|
||||||
|
icon: _imagePaths.icSelected);
|
||||||
|
}
|
||||||
|
log('EmailRulesController::_editEmailRuleFilterSuccess(): ${success.listRulesUpdated}');
|
||||||
|
listEmailRule.value = success.listRulesUpdated;
|
||||||
|
listEmailRule.refresh();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void deleteEmailRule(TMailRule emailRule) {
|
void deleteEmailRule(TMailRule emailRule) {
|
||||||
@@ -144,13 +200,16 @@ class EmailRulesController extends BaseController {
|
|||||||
|
|
||||||
Widget _editEmailRuleActionTile(BuildContext context, TMailRule rule) {
|
Widget _editEmailRuleActionTile(BuildContext context, TMailRule rule) {
|
||||||
return (EmailRuleBottomSheetActionTileBuilder(
|
return (EmailRuleBottomSheetActionTileBuilder(
|
||||||
const Key('edit_emailRule_action'),
|
const Key('edit_emailRule_action'),
|
||||||
SvgPicture.asset(_imagePaths.icEdit),
|
SvgPicture.asset(_imagePaths.icEdit),
|
||||||
AppLocalizations.of(context).editRule,
|
AppLocalizations.of(context).editRule,
|
||||||
rule,
|
rule,
|
||||||
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
|
iconLeftPadding: const EdgeInsets.only(left: 12, right: 16),
|
||||||
iconRightPadding: const EdgeInsets.only(right: 12),
|
iconRightPadding: const EdgeInsets.only(right: 12))
|
||||||
)..onActionClick((rule) => editEmailRule(rule)))
|
..onActionClick((rule) {
|
||||||
.build();
|
editEmailRule(rule);
|
||||||
|
popBack();
|
||||||
|
}))
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -37,9 +37,7 @@ class EmailRulesView extends GetWidget<EmailRulesController> with AppLoaderMixin
|
|||||||
EmailRulesHeaderWidget(
|
EmailRulesHeaderWidget(
|
||||||
imagePaths: _imagePaths,
|
imagePaths: _imagePaths,
|
||||||
responsiveUtils: _responsiveUtils,
|
responsiveUtils: _responsiveUtils,
|
||||||
createRule: () {
|
createRule: () => controller.goToCreateNewRule(),
|
||||||
//TODO: createRule
|
|
||||||
},
|
|
||||||
),
|
),
|
||||||
const SizedBox(height: 22),
|
const SizedBox(height: 22),
|
||||||
_buildLoadingView(),
|
_buildLoadingView(),
|
||||||
|
|||||||
+7
-6
@@ -5,17 +5,18 @@ import 'package:get/get.dart';
|
|||||||
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
||||||
|
|
||||||
class EmailRulesItemWidget extends GetWidget<EmailRulesController> {
|
class EmailRulesItemWidget extends StatelessWidget {
|
||||||
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
final _responsiveUtils = Get.find<ResponsiveUtils>();
|
||||||
final _imagePaths = Get.find<ImagePaths>();
|
final _imagePaths = Get.find<ImagePaths>();
|
||||||
|
final _emailRuleController = Get.find<EmailRulesController>();
|
||||||
|
|
||||||
|
final TMailRule rule;
|
||||||
|
|
||||||
EmailRulesItemWidget({
|
EmailRulesItemWidget({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.rule,
|
required this.rule,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
final TMailRule rule;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
@@ -40,7 +41,7 @@ class EmailRulesItemWidget extends GetWidget<EmailRulesController> {
|
|||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
controller.editEmailRule(rule);
|
_emailRuleController.editEmailRule(rule);
|
||||||
}),
|
}),
|
||||||
if (!_responsiveUtils.isMobile(context))
|
if (!_responsiveUtils.isMobile(context))
|
||||||
buildIconWeb(
|
buildIconWeb(
|
||||||
@@ -49,7 +50,7 @@ class EmailRulesItemWidget extends GetWidget<EmailRulesController> {
|
|||||||
fit: BoxFit.fill,
|
fit: BoxFit.fill,
|
||||||
),
|
),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
controller.deleteEmailRule(rule);
|
_emailRuleController.deleteEmailRule(rule);
|
||||||
}),
|
}),
|
||||||
if (_responsiveUtils.isMobile(context))
|
if (_responsiveUtils.isMobile(context))
|
||||||
buildIconWeb(
|
buildIconWeb(
|
||||||
@@ -59,7 +60,7 @@ class EmailRulesItemWidget extends GetWidget<EmailRulesController> {
|
|||||||
),
|
),
|
||||||
iconPadding: const EdgeInsets.all(0),
|
iconPadding: const EdgeInsets.all(0),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
controller.openEditRuleMenuAction(context, rule);
|
_emailRuleController.openEditRuleMenuAction(context, rule);
|
||||||
}),
|
}),
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|||||||
+3
-5
@@ -3,11 +3,9 @@ import 'package:core/presentation/resources/image_paths.dart';
|
|||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||||
import 'package:core/presentation/views/button/button_builder.dart';
|
import 'package:core/presentation/views/button/button_builder.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
class EmailRulesHeaderWidget extends GetWidget<EmailRulesController> {
|
class EmailRulesHeaderWidget extends StatelessWidget {
|
||||||
const EmailRulesHeaderWidget({
|
const EmailRulesHeaderWidget({
|
||||||
Key? key,
|
Key? key,
|
||||||
required this.createRule,
|
required this.createRule,
|
||||||
@@ -63,7 +61,7 @@ class EmailRulesHeaderWidget extends GetWidget<EmailRulesController> {
|
|||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
))
|
))
|
||||||
..onPressActionClick(() => controller.goToCreateNewRule())
|
..onPressActionClick(() => createRule.call())
|
||||||
..text(
|
..text(
|
||||||
AppLocalizations.of(context).addNewRule,
|
AppLocalizations.of(context).addNewRule,
|
||||||
isVertical: false,
|
isVertical: false,
|
||||||
@@ -85,7 +83,7 @@ class EmailRulesHeaderWidget extends GetWidget<EmailRulesController> {
|
|||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontWeight: FontWeight.w500,
|
fontWeight: FontWeight.w500,
|
||||||
))
|
))
|
||||||
..onPressActionClick(() => controller.goToCreateNewRule())
|
..onPressActionClick(() => createRule.call())
|
||||||
..text(
|
..text(
|
||||||
AppLocalizations.of(context).addNewRule,
|
AppLocalizations.of(context).addNewRule,
|
||||||
isVertical: false,
|
isVertical: false,
|
||||||
|
|||||||
+17
-12
@@ -1,6 +1,9 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.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:get/get.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:rule_filter/rule_filter/rule_id.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/email_rules_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/email_rules/widgets/email_rule_item_widget.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
@@ -36,22 +39,24 @@ class ListEmailRulesWidget extends GetWidget<EmailRulesController> {
|
|||||||
thickness: 0.2,
|
thickness: 0.2,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Obx(
|
child: Obx(() {
|
||||||
() => ListView.separated(
|
log('ListEmailRulesWidget::build(): ${controller.listEmailRule}');
|
||||||
|
return ListView.separated(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
itemCount: controller.listEmailRule.length,
|
itemCount: controller.listEmailRule.length,
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final rule = controller.listEmailRule[index];
|
final ruleWithId = controller.listEmailRule[index]
|
||||||
return EmailRulesItemWidget(rule: rule);
|
.copyWith(id: RuleId(id: Id(index.toString())));
|
||||||
|
log('ListEmailRulesWidget::build(): $ruleWithId');
|
||||||
|
return EmailRulesItemWidget(rule: ruleWithId);
|
||||||
},
|
},
|
||||||
separatorBuilder: (BuildContext context, int index) =>
|
separatorBuilder: (context, index) => const Divider(
|
||||||
const Divider(
|
color: AppColor.lineItemListColor,
|
||||||
color: AppColor.lineItemListColor,
|
height: 1,
|
||||||
height: 1,
|
thickness: 0.2,
|
||||||
thickness: 0.2,
|
),
|
||||||
),
|
);
|
||||||
),
|
}),
|
||||||
),
|
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4,19 +4,24 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
enum CreatorActionType {
|
enum CreatorActionType {
|
||||||
create;
|
create,
|
||||||
|
edit;
|
||||||
|
|
||||||
String getTitle(BuildContext context) {
|
String getTitle(BuildContext context) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case CreatorActionType.create:
|
case CreatorActionType.create:
|
||||||
return AppLocalizations.of(context).createNewRule.inCaps;
|
return AppLocalizations.of(context).createNewRule.inCaps;
|
||||||
|
case CreatorActionType.edit:
|
||||||
|
return AppLocalizations.of(context).editRule.inCaps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getActionName(BuildContext context) {
|
String getActionName(BuildContext context) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case CreatorActionType.create:
|
case CreatorActionType.create:
|
||||||
return AppLocalizations.of(context).create.inCaps;
|
return AppLocalizations.of(context).create;
|
||||||
|
case CreatorActionType.edit:
|
||||||
|
return AppLocalizations.of(context).save;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
-2
@@ -1,16 +1,19 @@
|
|||||||
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
||||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart';
|
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/creator_action_type.dart';
|
||||||
|
|
||||||
class RulesFilterCreatorArguments with EquatableMixin {
|
class RulesFilterCreatorArguments with EquatableMixin {
|
||||||
final AccountId accountId;
|
final AccountId accountId;
|
||||||
final CreatorActionType actionType;
|
final CreatorActionType actionType;
|
||||||
|
final TMailRule? tMailRule;
|
||||||
|
|
||||||
RulesFilterCreatorArguments(this.accountId, {
|
RulesFilterCreatorArguments(this.accountId, {
|
||||||
this.actionType = CreatorActionType.create
|
this.actionType = CreatorActionType.create,
|
||||||
|
this.tMailRule
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [accountId, actionType];
|
List<Object?> get props => [accountId, actionType, tMailRule];
|
||||||
}
|
}
|
||||||
@@ -1,36 +1,75 @@
|
|||||||
|
import 'package:core/data/model/source_type/data_source_type.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
import 'package:tmail_ui_user/features/base/base_bindings.dart';
|
||||||
|
import 'package:tmail_ui_user/features/caching/state_cache_client.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/mailbox_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/local/mailbox_cache_manager.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.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_creator/domain/usecases/verify_name_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart';
|
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart';
|
||||||
|
|
||||||
class RulesFilterCreatorBindings extends BaseBindings {
|
class RulesFilterCreatorBindings extends BaseBindings {
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dependencies() {
|
||||||
|
_bindingsUtils();
|
||||||
|
super.dependencies();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _bindingsUtils() {
|
||||||
|
Get.lazyPut(() => TreeBuilder());
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsController() {
|
void bindingsController() {
|
||||||
Get.lazyPut(() => RulesFilterCreatorController(
|
Get.lazyPut(() => RulesFilterCreatorController(
|
||||||
Get.find<VerifyNameInteractor>()
|
Get.find<VerifyNameInteractor>(),
|
||||||
|
Get.find<GetAllMailboxInteractor>(),
|
||||||
|
Get.find<TreeBuilder>()
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsDataSource() {
|
void bindingsDataSource() {
|
||||||
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
|
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsDataSourceImpl() {
|
void bindingsDataSourceImpl() {
|
||||||
|
Get.lazyPut(() => MailboxDataSourceImpl(Get.find<MailboxAPI>(), Get.find<MailboxIsolateWorker>()));
|
||||||
|
Get.lazyPut(() => MailboxCacheDataSourceImpl(Get.find<MailboxCacheManager>()));
|
||||||
|
Get.lazyPut(() => StateDataSourceImpl(Get.find<StateCacheClient>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsInteractor() {
|
void bindingsInteractor() {
|
||||||
Get.lazyPut(() => VerifyNameInteractor());
|
Get.lazyPut(() => VerifyNameInteractor());
|
||||||
|
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsRepository() {
|
void bindingsRepository() {
|
||||||
|
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsRepositoryImpl() {
|
void bindingsRepositoryImpl() {
|
||||||
|
Get.lazyPut(() => MailboxRepositoryImpl(
|
||||||
|
{
|
||||||
|
DataSourceType.network: Get.find<MailboxDataSource>(),
|
||||||
|
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||||
|
},
|
||||||
|
Get.find<StateDataSource>(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+72
-7
@@ -1,5 +1,8 @@
|
|||||||
|
|
||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
@@ -8,8 +11,10 @@ import 'package:rule_filter/rule_filter/rule_action.dart';
|
|||||||
import 'package:rule_filter/rule_filter/rule_append_in.dart';
|
import 'package:rule_filter/rule_filter/rule_append_in.dart';
|
||||||
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
|
import 'package:rule_filter/rule_filter/rule_condition.dart' as rule_condition;
|
||||||
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
import 'package:rule_filter/rule_filter/tmail_rule.dart';
|
||||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
import 'package:tmail_ui_user/features/base/base_mailbox_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.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_actions.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/empty_name_validator.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||||
@@ -21,9 +26,10 @@ import 'package:tmail_ui_user/features/rules_filter_creator/presentation/model/r
|
|||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
|
|
||||||
class RulesFilterCreatorController extends BaseController {
|
class RulesFilterCreatorController extends BaseMailboxController {
|
||||||
|
|
||||||
final VerifyNameInteractor _verifyNameInteractor;
|
final VerifyNameInteractor _verifyNameInteractor;
|
||||||
|
final GetAllMailboxInteractor _getAllMailboxInteractor;
|
||||||
|
|
||||||
final actionType = CreatorActionType.create.obs;
|
final actionType = CreatorActionType.create.obs;
|
||||||
final errorRuleName = Rxn<String>();
|
final errorRuleName = Rxn<String>();
|
||||||
@@ -40,8 +46,13 @@ class RulesFilterCreatorController extends BaseController {
|
|||||||
AccountId? _accountId;
|
AccountId? _accountId;
|
||||||
String? _newRuleName;
|
String? _newRuleName;
|
||||||
String? _newConditionValue;
|
String? _newConditionValue;
|
||||||
|
TMailRule? _currentTMailRule;
|
||||||
|
|
||||||
RulesFilterCreatorController(this._verifyNameInteractor);
|
RulesFilterCreatorController(
|
||||||
|
this._verifyNameInteractor,
|
||||||
|
this._getAllMailboxInteractor,
|
||||||
|
treeBuilder
|
||||||
|
) : super(treeBuilder);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
@@ -60,6 +71,24 @@ class RulesFilterCreatorController extends BaseController {
|
|||||||
@override
|
@override
|
||||||
void onDone() {}
|
void onDone() {}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onData(Either<Failure, Success> newState) {
|
||||||
|
super.onData(newState);
|
||||||
|
newState.fold(
|
||||||
|
(failure) {
|
||||||
|
if (failure is GetAllMailboxFailure) {
|
||||||
|
_updateStateCreatorButton();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(success) async {
|
||||||
|
if (success is GetAllMailboxSuccess) {
|
||||||
|
await buildTree(success.mailboxList);
|
||||||
|
_setUpMailboxSelected();
|
||||||
|
_updateStateCreatorButton();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onError(error) {}
|
void onError(error) {}
|
||||||
|
|
||||||
@@ -68,19 +97,54 @@ class RulesFilterCreatorController extends BaseController {
|
|||||||
if (arguments is RulesFilterCreatorArguments) {
|
if (arguments is RulesFilterCreatorArguments) {
|
||||||
_accountId = arguments.accountId;
|
_accountId = arguments.accountId;
|
||||||
actionType.value = arguments.actionType;
|
actionType.value = arguments.actionType;
|
||||||
|
_currentTMailRule = arguments.tMailRule;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setUpDefaultValueRuleFilter() {
|
void _setUpDefaultValueRuleFilter() {
|
||||||
if (actionType.value == CreatorActionType.create) {
|
switch(actionType.value) {
|
||||||
ruleConditionFieldSelected.value = rule_condition.Field.from;
|
case CreatorActionType.create:
|
||||||
ruleConditionComparatorSelected.value = rule_condition.Comparator.exactlyEquals;
|
ruleConditionFieldSelected.value = rule_condition.Field.from;
|
||||||
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
|
ruleConditionComparatorSelected.value = rule_condition.Comparator.contains;
|
||||||
|
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
|
||||||
|
break;
|
||||||
|
case CreatorActionType.edit:
|
||||||
|
if (_currentTMailRule != null) {
|
||||||
|
ruleConditionFieldSelected.value = _currentTMailRule!.condition.field;
|
||||||
|
ruleConditionComparatorSelected.value = _currentTMailRule!.condition.comparator;
|
||||||
|
emailRuleFilterActionSelected.value = EmailRuleFilterAction.moveMessage;
|
||||||
|
_newConditionValue = _currentTMailRule!.condition.value;
|
||||||
|
_setValueInputField(inputConditionValueController, _newConditionValue ?? '');
|
||||||
|
_newRuleName = _currentTMailRule!.name;
|
||||||
|
_setValueInputField(inputRuleNameController, _newRuleName ?? '');
|
||||||
|
_getAllMailboxAction();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_updateStateCreatorButton();
|
_updateStateCreatorButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _setValueInputField(TextEditingController controller, String value) {
|
||||||
|
controller.value = controller.value.copyWith(
|
||||||
|
text: value,
|
||||||
|
selection: TextSelection.collapsed(offset: value.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _setUpMailboxSelected() {
|
||||||
|
if (_currentTMailRule != null) {
|
||||||
|
final mailboxIdOfRule = _currentTMailRule!.action.appendIn.mailboxIds.first;
|
||||||
|
final mailboxNode = findMailboxNodeById(mailboxIdOfRule);
|
||||||
|
mailboxSelected.value = mailboxNode?.item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _getAllMailboxAction() {
|
||||||
|
if (_accountId != null) {
|
||||||
|
consumeState(_getAllMailboxInteractor.execute(_accountId!));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void updateRuleName(BuildContext context, String? value) {
|
void updateRuleName(BuildContext context, String? value) {
|
||||||
_newRuleName = value;
|
_newRuleName = value;
|
||||||
errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName);
|
errorRuleName.value = _getErrorStringByInputValue(context, _newRuleName);
|
||||||
@@ -161,6 +225,7 @@ class RulesFilterCreatorController extends BaseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final newTMailRule = TMailRule(
|
final newTMailRule = TMailRule(
|
||||||
|
id: _currentTMailRule?.id,
|
||||||
name: _newRuleName!,
|
name: _newRuleName!,
|
||||||
action: RuleAction(
|
action: RuleAction(
|
||||||
appendIn: RuleAppendIn(
|
appendIn: RuleAppendIn(
|
||||||
|
|||||||
@@ -415,8 +415,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
|
|||||||
height: 44,
|
height: 44,
|
||||||
backgroundColor: AppColor.colorTextButton
|
backgroundColor: AppColor.colorTextButton
|
||||||
.withOpacity(controller.isCreateRuleFilterValid.value
|
.withOpacity(controller.isCreateRuleFilterValid.value
|
||||||
? 1.0
|
? 1.0
|
||||||
: 0.4),
|
: 0.4),
|
||||||
radius: 10,
|
radius: 10,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (controller.isCreateRuleFilterValid.value) {
|
if (controller.isCreateRuleFilterValid.value) {
|
||||||
@@ -599,8 +599,8 @@ class RuleFilterCreatorView extends GetWidget<RulesFilterCreatorController> {
|
|||||||
height: 44,
|
height: 44,
|
||||||
backgroundColor: AppColor.colorTextButton
|
backgroundColor: AppColor.colorTextButton
|
||||||
.withOpacity(controller.isCreateRuleFilterValid.value
|
.withOpacity(controller.isCreateRuleFilterValid.value
|
||||||
? 1.0
|
? 1.0
|
||||||
: 0.4),
|
: 0.4),
|
||||||
radius: 10,
|
radius: 10,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (controller.isCreateRuleFilterValid.value) {
|
if (controller.isCreateRuleFilterValid.value) {
|
||||||
|
|||||||
-2
@@ -11,14 +11,12 @@ class RulesFilterInputField extends StatelessWidget {
|
|||||||
final String? errorText;
|
final String? errorText;
|
||||||
final String? hintText;
|
final String? hintText;
|
||||||
final TextEditingController? editingController;
|
final TextEditingController? editingController;
|
||||||
final bool isMandatory;
|
|
||||||
final OnChangeFilterInputAction? onChangeAction;
|
final OnChangeFilterInputAction? onChangeAction;
|
||||||
|
|
||||||
const RulesFilterInputField({
|
const RulesFilterInputField({
|
||||||
Key? key,
|
Key? key,
|
||||||
this.hintText,
|
this.hintText,
|
||||||
this.errorText,
|
this.errorText,
|
||||||
this.isMandatory = false,
|
|
||||||
this.editingController,
|
this.editingController,
|
||||||
this.onChangeAction
|
this.onChangeAction
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2022-08-11T11:23:27.430951",
|
"@@last_modified": "2022-08-12T09:07:20.482325",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -1879,5 +1879,17 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"newFilterWasCreated": "New filter was created",
|
||||||
|
"@newFilterWasCreated": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"yourFilterHasBeenUpdated": "Your filter has been updated",
|
||||||
|
"@yourFilterHasBeenUpdated": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1933,4 +1933,16 @@ class AppLocalizations {
|
|||||||
name: 'ruleFilterAddressCcField',
|
name: 'ruleFilterAddressCcField',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get newFilterWasCreated {
|
||||||
|
return Intl.message(
|
||||||
|
'New filter was created',
|
||||||
|
name: 'newFilterWasCreated');
|
||||||
|
}
|
||||||
|
|
||||||
|
String get yourFilterHasBeenUpdated {
|
||||||
|
return Intl.message(
|
||||||
|
'Your filter has been updated',
|
||||||
|
name: 'yourFilterHasBeenUpdated');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user