TF-2591 Run js script on drop with HtmlEditor

This commit is contained in:
DatDang
2024-03-01 15:45:46 +07:00
committed by Dat H. Pham
parent 80a32559d9
commit 7abcea6320
2 changed files with 50 additions and 2 deletions
+16
View File
@@ -16,6 +16,22 @@ class HtmlUtils {
});''', });''',
name: 'lineHeight100Percent'); name: 'lineHeight100Percent');
static const registerDropListener = (
script: '''
document.querySelector(".note-editable").addEventListener(
"drop",
(event) => window.parent.postMessage(
JSON.stringify({"name": "registerDropListener"})))''',
name: 'registerDropListener');
static const unregisterDropListener = (
script: '''
console.log("unregisterDropListener");
const editor = document.querySelector(".note-editable");
const newEditor = editor.cloneNode(true);
editor.parentNode.replaceChild(newEditor, editor);''',
name: 'unregisterDropListener');
static String customCssStyleHtmlEditor({TextDirection direction = TextDirection.ltr}) { static String customCssStyleHtmlEditor({TextDirection direction = TextDirection.ltr}) {
if (PlatformInfo.isWeb) { if (PlatformInfo.isWeb) {
return ''' return '''
@@ -1,9 +1,11 @@
import 'dart:convert';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:core/utils/app_logger.dart'; import 'package:core/utils/app_logger.dart';
import 'package:core/utils/html/html_utils.dart'; import 'package:core/utils/html/html_utils.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:html_editor_enhanced/html_editor.dart'; import 'package:html_editor_enhanced/html_editor.dart';
import 'package:universal_html/html.dart' hide VoidCallback;
typedef OnChangeContentEditorAction = Function(String? text); typedef OnChangeContentEditorAction = Function(String? text);
typedef OnInitialContentEditorAction = Function(String text); typedef OnInitialContentEditorAction = Function(String text);
@@ -62,6 +64,16 @@ class _WebEditorState extends State<WebEditorWidget> {
double? dropZoneWidth; double? dropZoneWidth;
double? dropZoneHeight; double? dropZoneHeight;
final ValueNotifier<double> _htmlEditorHeight = ValueNotifier(_defaultHtmlEditorHeight); final ValueNotifier<double> _htmlEditorHeight = ValueNotifier(_defaultHtmlEditorHeight);
bool _dropListenerRegistered = false;
void _dropListener(Event event) {
if (event is MessageEvent) {
if (jsonDecode(event.data)['name'] == HtmlUtils.registerDropListener.name) {
_editorController.evaluateJavascriptWeb(
HtmlUtils.lineHeight100Percent.name);
}
}
}
@override @override
void initState() { void initState() {
@@ -76,6 +88,8 @@ class _WebEditorState extends State<WebEditorWidget> {
dropZoneWidth = widget.width! - _offsetWidth; dropZoneWidth = widget.width! - _offsetWidth;
} }
log('_WebEditorState::initState:dropZoneWidth: $dropZoneWidth | dropZoneHeight: $dropZoneHeight'); log('_WebEditorState::initState:dropZoneWidth: $dropZoneWidth | dropZoneHeight: $dropZoneHeight');
window.addEventListener("message", _dropListener);
} }
@override @override
@@ -96,6 +110,9 @@ class _WebEditorState extends State<WebEditorWidget> {
@override @override
void dispose() { void dispose() {
_htmlEditorHeight.dispose(); _htmlEditorHeight.dispose();
_editorController.evaluateJavascriptWeb(
HtmlUtils.unregisterDropListener.name);
window.removeEventListener("message", _dropListener);
super.dispose(); super.dispose();
} }
@@ -118,7 +135,15 @@ class _WebEditorState extends State<WebEditorWidget> {
WebScript( WebScript(
name: HtmlUtils.lineHeight100Percent.name, name: HtmlUtils.lineHeight100Percent.name,
script: HtmlUtils.lineHeight100Percent.script, script: HtmlUtils.lineHeight100Percent.script,
) ),
WebScript(
name: HtmlUtils.registerDropListener.name,
script: HtmlUtils.registerDropListener.script,
),
WebScript(
name: HtmlUtils.unregisterDropListener.name,
script: HtmlUtils.unregisterDropListener.script,
),
]) ])
), ),
htmlToolbarOptions: const HtmlToolbarOptions( htmlToolbarOptions: const HtmlToolbarOptions(
@@ -133,7 +158,14 @@ class _WebEditorState extends State<WebEditorWidget> {
callbacks: Callbacks( callbacks: Callbacks(
onBeforeCommand: widget.onChangeContent, onBeforeCommand: widget.onChangeContent,
onChangeContent: widget.onChangeContent, onChangeContent: widget.onChangeContent,
onInit: () => widget.onInitial?.call(widget.content), onInit: () {
widget.onInitial?.call(widget.content);
if (!_dropListenerRegistered) {
_editorController.evaluateJavascriptWeb(
HtmlUtils.registerDropListener.name);
_dropListenerRegistered = true;
}
},
onFocus: widget.onFocus, onFocus: widget.onFocus,
onBlur: widget.onUnFocus, onBlur: widget.onUnFocus,
onMouseDown: () => widget.onMouseDown?.call(context), onMouseDown: () => widget.onMouseDown?.call(context),