Fix #4358: RichTextEditor Provider Abstraction.

This commit is contained in:
Ben
2024-07-01 17:11:26 +08:00
parent 1eafed755d
commit e00c261777
21 changed files with 726 additions and 342 deletions

View File

@ -4,7 +4,6 @@
@namespace Oqtane.Modules.Controls
@inherits ModuleControlBase
@inject IServiceProvider ServiceProvider
@inject ISettingService SettingService
@inject IStringLocalizer<RichTextEditor> Localizer
<div class="row" style="margin-bottom: 50px;">
@ -14,7 +13,7 @@
</div>
@code {
private ITextEditorProvider _textEditorProvider;
private string _textEditorProvider;
private RenderFragment _textEditorComponent;
private ITextEditor _textEditor;
@ -28,29 +27,14 @@
public string Placeholder { get; set; }
[Parameter]
public bool AllowFileManagement { get; set; } = true;
public string Provider { get; set; }
[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<Resource> Resources { get; set; } = new List<Resource>();
[Parameter(CaptureUnmatchedValues = true)]
public Dictionary<string, object> AdditionalAttributes { get; set; } = new Dictionary<string, object>();
protected override async Task OnInitializedAsync()
{
_textEditorProvider = await GetTextEditorProvider();
_textEditorProvider = await GetTextEditorType(ServiceProvider, PageState.Site.SiteId);
}
protected override void OnParametersSet()
@ -71,6 +55,22 @@
await base.OnAfterRenderAsync(firstRender);
}
public override async Task<List<Resource>> GetResources(IServiceProvider serviceProvider, Page page)
{
var type = await GetTextEditorType(serviceProvider, page.SiteId);
if (!string.IsNullOrEmpty(type))
{
var editorType = Type.GetType(type);
if (editorType != null && editorType.GetInterfaces().Contains(typeof(IModuleControl)))
{
var control = Activator.CreateInstance(editorType) as IModuleControl;
return await control?.GetResources(serviceProvider, page);
}
}
return await base.GetResources(serviceProvider, page);
}
public async Task<string> GetHtml()
{
return await _textEditor.GetContent();
@ -78,37 +78,32 @@
private void CreateTextEditor(RenderTreeBuilder builder)
{
if(_textEditorProvider != null)
if(!string.IsNullOrEmpty(_textEditorProvider))
{
var editorType = Type.GetType(_textEditorProvider.EditorType);
var editorType = Type.GetType(_textEditorProvider);
if (editorType != null)
{
builder.OpenComponent(0, editorType);
//set editor parameters if available.
var attributes = new Dictionary<string, object>
{
{ "AllowFileManagement", AllowFileManagement },
{ "AllowRichText", AllowRichText },
{ "AllowRawHtml", AllowRawHtml },
{ "Placeholder", Placeholder },
{ "ReadOnly", ReadOnly }
};
if(!string.IsNullOrEmpty(Theme))
if (AdditionalAttributes != null)
{
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);
foreach(var key in AdditionalAttributes.Keys)
{
if(!attributes.ContainsKey(key))
{
attributes.Add(key, AdditionalAttributes[key]);
}
else
{
attributes[key] = AdditionalAttributes[key];
}
}
}
var index = 1;
@ -129,26 +124,21 @@
}
}
private async Task<ITextEditorProvider> GetTextEditorProvider()
private async Task<string> GetTextEditorType(IServiceProvider serviceProvider, int siteId)
{
const string DefaultEditorName = "Quill";
const string EditorSettingName = "TextEditorProvider";
var editorName = await GetTextEditorName(DefaultEditorName);
var editorProviders = ServiceProvider.GetServices<ITextEditorProvider>();
var editorProvider = editorProviders.FirstOrDefault(i => i.Name == editorName);
if(editorProvider == null)
if(!string.IsNullOrEmpty(Provider))
{
editorProvider = editorProviders.FirstOrDefault(i => i.Name == DefaultEditorName);
var provider = serviceProvider.GetServices<ITextEditorProvider>().FirstOrDefault(i => i.Name.Equals(Provider, StringComparison.OrdinalIgnoreCase));
if(provider != null)
{
return provider.EditorType;
}
}
return editorProvider;
}
private async Task<string> GetTextEditorName(string defaultName)
{
const string EditorSettingName = "TextEditor";
var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId);
return SettingService.GetSetting(settings, EditorSettingName, defaultName);
var settingService = serviceProvider.GetService<ISettingService>();
var settings = await settingService.GetSiteSettingsAsync(siteId);
return settingService.GetSetting(settings, EditorSettingName, Constants.DefaultTextEditorProvider);
}
}