commit
cc40733cff
@ -24,7 +24,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.createQuill",
|
||||
"Oqtane.RichTextEditor.createQuill",
|
||||
quillElement, toolbar, readOnly,
|
||||
placeholder, theme, debugLevel);
|
||||
return Task.CompletedTask;
|
||||
@ -40,7 +40,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string>(
|
||||
"interop.getQuillText",
|
||||
"Oqtane.RichTextEditor.getQuillText",
|
||||
quillElement);
|
||||
}
|
||||
catch
|
||||
@ -54,7 +54,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string>(
|
||||
"interop.getQuillHTML",
|
||||
"Oqtane.RichTextEditor.getQuillHTML",
|
||||
quillElement);
|
||||
}
|
||||
catch
|
||||
@ -68,7 +68,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string>(
|
||||
"interop.getQuillContent",
|
||||
"Oqtane.RichTextEditor.getQuillContent",
|
||||
quillElement);
|
||||
}
|
||||
catch
|
||||
@ -82,7 +82,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.loadQuillContent",
|
||||
"Oqtane.RichTextEditor.loadQuillContent",
|
||||
quillElement, content);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -97,7 +97,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.enableQuillEditor", quillElement, mode);
|
||||
"Oqtane.RichTextEditor.enableQuillEditor", quillElement, mode);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
catch
|
||||
@ -111,7 +111,7 @@ namespace Oqtane.Modules.Controls
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.insertQuillImage",
|
||||
"Oqtane.RichTextEditor.insertQuillImage",
|
||||
quillElement, imageUrl);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
@ -9,6 +9,7 @@
|
||||
@inject IPageService PageService
|
||||
@inject IPageModuleService PageModuleService
|
||||
@inject ILogService logger
|
||||
@inject ISettingService SettingService
|
||||
|
||||
@if (_moduleDefinitions != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions))
|
||||
{
|
||||
@ -78,18 +79,18 @@
|
||||
<div class="row">
|
||||
<div class="col text-center">
|
||||
<label for="Module" class="control-label">Module Management: </label>
|
||||
<select class="form-control" @bind="@_moduleType">
|
||||
<select class="form-control" @bind="@ModuleType">
|
||||
<option value="new">Add New Module</option>
|
||||
<option value="existing">Add Existing Module</option>
|
||||
</select>
|
||||
@if (_moduleType == "new")
|
||||
@if (ModuleType == "new")
|
||||
{
|
||||
@if (_moduleDefinitions != null)
|
||||
{
|
||||
<select class="form-control" @onchange="(e => CategoryChanged(e))">
|
||||
@foreach (var category in _categories)
|
||||
{
|
||||
if (category == _category)
|
||||
if (category == Category)
|
||||
{
|
||||
<option value="@category" selected>@category Modules</option>
|
||||
}
|
||||
@ -100,7 +101,7 @@
|
||||
}
|
||||
</select>
|
||||
<select class="form-control" @onchange="(e => ModuleChanged(e))">
|
||||
@if (_moduleDefinitionName == "-")
|
||||
@if (ModuleDefinitionName == "-")
|
||||
{
|
||||
<option value="-" selected><Select Module></option>
|
||||
}
|
||||
@ -116,7 +117,7 @@
|
||||
}
|
||||
}
|
||||
</select>
|
||||
@((MarkupString)@_description)
|
||||
@((MarkupString) Description)
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -128,7 +129,7 @@
|
||||
<option value="@p.PageId">@p.Name</option>
|
||||
}
|
||||
</select>
|
||||
<select class="form-control" @bind="@_moduleId">
|
||||
<select class="form-control" @bind="@ModuleId">
|
||||
<option value="-"><Select Module></option>
|
||||
@foreach (Module module in _modules)
|
||||
{
|
||||
@ -141,13 +142,13 @@
|
||||
<div class="row">
|
||||
<div class="col text-center">
|
||||
<label for="Title" class="control-label">Title: </label>
|
||||
<input type="text" name="Title" class="form-control" @bind="@_title" />
|
||||
<input type="text" name="Title" class="form-control" @bind="@Title"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col text-center">
|
||||
<label for="Pane" class="control-label">Pane: </label>
|
||||
<select class="form-control" @bind="@_pane">
|
||||
<select class="form-control" @bind="@Pane">
|
||||
<option value=""><Select Pane></option>
|
||||
@foreach (string pane in PageState.Page.Panes)
|
||||
{
|
||||
@ -159,7 +160,7 @@
|
||||
<div class="row">
|
||||
<div class="col text-center">
|
||||
<label for="Container" class="control-label">Container: </label>
|
||||
<select class="form-control" @bind="@_containerType">
|
||||
<select class="form-control" @bind="@ContainerType">
|
||||
@foreach (KeyValuePair<string, string> container in _containers)
|
||||
{
|
||||
<option value="@container.Key">@container.Value</option>
|
||||
@ -171,7 +172,7 @@
|
||||
<br/>
|
||||
|
||||
<button type="button" class="btn btn-primary btn-block mx-auto" @onclick="@AddModule">Add Module To Page</button>
|
||||
@((MarkupString) _message)
|
||||
@((MarkupString) Message)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -210,24 +211,44 @@
|
||||
}
|
||||
|
||||
@code{
|
||||
|
||||
private bool _deleteConfirmation = false;
|
||||
private string _moduleType = "new";
|
||||
private List<string> _categories = new List<string>();
|
||||
private List<ModuleDefinition> _allModuleDefinitions;
|
||||
private List<ModuleDefinition> _moduleDefinitions;
|
||||
private List<Page> _pages = new List<Page>();
|
||||
private string _pageId = "-";
|
||||
private string _moduleId = "-";
|
||||
private List<Module> _modules = new List<Module>();
|
||||
private Dictionary<string, string> _containers = new Dictionary<string, string>();
|
||||
private string _moduleDefinitionName = "-";
|
||||
private string _category = "Common";
|
||||
private string _description = "";
|
||||
private string _pane = "";
|
||||
private string _title = "";
|
||||
private string _containerType = "";
|
||||
private string _display = "display: none;";
|
||||
private string _message = "";
|
||||
private string _category = "Common";
|
||||
|
||||
protected string PageId { get; private set; } = "-";
|
||||
protected string ModuleId { get; private set; } = "-";
|
||||
protected string ModuleType { get; private set; } = "new";
|
||||
protected string ModuleDefinitionName { get; private set; } = "-";
|
||||
|
||||
protected string Category
|
||||
{
|
||||
get => _category;
|
||||
private set
|
||||
{
|
||||
if (_category != value)
|
||||
{
|
||||
_category = value;
|
||||
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(Category)).ToList();
|
||||
ModuleDefinitionName = "-";
|
||||
Description = "";
|
||||
StateHasChanged();
|
||||
_ = UpdateSettingsAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected string Description { get; private set; } = "";
|
||||
protected string Pane { get; private set; } = "";
|
||||
protected string Title { get; private set; } = "";
|
||||
protected string ContainerType { get; private set; } = "";
|
||||
protected string Message { get; private set; } = "";
|
||||
|
||||
[Parameter]
|
||||
public string ButtonClass { get; set; }
|
||||
@ -241,7 +262,8 @@
|
||||
[Parameter]
|
||||
public string BodyClass { get; set; }
|
||||
|
||||
protected override async Task OnParametersSetAsync()
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
if (string.IsNullOrEmpty(ButtonClass))
|
||||
{
|
||||
@ -274,78 +296,54 @@
|
||||
_pages.Add(p);
|
||||
}
|
||||
}
|
||||
await LoadSettingsAsync();
|
||||
|
||||
var panes = PageState.Page.Panes;
|
||||
_pane = panes.Count() == 1 ? panes.SingleOrDefault() : "";
|
||||
Pane = panes.Count() == 1 ? panes.SingleOrDefault() : "";
|
||||
var themes = await ThemeService.GetThemesAsync();
|
||||
_containers = ThemeService.GetContainerTypes(themes);
|
||||
_containerType = PageState.Site.DefaultContainerType;
|
||||
ContainerType = PageState.Site.DefaultContainerType;
|
||||
|
||||
_allModuleDefinitions = await ModuleDefinitionService.GetModuleDefinitionsAsync(PageState.Site.SiteId);
|
||||
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(Category)).ToList();
|
||||
|
||||
_categories = new List<string>();
|
||||
foreach (ModuleDefinition moduledefinition in _allModuleDefinitions)
|
||||
{
|
||||
if (moduledefinition.Categories != "")
|
||||
{
|
||||
foreach (string category in moduledefinition.Categories.Split(','))
|
||||
{
|
||||
if (!_categories.Contains(category))
|
||||
{
|
||||
_categories.Add(category);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_category = "Common";
|
||||
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList();
|
||||
_moduleDefinitionName = "-";
|
||||
_description = "";
|
||||
_categories = _allModuleDefinitions.SelectMany(m => m.Categories.Split(',')).Distinct().ToList();
|
||||
}
|
||||
}
|
||||
|
||||
private void CategoryChanged(ChangeEventArgs e)
|
||||
{
|
||||
_category = (string) e.Value;
|
||||
_moduleDefinitions = _allModuleDefinitions.Where(item => item.Categories.Contains(_category)).ToList();
|
||||
_moduleDefinitionName = "-";
|
||||
_description = "";
|
||||
StateHasChanged();
|
||||
Category = (string) e.Value;
|
||||
}
|
||||
|
||||
private void ModuleChanged(ChangeEventArgs e)
|
||||
{
|
||||
_moduleDefinitionName = (string)e.Value;
|
||||
if (_moduleDefinitionName != "-")
|
||||
ModuleDefinitionName = (string) e.Value;
|
||||
if (ModuleDefinitionName != "-")
|
||||
{
|
||||
var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName);
|
||||
_description = "<br /><div class=\"alert alert-info\" role=\"alert\">" + moduleDefinition.Description + "</div>";
|
||||
var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName);
|
||||
Description = "<br /><div class=\"alert alert-info\" role=\"alert\">" + moduleDefinition.Description + "</div>";
|
||||
}
|
||||
else
|
||||
{
|
||||
_description = "";
|
||||
Description = "";
|
||||
}
|
||||
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void PageChanged(ChangeEventArgs e)
|
||||
{
|
||||
_pageId = (string) e.Value;
|
||||
_modules?.Clear();
|
||||
|
||||
if (_pageId != "-")
|
||||
PageId = (string) e.Value;
|
||||
if (PageId != "-")
|
||||
{
|
||||
foreach (Module module in PageState.Modules.Where(item => item.PageId == int.Parse(_pageId) && !item.IsDeleted))
|
||||
{
|
||||
if (UserSecurity.IsAuthorized(PageState.User,PermissionNames.View, module.Permissions))
|
||||
{
|
||||
_modules.Add(module);
|
||||
_modules = PageState.Modules
|
||||
.Where(module => module.PageId == int.Parse(PageId)
|
||||
&& !module.IsDeleted
|
||||
&& UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, module.Permissions))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_moduleId = "-";
|
||||
ModuleId = "-";
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
@ -353,41 +351,41 @@
|
||||
{
|
||||
if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions))
|
||||
{
|
||||
if ((_moduleType == "new" && _moduleDefinitionName != "-") || (_moduleType != "new" && _moduleId != "-"))
|
||||
if ((ModuleType == "new" && ModuleDefinitionName != "-") || (ModuleType != "new" && ModuleId != "-"))
|
||||
{
|
||||
if (_moduleType == "new")
|
||||
if (ModuleType == "new")
|
||||
{
|
||||
Module module = new Module();
|
||||
module.SiteId = PageState.Site.SiteId;
|
||||
module.PageId = PageState.Page.PageId;
|
||||
module.ModuleDefinitionName = _moduleDefinitionName;
|
||||
module.ModuleDefinitionName = ModuleDefinitionName;
|
||||
module.AllPages = false;
|
||||
module.Permissions = PageState.Page.Permissions;
|
||||
module = await ModuleService.AddModuleAsync(module);
|
||||
_moduleId = module.ModuleId.ToString();
|
||||
ModuleId = module.ModuleId.ToString();
|
||||
}
|
||||
|
||||
var pageModule = new PageModule
|
||||
{
|
||||
PageId = PageState.Page.PageId,
|
||||
ModuleId = int.Parse(_moduleId),
|
||||
Title = _title
|
||||
ModuleId = int.Parse(ModuleId),
|
||||
Title = Title
|
||||
};
|
||||
if (pageModule.Title == "")
|
||||
{
|
||||
if (_moduleType == "new")
|
||||
if (ModuleType == "new")
|
||||
{
|
||||
pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == _moduleDefinitionName)?.Name;
|
||||
pageModule.Title = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName)?.Name;
|
||||
}
|
||||
else
|
||||
{
|
||||
pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(_moduleId))?.Title;
|
||||
pageModule.Title = _modules.FirstOrDefault(item => item.ModuleId == int.Parse(ModuleId))?.Title;
|
||||
}
|
||||
}
|
||||
|
||||
pageModule.Pane = _pane;
|
||||
pageModule.Pane = Pane;
|
||||
pageModule.Order = int.MaxValue;
|
||||
pageModule.ContainerType = _containerType;
|
||||
pageModule.ContainerType = ContainerType;
|
||||
|
||||
if (pageModule.ContainerType == PageState.Site.DefaultContainerType)
|
||||
{
|
||||
@ -397,26 +395,17 @@
|
||||
await PageModuleService.AddPageModuleAsync(pageModule);
|
||||
await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane);
|
||||
|
||||
_message = "<br /><div class=\"alert alert-success\" role=\"alert\">Module Added To Page</div>";
|
||||
|
||||
_moduleDefinitionName = "-";
|
||||
_description = "";
|
||||
_pane = "";
|
||||
_title = "";
|
||||
_containerType = "";
|
||||
_pageId = "-";
|
||||
_moduleId = "-";
|
||||
|
||||
Message = "<br /><div class=\"alert alert-success\" role=\"alert\">Module Added To Page</div>";
|
||||
NavigationManager.NavigateTo(NavigateUrl());
|
||||
}
|
||||
else
|
||||
{
|
||||
_message = "<br /><div class=\"alert alert-warning\" role=\"alert\">You Must Select A Module</div>";
|
||||
Message = "<br /><div class=\"alert alert-warning\" role=\"alert\">You Must Select A Module</div>";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_message = "<br /><div class=\"alert alert-error\" role=\"alert\">Not Authorized</div>";
|
||||
Message = "<br /><div class=\"alert alert-error\" role=\"alert\">Not Authorized</div>";
|
||||
}
|
||||
}
|
||||
|
||||
@ -432,6 +421,7 @@
|
||||
{
|
||||
PageState.EditMode = true;
|
||||
}
|
||||
|
||||
NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "edit=" + ((PageState.EditMode) ? "1" : "0")));
|
||||
}
|
||||
else
|
||||
@ -447,14 +437,14 @@
|
||||
|
||||
private void ShowControlPanel()
|
||||
{
|
||||
_message = "";
|
||||
Message = "";
|
||||
_display = "width: 25%; min-width: 375px;";
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
private void HideControlPanel()
|
||||
{
|
||||
_message = "";
|
||||
Message = "";
|
||||
_display = "width: 0%;";
|
||||
StateHasChanged();
|
||||
}
|
||||
@ -536,4 +526,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
private string settingName = "CP-category";
|
||||
|
||||
private async Task LoadSettingsAsync()
|
||||
{
|
||||
Dictionary<string, string> settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId);
|
||||
_category = SettingService.GetSetting(settings, settingName, "Common");
|
||||
}
|
||||
|
||||
private async Task UpdateSettingsAsync()
|
||||
{
|
||||
Dictionary<string, string> settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId);
|
||||
SettingService.SetSetting(settings, settingName, _category);
|
||||
await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId);
|
||||
}
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.setCookie",
|
||||
"Oqtane.Interop.setCookie",
|
||||
name, value, days);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -32,7 +32,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string>(
|
||||
"interop.getCookie",
|
||||
"Oqtane.Interop.getCookie",
|
||||
name);
|
||||
}
|
||||
catch
|
||||
@ -46,7 +46,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.updateTitle",
|
||||
"Oqtane.Interop.updateTitle",
|
||||
title);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -61,7 +61,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.includeMeta",
|
||||
"Oqtane.Interop.includeMeta",
|
||||
id, attribute, name, content);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -76,7 +76,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.includeLink",
|
||||
"Oqtane.Interop.includeLink",
|
||||
id, rel, url, type, integrity, crossorigin);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -91,7 +91,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.includeScript",
|
||||
"Oqtane.Interop.includeScript",
|
||||
id, src, content, location, integrity, crossorigin);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -106,7 +106,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.includeLink",
|
||||
"Oqtane.Interop.includeLink",
|
||||
id, "stylesheet", url, "text/css");
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -121,7 +121,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.removeElementsById",
|
||||
"Oqtane.Interop.removeElementsById",
|
||||
prefix, first, last);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -137,7 +137,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string>(
|
||||
"interop.getElementByName",
|
||||
"Oqtane.Interop.getElementByName",
|
||||
name);
|
||||
}
|
||||
catch
|
||||
@ -151,7 +151,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.submitForm",
|
||||
"Oqtane.Interop.submitForm",
|
||||
path, fields);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
@ -166,7 +166,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
return _jsRuntime.InvokeAsync<string[]>(
|
||||
"interop.getFiles",
|
||||
"Oqtane.Interop.getFiles",
|
||||
id);
|
||||
}
|
||||
catch
|
||||
@ -180,7 +180,7 @@ namespace Oqtane.UI
|
||||
try
|
||||
{
|
||||
_jsRuntime.InvokeAsync<object>(
|
||||
"interop.uploadFiles",
|
||||
"Oqtane.Interop.uploadFiles",
|
||||
posturl, folder, id);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
@ -66,7 +66,7 @@ namespace Oqtane.Infrastructure
|
||||
{
|
||||
MailMessage mailMessage = new MailMessage();
|
||||
mailMessage.From = new MailAddress(settings["SMTPUsername"], site.Name);
|
||||
|
||||
mailMessage.Subject = notification.Subject;
|
||||
if (notification.FromUserId != null)
|
||||
{
|
||||
mailMessage.Body = "From: " + notification.FromUser.DisplayName + "<" + notification.FromUser.Email + ">" + "\n";
|
||||
|
@ -46,6 +46,10 @@ body {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
div.app-moduleactions a.dropdown-toggle, div.app-moduleactions div.dropdown-menu {
|
||||
color:#ffffff;
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
|
||||
.app-menu {
|
||||
|
@ -1,4 +1,6 @@
|
||||
window.interop = {
|
||||
var Oqtane = Oqtane || {};
|
||||
|
||||
Oqtane.Interop = {
|
||||
setCookie: function (name, value, days) {
|
||||
var d = new Date();
|
||||
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||
|
@ -1,4 +1,6 @@
|
||||
window.interop = {
|
||||
var Oqtane = Oqtane || {};
|
||||
|
||||
Oqtane.RichTextEditor = {
|
||||
createQuill: function (
|
||||
quillElement, toolBar, readOnly,
|
||||
placeholder, theme, debugLevel) {
|
||||
|
Reference in New Issue
Block a user