@namespace Oqtane.Modules.Controls @inherits ModuleControlBase @inject IStringLocalizer Localizer
@if (_filemanagervisible) {
}
   @if (_filemanagervisible) { @((MarkupString)"  ") }
@if (ToolbarContent != null) { @ToolbarContent } else { }
@if (ReadOnly) { } else { }
@code { private ElementReference _editorElement; private ElementReference _toolBar; private bool _filemanagervisible = false; private FileManager _fileManager; private string _content = string.Empty; private string _original = string.Empty; private string _message = string.Empty; [Parameter] public string Content { get; set; } [Parameter] public bool ReadOnly { get; set; } = false; [Parameter] public string Placeholder { get; set; } = "Enter Your Content..."; // 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/quill1.3.6.min.js" }, new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-blot-formatter.min.js" }, new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-interop.js" } }; protected override void OnInitialized() { _content = Content; // raw HTML } protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await base.OnAfterRenderAsync(firstRender); var interop = new RichTextEditorInterop(JSRuntime); await interop.CreateEditor( _editorElement, _toolBar, ReadOnly, Placeholder, Theme, DebugLevel); await interop.LoadEditorContent(_editorElement, Content); // preserve a copy of the rich text content ( Quill sanitizes content so we need to retrieve it from the editor ) _original = await interop.GetHtml(_editorElement); } } public void CloseFileManager() { _filemanagervisible = false; _message = string.Empty; StateHasChanged(); } public async Task RefreshRichText() { var interop = new RichTextEditorInterop(JSRuntime); await interop.LoadEditorContent(_editorElement, _content); } public async Task RefreshRawHtml() { var interop = new RichTextEditorInterop(JSRuntime); _content = await interop.GetHtml(_editorElement); StateHasChanged(); } public async Task GetHtml() { // get rich text content var interop = new RichTextEditorInterop(JSRuntime); string content = await interop.GetHtml(_editorElement); if (_original != content) { // rich text content has changed - return it return content; } else { // return raw html content return _content; } } public async Task InsertImage() { _message = string.Empty; if (_filemanagervisible) { var fileid = _fileManager.GetFileId(); if (fileid != -1) { var interop = new RichTextEditorInterop(JSRuntime); await interop.InsertImage(_editorElement, ContentUrl(fileid)); _filemanagervisible = false; } else { _message = Localizer["You Must Select An Image To Insert"]; } } else { _filemanagervisible = true; } StateHasChanged(); } // other rich text editor methods which can be used by developers public async Task GetText() { var interop = new RichTextEditorInterop(JSRuntime); return await interop.GetText(_editorElement); } public async Task GetContent() { var interop = new RichTextEditorInterop(JSRuntime); return await interop.GetContent(_editorElement); } public async Task EnableEditor(bool mode) { var interop = new RichTextEditorInterop(JSRuntime); await interop.EnableEditor(_editorElement, mode); } }