TF-1512 Display signature content correct in identity creator
This commit is contained in:
@@ -1,9 +1,7 @@
|
|||||||
|
|
||||||
import 'package:core/utils/app_logger.dart';
|
import 'package:core/utils/app_logger.dart';
|
||||||
import 'package:core/utils/build_utils.dart';
|
import 'package:core/utils/build_utils.dart';
|
||||||
import 'package:enough_html_editor/enough_html_editor.dart';
|
|
||||||
import 'package:flutter/cupertino.dart';
|
import 'package:flutter/cupertino.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'package:get/get_core/get_core.dart';
|
import 'package:get/get_core/get_core.dart';
|
||||||
import 'package:get/get_instance/get_instance.dart';
|
import 'package:get/get_instance/get_instance.dart';
|
||||||
import 'package:get/get_rx/get_rx.dart';
|
import 'package:get/get_rx/get_rx.dart';
|
||||||
@@ -19,7 +17,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:rich_text_composer/richtext_controller.dart';
|
import 'package:rich_text_composer/richtext_controller.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/composer/presentation/controller/rich_text_mobile_tablet_controller.dart';
|
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.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_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
|
import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart';
|
||||||
@@ -32,6 +29,7 @@ import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_id
|
|||||||
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
|
||||||
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
@@ -63,7 +61,6 @@ class IdentityCreatorController extends BaseController {
|
|||||||
|
|
||||||
late RichTextController keyboardRichTextController;
|
late RichTextController keyboardRichTextController;
|
||||||
late RichTextWebController richTextWebController;
|
late RichTextWebController richTextWebController;
|
||||||
late RichTextMobileTabletController richTextMobileTabletController;
|
|
||||||
late HtmlEditorController signatureHtmlEditorController;
|
late HtmlEditorController signatureHtmlEditorController;
|
||||||
TextEditingController? inputNameIdentityController;
|
TextEditingController? inputNameIdentityController;
|
||||||
TextEditingController? inputBccIdentityController;
|
TextEditingController? inputBccIdentityController;
|
||||||
@@ -78,9 +75,10 @@ class IdentityCreatorController extends BaseController {
|
|||||||
IdentityCreatorArguments? arguments;
|
IdentityCreatorArguments? arguments;
|
||||||
OnCreatedIdentityCallback? onCreatedIdentityCallback;
|
OnCreatedIdentityCallback? onCreatedIdentityCallback;
|
||||||
VoidCallback? onDismissIdentityCreator;
|
VoidCallback? onDismissIdentityCreator;
|
||||||
ScrollController? scrollController;
|
|
||||||
|
|
||||||
|
final ScrollController scrollController = ScrollController();
|
||||||
final GlobalKey htmlKey = GlobalKey();
|
final GlobalKey htmlKey = GlobalKey();
|
||||||
|
final htmlEditorMinHeight = 160;
|
||||||
|
|
||||||
void updateNameIdentity(BuildContext context, String? value) {
|
void updateNameIdentity(BuildContext context, String? value) {
|
||||||
_nameIdentity = value;
|
_nameIdentity = value;
|
||||||
@@ -89,9 +87,13 @@ class IdentityCreatorController extends BaseController {
|
|||||||
|
|
||||||
void updateContentHtmlEditor(String? text) => _contentHtmlEditor = text;
|
void updateContentHtmlEditor(String? text) => _contentHtmlEditor = text;
|
||||||
|
|
||||||
HtmlEditorApi? get signatureHtmlEditorMobileController => richTextMobileTabletController.htmlEditorApi;
|
String? get contentHtmlEditor {
|
||||||
|
if (_contentHtmlEditor != null) {
|
||||||
String? get contentHtmlEditor => _contentHtmlEditor ?? arguments?.identity?.htmlSignature?.value;
|
return _contentHtmlEditor;
|
||||||
|
} else {
|
||||||
|
return arguments?.identity?.signatureAsString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IdentityCreatorController(
|
IdentityCreatorController(
|
||||||
this._verifyNameInteractor,
|
this._verifyNameInteractor,
|
||||||
@@ -104,13 +106,10 @@ class IdentityCreatorController extends BaseController {
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
keyboardRichTextController = RichTextController();
|
keyboardRichTextController = RichTextController();
|
||||||
richTextWebController = RichTextWebController();
|
richTextWebController = RichTextWebController();
|
||||||
richTextMobileTabletController = RichTextMobileTabletController();
|
signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true);
|
||||||
signatureHtmlEditorController =
|
|
||||||
HtmlEditorController(processNewLineAsBr: true);
|
|
||||||
inputNameIdentityController = TextEditingController();
|
inputNameIdentityController = TextEditingController();
|
||||||
inputBccIdentityController = TextEditingController();
|
inputBccIdentityController = TextEditingController();
|
||||||
inputNameIdentityFocusNode = FocusNode();
|
inputNameIdentityFocusNode = FocusNode();
|
||||||
scrollController = ScrollController();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -291,7 +290,7 @@ class IdentityCreatorController extends BaseController {
|
|||||||
if (BuildUtils.isWeb) {
|
if (BuildUtils.isWeb) {
|
||||||
return signatureHtmlEditorController.getText();
|
return signatureHtmlEditorController.getText();
|
||||||
} else {
|
} else {
|
||||||
return signatureHtmlEditorMobileController?.getText();
|
return keyboardRichTextController.htmlEditorApi?.getText();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,11 +422,9 @@ class IdentityCreatorController extends BaseController {
|
|||||||
|
|
||||||
void clearFocusEditor(BuildContext context) {
|
void clearFocusEditor(BuildContext context) {
|
||||||
if (!BuildUtils.isWeb) {
|
if (!BuildUtils.isWeb) {
|
||||||
signatureHtmlEditorMobileController?.unfocus();
|
keyboardRichTextController.htmlEditorApi?.unfocus();
|
||||||
richTextMobileTabletController.htmlEditorApi?.unfocus();
|
|
||||||
keyboardRichTextController.hideRichTextView();
|
|
||||||
}
|
}
|
||||||
SystemChannels.textInput.invokeMethod('TextInput.hide');
|
FocusScope.of(context).unfocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeView(BuildContext context) {
|
void closeView(BuildContext context) {
|
||||||
@@ -447,28 +444,29 @@ class IdentityCreatorController extends BaseController {
|
|||||||
inputNameIdentityController = null;
|
inputNameIdentityController = null;
|
||||||
inputBccIdentityController?.dispose();
|
inputBccIdentityController?.dispose();
|
||||||
inputBccIdentityController = null;
|
inputBccIdentityController = null;
|
||||||
scrollController?.dispose();
|
scrollController.dispose();
|
||||||
scrollController = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void onFocusHTMLEditor() async {
|
void onFocusHTMLEditorOnMobile() async {
|
||||||
await Scrollable.ensureVisible(htmlKey.currentContext!);
|
if (htmlKey.currentContext != null) {
|
||||||
|
await Scrollable.ensureVisible(htmlKey.currentContext!);
|
||||||
|
}
|
||||||
await Future.delayed(const Duration(milliseconds: 500), () {
|
await Future.delayed(const Duration(milliseconds: 500), () {
|
||||||
if (scrollController != null) {
|
final offset = scrollController.position.pixels +
|
||||||
scrollController!.animateTo(
|
defaultKeyboardToolbarHeight +
|
||||||
scrollController!.position.pixels + defaultKeyboardToolbarHeight,
|
htmlEditorMinHeight;
|
||||||
duration: const Duration(milliseconds: 1),
|
scrollController.animateTo(
|
||||||
curve: Curves.linear,
|
offset,
|
||||||
);
|
duration: const Duration(milliseconds: 1),
|
||||||
}
|
curve: Curves.linear,
|
||||||
|
);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void onEnterKeyDown() {
|
void onEnterKeyDownOnMobile() {
|
||||||
if(scrollController != null &&
|
if(scrollController.position.pixels < scrollController.position.maxScrollExtent) {
|
||||||
scrollController!.position.pixels < scrollController!.position.maxScrollExtent) {
|
scrollController.animateTo(
|
||||||
scrollController!.animateTo(
|
scrollController.position.pixels + 20,
|
||||||
scrollController!.position.pixels + 20,
|
|
||||||
duration: const Duration(milliseconds: 1),
|
duration: const Duration(milliseconds: 1),
|
||||||
curve: Curves.linear,
|
curve: Curves.linear,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
|||||||
onTap: () => controller.clearFocusEditor(context),
|
onTap: () => controller.clearFocusEditor(context),
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: MediaQuery.of(context).size.height * 0.95,
|
height: MediaQuery.of(context).size.height * 0.95,
|
||||||
child: SafeArea(
|
child: BuildUtils.isWeb
|
||||||
child: BuildUtils.isWeb ? Scaffold(body: _buildBodyMobile(context)) : _buildBodyMobile(context),
|
? Scaffold(body: _buildBodyMobile(context))
|
||||||
),
|
: _buildBodyMobile(context)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
landscapeMobile: Scaffold(
|
landscapeMobile: Scaffold(
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
@@ -164,7 +164,7 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
|||||||
physics: const ClampingScrollPhysics(),
|
physics: const ClampingScrollPhysics(),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(24.0),
|
padding: const EdgeInsets.all(24.0),
|
||||||
child: Column(children: [
|
child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
|
||||||
Obx(() => (IdentityInputFieldBuilder(
|
Obx(() => (IdentityInputFieldBuilder(
|
||||||
AppLocalizations.of(context).name,
|
AppLocalizations.of(context).name,
|
||||||
controller.errorNameIdentity.value,
|
controller.errorNameIdentity.value,
|
||||||
@@ -237,9 +237,8 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
|||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
PointerInterceptor(
|
PointerInterceptor(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 300,
|
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.circular(10),
|
borderRadius: BorderRadius.circular(12),
|
||||||
border: Border.all(color: AppColor.colorInputBorderCreateMailbox),
|
border: Border.all(color: AppColor.colorInputBorderCreateMailbox),
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
@@ -361,84 +360,78 @@ class IdentityCreatorView extends GetWidget<IdentityCreatorController> {
|
|||||||
? _buildHtmlEditorWeb(context, controller.contentHtmlEditor ?? '')
|
? _buildHtmlEditorWeb(context, controller.contentHtmlEditor ?? '')
|
||||||
: _buildHtmlEditor(context, initialContent: controller.contentHtmlEditor ?? '');
|
: _buildHtmlEditor(context, initialContent: controller.contentHtmlEditor ?? '');
|
||||||
|
|
||||||
return SizedBox(
|
return Column(
|
||||||
height: 300,
|
children: [
|
||||||
child: Column(
|
if(BuildUtils.isWeb)
|
||||||
children: [
|
ToolbarRichTextWebBuilder(
|
||||||
if(BuildUtils.isWeb)
|
richTextWebController: controller.richTextWebController,
|
||||||
ToolbarRichTextWebBuilder(
|
padding: const EdgeInsets.only(top: 22, bottom: 8.0, left: 24, right: 12)),
|
||||||
richTextWebController: controller.richTextWebController,
|
htmlEditor,
|
||||||
padding: const EdgeInsets.only(top: 22, bottom: 8.0, left: 24, right: 12)),
|
],
|
||||||
htmlEditor,
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildHtmlEditorWeb(BuildContext context, String initContent) {
|
Widget _buildHtmlEditorWeb(BuildContext context, String initContent) {
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): initContent: $initContent');
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): initContent: $initContent');
|
||||||
return Expanded(
|
return Padding(
|
||||||
child: Padding(
|
padding: const EdgeInsets.only(left: 14.0, right: 2.0),
|
||||||
padding: const EdgeInsets.only(left: 14.0, right: 2.0),
|
child: html_editor_browser.HtmlEditor(
|
||||||
child: html_editor_browser.HtmlEditor(
|
key: const Key('identity_create_editor_web'),
|
||||||
key: const Key('identity_create_editor_web'),
|
controller: controller.richTextWebController.editorController,
|
||||||
controller: controller.richTextWebController.editorController,
|
htmlEditorOptions: const HtmlEditorOptions(
|
||||||
htmlEditorOptions: const HtmlEditorOptions(
|
hint: '',
|
||||||
hint: '',
|
darkMode: false,
|
||||||
darkMode: false,
|
customBodyCssStyle: bodyCssStyleForEditor),
|
||||||
customBodyCssStyle: bodyCssStyleForEditor),
|
blockQuotedContent: initContent,
|
||||||
blockQuotedContent: initContent,
|
htmlToolbarOptions: const HtmlToolbarOptions(
|
||||||
htmlToolbarOptions: const HtmlToolbarOptions(
|
toolbarType: ToolbarType.hide,
|
||||||
toolbarType: ToolbarType.hide,
|
defaultToolbarButtons: []),
|
||||||
defaultToolbarButtons: []),
|
otherOptions: const OtherOptions(height: 150),
|
||||||
otherOptions: const OtherOptions(height: 550),
|
callbacks: Callbacks(onBeforeCommand: (currentHtml) {
|
||||||
callbacks: Callbacks(onBeforeCommand: (currentHtml) {
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): onBeforeCommand : $currentHtml');
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): onBeforeCommand : $currentHtml');
|
controller.updateContentHtmlEditor(currentHtml);
|
||||||
controller.updateContentHtmlEditor(currentHtml);
|
}, onChangeContent: (changed) {
|
||||||
}, onChangeContent: (changed) {
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeContent : $changed');
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeContent : $changed');
|
controller.updateContentHtmlEditor(changed);
|
||||||
controller.updateContentHtmlEditor(changed);
|
}, onInit: () {
|
||||||
}, onInit: () {
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit');
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): onInit');
|
controller.updateContentHtmlEditor(initContent);
|
||||||
controller.updateContentHtmlEditor(initContent);
|
controller.richTextWebController.setFullScreenEditor();
|
||||||
controller.richTextWebController.setFullScreenEditor();
|
controller.richTextWebController.setEnableCodeView();
|
||||||
controller.richTextWebController.setEnableCodeView();
|
}, onFocus: () {
|
||||||
}, onFocus: () {
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus');
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): onFocus');
|
FocusManager.instance.primaryFocus?.unfocus();
|
||||||
FocusManager.instance.primaryFocus?.unfocus();
|
Future.delayed(const Duration(milliseconds: 500), () {
|
||||||
Future.delayed(const Duration(milliseconds: 500), () {
|
controller.richTextWebController.editorController.setFocus();
|
||||||
controller.richTextWebController.editorController.setFocus();
|
});
|
||||||
});
|
controller.richTextWebController.closeAllMenuPopup();
|
||||||
controller.richTextWebController.closeAllMenuPopup();
|
}, onChangeSelection: (settings) {
|
||||||
}, onChangeSelection: (settings) {
|
controller.richTextWebController.onEditorSettingsChange(settings);
|
||||||
controller.richTextWebController.onEditorSettingsChange(settings);
|
}, onChangeCodeview: (contentChanged) {
|
||||||
}, onChangeCodeview: (contentChanged) {
|
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeCodeView : $contentChanged');
|
||||||
log('IdentityCreatorView::_buildHtmlEditorWeb(): onChangeCodeView : $contentChanged');
|
controller.updateContentHtmlEditor(contentChanged);
|
||||||
controller.updateContentHtmlEditor(contentChanged);
|
}),
|
||||||
}),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildHtmlEditor(BuildContext context, {String? initialContent}) {
|
Widget _buildHtmlEditor(BuildContext context, {String? initialContent}) {
|
||||||
final richTextMobileTabletController = controller.richTextMobileTabletController;
|
return Padding(
|
||||||
return Focus(
|
padding: const EdgeInsets.all(16),
|
||||||
focusNode: controller.htmlEditorNode,
|
|
||||||
child: html_editor_mobile.HtmlEditor(
|
child: html_editor_mobile.HtmlEditor(
|
||||||
key: const Key('identity_create_editor'),
|
key: controller.htmlKey,
|
||||||
minHeight: 111,
|
minHeight: controller.htmlEditorMinHeight,
|
||||||
addDefaultSelectionMenuItems: false,
|
addDefaultSelectionMenuItems: false,
|
||||||
initialContent: initialContent ?? '',
|
initialContent: initialContent ?? '',
|
||||||
onCreated: (editorApi) {
|
onCreated: (editorApi) {
|
||||||
richTextMobileTabletController.htmlEditorApi = editorApi;
|
controller.keyboardRichTextController.onCreateHTMLEditor(
|
||||||
controller.keyboardRichTextController.onCreateHTMLEditor(
|
editorApi,
|
||||||
editorApi,
|
onEnterKeyDown: controller.onEnterKeyDownOnMobile,
|
||||||
onEnterKeyDown: controller.onEnterKeyDown,
|
onFocus: controller.onFocusHTMLEditorOnMobile,
|
||||||
context: context,
|
context: context
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user