@using System.Text.RegularExpressions @namespace Oqtane.Modules.Controls @inherits ModuleControlBase @inject ISettingService SettingService @inject IStringLocalizer Localizer
@if (AllowRichText) { @if (_richfilemanager) {
}
@if (AllowFileManagement) { } @if (_richfilemanager) { @((MarkupString)"  ") }
@if (ToolbarContent != null) { @ToolbarContent } else { }
} @if (AllowRawHtml) { @if (_rawfilemanager) {
}
@if (AllowFileManagement) { } @if (_rawfilemanager) { @((MarkupString)"  ") }
@if (ReadOnly) { } else { }
}
@code { private bool _initialized = false; private RichTextEditorInterop interop; private FileManager _fileManager; private string _activetab = "Rich"; private ElementReference _editorElement; private ElementReference _toolBar; private bool _richfilemanager = false; private string _richhtml = string.Empty; private string _originalrichhtml = string.Empty; private bool _rawfilemanager = false; private string _rawhtmlid = "RawHtmlEditor_" + Guid.NewGuid().ToString("N"); private string _rawhtml = string.Empty; private string _originalrawhtml = string.Empty; private string _message = string.Empty; private bool _contentchanged = false; private int _editorIndex; [Parameter] public string Content { get; set; } [Parameter] public bool ReadOnly { get; set; } = false; [Parameter] public string Placeholder { get; set; } [Parameter] public bool AllowFileManagement { get; set; } = true; [Parameter] public bool AllowRichText { get; set; } = true; [Parameter] public bool AllowRawHtml { get; set; } = true; // parameters only applicable to rich text editor [Parameter] public RenderFragment ToolbarContent { get; set; } [Parameter] public string Theme { get; set; } = "snow"; [Parameter] public string DebugLevel { get; set; } = "info"; public override List Resources => new List() { new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill.min.js", Location = ResourceLocation.Body }, new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-blot-formatter.min.js", Location = ResourceLocation.Body }, new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-interop.js", Location = ResourceLocation.Body } }; protected override void OnInitialized() { interop = new RichTextEditorInterop(JSRuntime); if (string.IsNullOrEmpty(Placeholder)) { Placeholder = Localizer["Placeholder"]; } } protected override void OnParametersSet() { _richhtml = Content; _rawhtml = Content; _originalrawhtml = _rawhtml; // preserve for comparison later _originalrichhtml = ""; if (Content != _originalrawhtml) { _contentchanged = true; // identifies when Content parameter has changed } if (!AllowRichText) { _activetab = "Raw"; } } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (AllowRichText) { if (firstRender) { await interop.CreateEditor( _editorElement, _toolBar, ReadOnly, Placeholder, Theme, DebugLevel); await interop.LoadEditorContent(_editorElement, _richhtml); // preserve a copy of the content (Quill sanitizes content so we need to retrieve it from the editor as it may have been modified) _originalrichhtml = await interop.GetHtml(_editorElement); _initialized = true; } else { if (_initialized) { if (_contentchanged) { // reload editor if Content passed to component has changed await interop.LoadEditorContent(_editorElement, _richhtml); _originalrichhtml = await interop.GetHtml(_editorElement); } else { // preserve changed content on re-render event var richhtml = await interop.GetHtml(_editorElement); if (richhtml != _richhtml) { _richhtml = richhtml; await interop.LoadEditorContent(_editorElement, _richhtml); } } } } _contentchanged = false; } } public void CloseRichFileManager() { _richfilemanager = false; _message = string.Empty; StateHasChanged(); } public void CloseRawFileManager() { _rawfilemanager = false; _message = string.Empty; StateHasChanged(); } public async Task GetHtml() { // evaluate raw html content as first priority if (_rawhtml != _originalrawhtml) { return _rawhtml; } else { var richhtml = ""; if (AllowRichText) { richhtml = await interop.GetHtml(_editorElement); } if (richhtml != _originalrichhtml && !string.IsNullOrEmpty(richhtml)) { // convert Quill's empty content to empty string if (richhtml == "


") { richhtml = string.Empty; } return richhtml; } else { // return original raw html content return _originalrawhtml; } } } public async Task InsertRichImage() { _message = string.Empty; if (_richfilemanager) { var file = _fileManager.GetFile(); if (file != null) { await interop.InsertImage(_editorElement, file.Url, ((!string.IsNullOrEmpty(file.Description)) ? file.Description : file.Name), _editorIndex); _richhtml = await interop.GetHtml(_editorElement); _richfilemanager = false; } else { _message = Localizer["Message.Require.Image"]; } } else { _editorIndex = await interop.GetCurrentCursor(_editorElement); _richfilemanager = true; } StateHasChanged(); } public async Task InsertRawImage() { _message = string.Empty; if (_rawfilemanager) { var file = _fileManager.GetFile(); if (file != null) { var interop = new Interop(JSRuntime); int pos = await interop.GetCaretPosition(_rawhtmlid); var image = "\"""; _rawhtml = _rawhtml.Substring(0, pos) + image + _rawhtml.Substring(pos); _rawfilemanager = false; } else { _message = Localizer["Message.Require.Image"]; } } else { _rawfilemanager = true; } StateHasChanged(); } }