@using System.Text.RegularExpressions @using Microsoft.AspNetCore.Components.Rendering @using Microsoft.Extensions.DependencyInjection @namespace Oqtane.Modules.Controls @inherits ModuleControlBase @inject IServiceProvider ServiceProvider @inject ISettingService SettingService @inject IStringLocalizer Localizer
@_textEditorComponent
@code { private ITextEditorProvider _textEditorProvider; private RenderFragment _textEditorComponent; private ITextEditor _textEditor; [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; } [Parameter] public string DebugLevel { get; set; } public override List Resources { get; set; } = new List(); protected override async Task OnInitializedAsync() { _textEditorProvider = await GetTextEditorProvider(); } protected override void OnParametersSet() { _textEditorComponent = (builder) => { CreateTextEditor(builder); }; } protected override async Task OnAfterRenderAsync(bool firstRender) { if(_textEditor != null) { _textEditor.Initialize(Content); } await base.OnAfterRenderAsync(firstRender); } public async Task GetHtml() { return await _textEditor.GetContent(); } private void CreateTextEditor(RenderTreeBuilder builder) { if(_textEditorProvider != null) { var editorType = Type.GetType(_textEditorProvider.EditorType); if (editorType != null) { builder.OpenComponent(0, editorType); //set editor parameters if available. var attributes = new Dictionary { { "AllowFileManagement", AllowFileManagement }, { "AllowRichText", AllowRichText }, { "AllowRawHtml", AllowRawHtml }, { "ReadOnly", ReadOnly } }; if(!string.IsNullOrEmpty(Theme)) { attributes.Add("Theme", Theme); } if (!string.IsNullOrEmpty(DebugLevel)) { attributes.Add("DebugLevel", DebugLevel); } if (!string.IsNullOrEmpty(Placeholder)) { attributes.Add("Placeholder", Placeholder); } if(ToolbarContent != null) { attributes.Add("ToolbarContent", ToolbarContent); } var index = 1; foreach(var name in attributes.Keys) { if (editorType.GetProperty(name) != null) { builder.AddAttribute(index++, name, attributes[name]); } } builder.AddComponentReferenceCapture(index, (c) => { _textEditor = (ITextEditor)c; }); builder.CloseComponent(); } } } private async Task GetTextEditorProvider() { const string DefaultEditorName = "Quill"; var editorName = await GetTextEditorName(DefaultEditorName); var editorProviders = ServiceProvider.GetServices(); var editorProvider = editorProviders.FirstOrDefault(i => i.Name == editorName); if(editorProvider == null) { editorProvider = editorProviders.FirstOrDefault(i => i.Name == DefaultEditorName); } return editorProvider; } private async Task GetTextEditorName(string defaultName) { const string EditorSettingName = "TextEditor"; var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); return SettingService.GetSetting(settings, EditorSettingName, defaultName); } }