From 5b8e6d4df6b0b1a02a777a20f7072e842767557d Mon Sep 17 00:00:00 2001 From: ijungleboy Date: Thu, 11 Nov 2021 20:01:55 +0100 Subject: [PATCH 01/33] Add many PrivateApi attributes to hide unimportant stuff in docs --- Oqtane.Client/Modules/Admin/ModuleCreator/ModuleInfo.cs | 4 +++- Oqtane.Client/Modules/HtmlText/ModuleInfo.cs | 2 ++ Oqtane.Client/Modules/HtmlText/Services/HtmlTextService.cs | 2 ++ Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs | 4 +++- Oqtane.Client/Program.cs | 2 ++ Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs | 4 +++- Oqtane.Client/Themes/OqtaneTheme/ThemeInfo.cs | 2 ++ .../Infrastructure/SiteTemplates/DefaultSiteTemplate.cs | 2 ++ .../Infrastructure/SiteTemplates/EmptySiteTemplate.cs | 2 ++ .../Modules/HtmlText/Controllers/HtmlTextController.cs | 2 ++ Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs | 2 ++ .../Modules/HtmlText/Migrations/01000000_InitializeModule.cs | 2 ++ .../Migrations/EntityBuilders/HtmlTextEntityBuilder.cs | 2 ++ Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs | 2 ++ .../Modules/HtmlText/Repository/HtmlTextRepository.cs | 4 +++- .../Modules/HtmlText/Repository/IHtmlTextRepository.cs | 4 +++- Oqtane.Server/Program.cs | 2 ++ Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs | 2 ++ 18 files changed, 41 insertions(+), 5 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/ModuleCreator/ModuleInfo.cs index 81b82a6d..7eb2f372 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/ModuleInfo.cs +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/ModuleInfo.cs @@ -1,7 +1,9 @@ -using Oqtane.Models; +using Oqtane.Documentation; +using Oqtane.Models; namespace Oqtane.Modules.Admin.ModuleCreator { + [PrivateApi("Mark this as private, since it's not very useful in the public docs")] public class ModuleInfo : IModule { public ModuleDefinition ModuleDefinition => new ModuleDefinition diff --git a/Oqtane.Client/Modules/HtmlText/ModuleInfo.cs b/Oqtane.Client/Modules/HtmlText/ModuleInfo.cs index fbe6cf9e..36e674fe 100644 --- a/Oqtane.Client/Modules/HtmlText/ModuleInfo.cs +++ b/Oqtane.Client/Modules/HtmlText/ModuleInfo.cs @@ -1,7 +1,9 @@ +using Oqtane.Documentation; using Oqtane.Models; namespace Oqtane.Modules.HtmlText { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class ModuleInfo : IModule { public ModuleDefinition ModuleDefinition => new ModuleDefinition diff --git a/Oqtane.Client/Modules/HtmlText/Services/HtmlTextService.cs b/Oqtane.Client/Modules/HtmlText/Services/HtmlTextService.cs index 73776394..85583f7e 100644 --- a/Oqtane.Client/Modules/HtmlText/Services/HtmlTextService.cs +++ b/Oqtane.Client/Modules/HtmlText/Services/HtmlTextService.cs @@ -1,10 +1,12 @@ using System.Net.Http; using System.Threading.Tasks; +using Oqtane.Documentation; using Oqtane.Services; using Oqtane.Shared; namespace Oqtane.Modules.HtmlText.Services { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextService : ServiceBase, IHtmlTextService, IService { public HtmlTextService(HttpClient http, SiteState siteState) : base(http, siteState) {} diff --git a/Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs b/Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs index c663882a..80d725a9 100644 --- a/Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs +++ b/Oqtane.Client/Modules/HtmlText/Services/IHtmlTextService.cs @@ -1,9 +1,11 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.Threading.Tasks; +using Oqtane.Documentation; using Oqtane.Modules.HtmlText.Models; namespace Oqtane.Modules.HtmlText.Services { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public interface IHtmlTextService { Task GetHtmlTextAsync(int ModuleId); diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index 68bcc7a2..162b9e2a 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; using Microsoft.JSInterop; +using Oqtane.Documentation; using Oqtane.Modules; using Oqtane.Services; using Oqtane.Shared; @@ -19,6 +20,7 @@ using Oqtane.UI; namespace Oqtane.Client { + [PrivateApi("Mark Entry-Program as private, since it's not very useful in the public docs")] public class Program { public static async Task Main(string[] args) diff --git a/Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs b/Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs index 7c52e766..2b9e4e84 100644 --- a/Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs +++ b/Oqtane.Client/Themes/BlazorTheme/ThemeInfo.cs @@ -1,7 +1,9 @@ -using Oqtane.Models; +using Oqtane.Documentation; +using Oqtane.Models; namespace Oqtane.Themes.BlazorTheme { + [PrivateApi("Mark Build-In Theme-Info classes as private, since it's not very useful in the public docs")] public class ThemeInfo : ITheme { public Theme Theme => new Theme diff --git a/Oqtane.Client/Themes/OqtaneTheme/ThemeInfo.cs b/Oqtane.Client/Themes/OqtaneTheme/ThemeInfo.cs index 4ac16269..763c694c 100644 --- a/Oqtane.Client/Themes/OqtaneTheme/ThemeInfo.cs +++ b/Oqtane.Client/Themes/OqtaneTheme/ThemeInfo.cs @@ -1,7 +1,9 @@ +using Oqtane.Documentation; using Oqtane.Models; namespace Oqtane.Themes.OqtaneTheme { + [PrivateApi("Mark Build-In Theme-Info classes as private, since it's not very useful in the public docs")] public class ThemeInfo : ITheme { public Theme Theme => new Theme diff --git a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs index 5e7e39bc..a1370f9f 100644 --- a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs +++ b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs @@ -6,9 +6,11 @@ using Microsoft.AspNetCore.Hosting; using Oqtane.Extensions; using Oqtane.Shared; using System.IO; +using Oqtane.Documentation; namespace Oqtane.SiteTemplates { + [PrivateApi("Mark Site-Template classes as private, since it's not very useful in the public docs")] public class DefaultSiteTemplate : ISiteTemplate { diff --git a/Oqtane.Server/Infrastructure/SiteTemplates/EmptySiteTemplate.cs b/Oqtane.Server/Infrastructure/SiteTemplates/EmptySiteTemplate.cs index e37cbbcb..c5aa907d 100644 --- a/Oqtane.Server/Infrastructure/SiteTemplates/EmptySiteTemplate.cs +++ b/Oqtane.Server/Infrastructure/SiteTemplates/EmptySiteTemplate.cs @@ -4,9 +4,11 @@ using System.Collections.Generic; using Oqtane.Extensions; using Oqtane.Repository; using Oqtane.Shared; +using Oqtane.Documentation; namespace Oqtane.SiteTemplates { + [PrivateApi("Mark Site-Template classes as private, since it's not very useful in the public docs")] public class EmptySiteTemplate : ISiteTemplate { public EmptySiteTemplate() diff --git a/Oqtane.Server/Modules/HtmlText/Controllers/HtmlTextController.cs b/Oqtane.Server/Modules/HtmlText/Controllers/HtmlTextController.cs index 4f0f75e2..020d6e48 100644 --- a/Oqtane.Server/Modules/HtmlText/Controllers/HtmlTextController.cs +++ b/Oqtane.Server/Modules/HtmlText/Controllers/HtmlTextController.cs @@ -7,10 +7,12 @@ using Oqtane.Enums; using Oqtane.Infrastructure; using Oqtane.Controllers; using System.Net; +using Oqtane.Documentation; namespace Oqtane.Modules.HtmlText.Controllers { [Route(ControllerRoutes.ApiRoute)] + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextController : ModuleControllerBase { private readonly IHtmlTextRepository _htmlText; diff --git a/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs b/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs index d38183b2..f9a862e8 100644 --- a/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs +++ b/Oqtane.Server/Modules/HtmlText/Manager/HtmlTextManager.cs @@ -7,11 +7,13 @@ using Oqtane.Enums; using Oqtane.Repository; using Oqtane.Shared; using Oqtane.Migrations.Framework; +using Oqtane.Documentation; // ReSharper disable ConvertToUsingDeclaration namespace Oqtane.Modules.HtmlText.Manager { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextManager : MigratableModuleBase, IInstallable, IPortable { private readonly IHtmlTextRepository _htmlText; diff --git a/Oqtane.Server/Modules/HtmlText/Migrations/01000000_InitializeModule.cs b/Oqtane.Server/Modules/HtmlText/Migrations/01000000_InitializeModule.cs index 094c32e3..9068d6c6 100644 --- a/Oqtane.Server/Modules/HtmlText/Migrations/01000000_InitializeModule.cs +++ b/Oqtane.Server/Modules/HtmlText/Migrations/01000000_InitializeModule.cs @@ -1,6 +1,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Oqtane.Databases.Interfaces; +using Oqtane.Documentation; using Oqtane.Migrations; using Oqtane.Modules.HtmlText.Migrations.EntityBuilders; using Oqtane.Modules.HtmlText.Repository; @@ -9,6 +10,7 @@ namespace Oqtane.Modules.HtmlText.Migrations { [DbContext(typeof(HtmlTextContext))] [Migration("HtmlText.01.00.00.00")] + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class InitializeModule : MultiDatabaseMigration { public InitializeModule(IDatabase database) : base(database) diff --git a/Oqtane.Server/Modules/HtmlText/Migrations/EntityBuilders/HtmlTextEntityBuilder.cs b/Oqtane.Server/Modules/HtmlText/Migrations/EntityBuilders/HtmlTextEntityBuilder.cs index 15fdb296..2866140f 100644 --- a/Oqtane.Server/Modules/HtmlText/Migrations/EntityBuilders/HtmlTextEntityBuilder.cs +++ b/Oqtane.Server/Modules/HtmlText/Migrations/EntityBuilders/HtmlTextEntityBuilder.cs @@ -2,6 +2,7 @@ using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Migrations.Operations; using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders; using Oqtane.Databases.Interfaces; +using Oqtane.Documentation; using Oqtane.Interfaces; using Oqtane.Migrations; using Oqtane.Migrations.EntityBuilders; @@ -11,6 +12,7 @@ using Oqtane.Migrations.EntityBuilders; namespace Oqtane.Modules.HtmlText.Migrations.EntityBuilders { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextEntityBuilder : AuditableBaseEntityBuilder { private const string _entityTableName = "HtmlText"; diff --git a/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs b/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs index 0232cd43..e0c4c99f 100644 --- a/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs +++ b/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextContext.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; +using Oqtane.Documentation; using Oqtane.Infrastructure; using Oqtane.Repository; using Oqtane.Repository.Databases.Interfaces; @@ -9,6 +10,7 @@ using Oqtane.Repository.Databases.Interfaces; namespace Oqtane.Modules.HtmlText.Repository { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextContext : DBContextBase, IService, IMultiDatabase { public HtmlTextContext(ITenantManager tenantManager, IHttpContextAccessor httpContextAccessor) : base(tenantManager, httpContextAccessor) { } diff --git a/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextRepository.cs b/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextRepository.cs index 633a5b25..a2229f0e 100644 --- a/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextRepository.cs +++ b/Oqtane.Server/Modules/HtmlText/Repository/HtmlTextRepository.cs @@ -1,9 +1,11 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; using System.Linq; using Oqtane.Modules.HtmlText.Models; +using Oqtane.Documentation; namespace Oqtane.Modules.HtmlText.Repository { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlTextRepository : IHtmlTextRepository, IService { private readonly HtmlTextContext _db; diff --git a/Oqtane.Server/Modules/HtmlText/Repository/IHtmlTextRepository.cs b/Oqtane.Server/Modules/HtmlText/Repository/IHtmlTextRepository.cs index 75daf276..014c5adc 100644 --- a/Oqtane.Server/Modules/HtmlText/Repository/IHtmlTextRepository.cs +++ b/Oqtane.Server/Modules/HtmlText/Repository/IHtmlTextRepository.cs @@ -1,7 +1,9 @@ -using Oqtane.Modules.HtmlText.Models; +using Oqtane.Documentation; +using Oqtane.Modules.HtmlText.Models; namespace Oqtane.Modules.HtmlText.Repository { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public interface IHtmlTextRepository { Models.HtmlText GetHtmlText(int moduleId); diff --git a/Oqtane.Server/Program.cs b/Oqtane.Server/Program.cs index 14a64abc..49a5542a 100644 --- a/Oqtane.Server/Program.cs +++ b/Oqtane.Server/Program.cs @@ -7,9 +7,11 @@ using Oqtane.Infrastructure; using System.Diagnostics; using Microsoft.Extensions.Logging; using Oqtane.Shared; +using Oqtane.Documentation; namespace Oqtane.Server { + [PrivateApi("Mark Entry-Program as private, since it's not very useful in the public docs")] public class Program { public static void Main(string[] args) diff --git a/Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs b/Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs index 25efbb23..988fc8bc 100644 --- a/Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs +++ b/Oqtane.Shared/Modules/HtmlText/Models/HtmlText.cs @@ -2,9 +2,11 @@ using System; using Oqtane.Models; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Oqtane.Documentation; namespace Oqtane.Modules.HtmlText.Models { + [PrivateApi("Mark HtmlText classes as private, since it's not very useful in the public docs")] public class HtmlText : IAuditable { [Key] From 2567c2937dcf07c7a1cfee98adbe03a5aa3993ff Mon Sep 17 00:00:00 2001 From: Leigh Date: Fri, 12 Nov 2021 07:07:15 +0100 Subject: [PATCH 02/33] Fix for #1797 Breadcrumbs render clickable This fixes the issue when the page property IsClickable is set to false the breadcrum for the page is not clickable. --- Oqtane.Client/Themes/Controls/Theme/Breadcrumbs.razor | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Themes/Controls/Theme/Breadcrumbs.razor b/Oqtane.Client/Themes/Controls/Theme/Breadcrumbs.razor index ef902a1c..ea037bb4 100644 --- a/Oqtane.Client/Themes/Controls/Theme/Breadcrumbs.razor +++ b/Oqtane.Client/Themes/Controls/Theme/Breadcrumbs.razor @@ -16,7 +16,15 @@ else { } } From 931559cca8f623095028f69823c26d954b1e1793 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Fri, 12 Nov 2021 09:42:34 -0500 Subject: [PATCH 03/33] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a97d13e4..af47e6b0 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ V.3.1.0 ( Q4 2021 ) - [ ] Authentication extensibility via Social logins / Azure B2C - [ ] Allow configuration of password complexity for local authentication -V.3.0.0 ( Nov 10, 2021 ) +V.3.0.0 ( Nov 11, 2021 ) - [x] Migration to .NET 6 - [x] Blazor hosting model flexibility per site - [x] Blazor WebAssembly prerendering support From 60d7e450485285d910a30f23774d8ef953ee16e5 Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Sat, 13 Nov 2021 11:59:57 +0100 Subject: [PATCH 04/33] Fix - site with default alias (*) edit fail --- Oqtane.Client/Modules/Admin/Sites/Index.razor | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Oqtane.Client/Modules/Admin/Sites/Index.razor b/Oqtane.Client/Modules/Admin/Sites/Index.razor index f6d829a4..09d7946d 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Index.razor @@ -52,6 +52,11 @@ else private void Edit(string name) { + if (name.Equals("*")) + { + var uri = new Uri(NavigationManager.Uri); + name = uri.Authority; + } NavigationManager.NavigateTo(_scheme + name + "/admin/site/?reload"); } From 54e930779506d00f826bae8cbaa0d6b2298577fd Mon Sep 17 00:00:00 2001 From: Leigh Date: Mon, 15 Nov 2021 21:14:40 +0100 Subject: [PATCH 05/33] Page management buttons resizing When the language is changed, in this instance Dutch the buttons are not resized to fit the caption. This small fix rectifies this. --- Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor index da391360..1509fff6 100644 --- a/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/Theme/ControlPanel.razor @@ -63,9 +63,9 @@
- - - + + +

From 5ca77c3f645e6930f54b1381c54b95aa14b7f423 Mon Sep 17 00:00:00 2001 From: Leigh Date: Mon, 15 Nov 2021 23:26:20 +0100 Subject: [PATCH 06/33] Modification to Page Management component Add a new tabpane that lists all the module on that page. From here you are able to modify the module settings and or delete the module from a page. Delete will send the module to the recycle bin. --- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 52 +++++++++++++++++-- .../Resources/Modules/Admin/Pages/Edit.resx | 12 +++++ Oqtane.Client/Resources/SharedResources.resx | 3 ++ 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index d3cbfbac..04084d2b 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -3,13 +3,14 @@ @inherits ModuleBase @inject NavigationManager NavigationManager @inject IPageService PageService +@inject IPageModuleService PageModuleService @inject IThemeService ThemeService @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer
- + @if (_themeList != null) {
@@ -157,6 +158,25 @@ } + + @if(_pageModules != null) + { + +
+   +   + @Localizer["ModuleTitle"] + @Localizer["ModuleDefinition"] +
+ + + + @context.Title + @(context.ModuleDefinition.Name.Length > 0 ? context.ModuleDefinition.Name : context.ModuleDefinitionName) + +
+ } +
@if (_themeSettingsType != null) { @@ -178,6 +198,7 @@ private List _themes = new List(); private List _containers = new List(); private List _pageList; + private List _pageModules; private int _pageId; private string _name; private string _title; @@ -206,6 +227,7 @@ private object _themeSettings; private RenderFragment ThemeSettingsComponent { get; set; } private bool _refresh = false; + protected Page page; protected override async Task OnInitializedAsync() { @@ -213,17 +235,18 @@ { _pageList = PageState.Pages; _children = PageState.Pages.Where(item => item.ParentId == null).ToList(); - _themeList = await ThemeService.GetThemesAsync(); _themes = ThemeService.GetThemeControls(_themeList); _pageId = Int32.Parse(PageState.QueryString["id"]); - var page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId); + page = PageState.Pages.FirstOrDefault(item => item.PageId == _pageId); + if (page != null) { _name = page.Name; _title = page.Title; _path = page.Path; + _pageModules = PageState.Modules.Where(m => m.PageId == page.PageId && m.IsDeleted == false).ToList(); if (string.IsNullOrEmpty(_path)) { @@ -281,6 +304,29 @@ } } + protected void LoadModuleSettings(Module module) + { + NavigationManager.NavigateTo(EditUrl(module.ModuleId, "Settings")); + } + + private async Task DeleteModule(Module module) + { + try + { + PageModule pagemodule = await PageModuleService.GetPageModuleAsync(page.PageId,module.ModuleId); + pagemodule.IsDeleted = true; + + await PageModuleService.UpdatePageModuleAsync(pagemodule); + await logger.LogInformation(LogFunction.Update,"Module Deleted {Title}", module.Title); + NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, true)); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Deleting Module {Title} {Error}", module.Title, ex.Message); + AddModuleMessage(Localizer["Error.Module.Delete"], MessageType.Error); + } + } + private async void ParentChanged(ChangeEventArgs e) { try diff --git a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx index 55987b3c..45cfb0b2 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Pages/Edit.resx @@ -231,4 +231,16 @@ Move: + + Module Name / Definition + + + Module Title + + + Page Modules + + + + \ No newline at end of file diff --git a/Oqtane.Client/Resources/SharedResources.resx b/Oqtane.Client/Resources/SharedResources.resx index ce8bc2bb..5b8a3da4 100644 --- a/Oqtane.Client/Resources/SharedResources.resx +++ b/Oqtane.Client/Resources/SharedResources.resx @@ -318,4 +318,7 @@ Blazor WebAssembly + + Settings + \ No newline at end of file From d5b0356625d79e0b597c89afa6f47acc17e78df9 Mon Sep 17 00:00:00 2001 From: Leigh Date: Tue, 16 Nov 2021 00:37:57 +0100 Subject: [PATCH 07/33] Modification to Module Management The component now reports back if the module is in use. This will assist in housekeeping and removal of unused modules. --- .../Modules/Admin/ModuleDefinitions/Index.razor | 11 +++++++++++ .../Modules/Admin/ModuleDefinitions/Index.resx | 3 +++ 2 files changed, 14 insertions(+) diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index 1f194dba..57d6fa26 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -22,6 +22,7 @@ else   @SharedLocalizer["Name"] @SharedLocalizer["Version"] + @Localizer["InUse"] @SharedLocalizer["Expires"]   @@ -35,6 +36,16 @@ else @context.Name @context.Version + + @if(context.AssemblyName == "Oqtane.Client" || PageState.Modules.Where(m => m.ModuleDefinition.ModuleDefinitionId == context.ModuleDefinitionId).Count() > 0) + { + @SharedLocalizer["Yes"] + } + else + { + @SharedLocalizer["No"] + } + @((MarkupString)PurchaseLink(context.PackageName)) diff --git a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx index 839a8fc4..7e03b2c5 100644 --- a/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx +++ b/Oqtane.Client/Resources/Modules/Admin/ModuleDefinitions/Index.resx @@ -144,4 +144,7 @@ Delete Module + + In Use + \ No newline at end of file From b40ee197357b314058e99bbc7693d91e5010963f Mon Sep 17 00:00:00 2001 From: Pavel Vesely Date: Wed, 17 Nov 2021 11:07:52 +0100 Subject: [PATCH 08/33] ErrorBoundary --- .../Resources/UI/ModuleInstance.resx | 3 + Oqtane.Client/UI/ModuleInstance.razor | 88 +++++++++++-------- 2 files changed, 54 insertions(+), 37 deletions(-) diff --git a/Oqtane.Client/Resources/UI/ModuleInstance.resx b/Oqtane.Client/Resources/UI/ModuleInstance.resx index 3ce75ee0..a10f61d6 100644 --- a/Oqtane.Client/Resources/UI/ModuleInstance.resx +++ b/Oqtane.Client/Resources/UI/ModuleInstance.resx @@ -123,4 +123,7 @@ Module Type Is Invalid For {0} + + Program error in module {0} + \ No newline at end of file diff --git a/Oqtane.Client/UI/ModuleInstance.razor b/Oqtane.Client/UI/ModuleInstance.razor index 41e7f12e..f2bff75d 100644 --- a/Oqtane.Client/UI/ModuleInstance.razor +++ b/Oqtane.Client/UI/ModuleInstance.razor @@ -1,17 +1,30 @@ @namespace Oqtane.UI @inject IStringLocalizer Localizer - -@DynamicComponent -@if (_progressindicator) -{ -
-} + + + + + + + @if (ModuleType != null) + { + + @if (_progressIndicator) + { +
+ } + } +
+
@code { private string _message; - private MessageType _messagetype; - private bool _progressindicator = false; + private MessageType _messageType; + private bool _progressIndicator = false; + + private Type ModuleType { get; set; } + private IDictionary ModuleParameters { get; set; } [CascadingParameter] protected PageState PageState { get; set; } @@ -26,53 +39,54 @@ protected override void OnParametersSet() { _message = ""; - - DynamicComponent = builder => + if (!string.IsNullOrEmpty(ModuleState.ModuleType)) { - Type moduleType = null; - if (!string.IsNullOrEmpty(ModuleState.ModuleType)) + ModuleType = Type.GetType(ModuleState.ModuleType); + if (ModuleType != null) { - moduleType = Type.GetType(ModuleState.ModuleType); - - if (moduleType != null) - { - builder.OpenComponent(0, moduleType); - builder.AddAttribute(1, "ModuleInstance", this); - builder.CloseComponent(); - } - else - { - // module does not exist with typename specified - _message = string.Format(Localizer["Error.Module.InvalidName"], Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0)); - _messagetype = MessageType.Error; - } + ModuleParameters = new Dictionary { { "ModuleInstance", this } }; + return; } - else - { - _message = string.Format(Localizer["Error.Module.InvalidType"], ModuleState.ModuleDefinitionName); - _messagetype = MessageType.Error; - } - - }; + // module does not exist with typename specified + _message = string.Format(Localizer["Error.Module.InvalidName"], Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0)); + _messageType = MessageType.Error; + } + else + { + _message = string.Format(Localizer["Error.Module.InvalidType"], ModuleState.ModuleDefinitionName); + _messageType = MessageType.Error; + } } public void AddModuleMessage(string message, MessageType type) { _message = message; - _messagetype = type; - _progressindicator = false; + _messageType = type; + _progressIndicator = false; StateHasChanged(); } public void ShowProgressIndicator() { - _progressindicator = true; + _progressIndicator = true; StateHasChanged(); } public void HideProgressIndicator() { - _progressindicator = false; + _progressIndicator = false; StateHasChanged(); } + + + private string ErrorMessage(Exception context) + { + var message = string.Format(Localizer["Error.Module.Exception"], ModuleState.ModuleDefinitionName); + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + return $"{message}
{context}"; + } + return message; + } + } From d431c607ba903f79d8c5010255f53c918dea020b Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Thu, 18 Nov 2021 14:50:17 +0300 Subject: [PATCH 09/33] Handle SchemaId in Swagger --- Oqtane.Server/Startup.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index e82ee135..cf8bf6a2 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -117,6 +117,10 @@ namespace Oqtane .AddOqtaneApplicationParts() // register any Controllers from custom modules .ConfigureOqtaneMvc(); // any additional configuration from IStart classes. + services.AddSwaggerGen(options => + { + options.CustomSchemaIds(type => type.ToString()); // Handle SchemaId already used for different type + }); services.TryAddSwagger(_useSwagger); } From 1c43c095bcc8cc2c807e9cd5b0fb48cacc0eaa91 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sat, 20 Nov 2021 09:47:49 +0300 Subject: [PATCH 10/33] Fix heading localization in TabPanel --- Oqtane.Client/Modules/Controls/TabPanel.razor | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Oqtane.Client/Modules/Controls/TabPanel.razor b/Oqtane.Client/Modules/Controls/TabPanel.razor index 4fd1cf6a..de41b392 100644 --- a/Oqtane.Client/Modules/Controls/TabPanel.razor +++ b/Oqtane.Client/Modules/Controls/TabPanel.razor @@ -40,6 +40,10 @@ else { Heading = Localize(nameof(Name), Name); } + else + { + Heading = Localize(nameof(Heading), Heading); + } } public string DisplayHeading() From 19be77ed49041cdce211ccf4ae124b73f86c7ed4 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Mon, 22 Nov 2021 16:11:44 -0500 Subject: [PATCH 11/33] refactored ErrorBoundary implementation to support logging --- Oqtane.Client/Modules/HtmlText/Edit.razor | 6 +- Oqtane.Client/Modules/HtmlText/Index.razor | 14 +- .../Resources/Modules/HtmlText/Edit.resx | 5 +- .../Resources/Modules/HtmlText/Index.resx | 119 ++++++------- .../Resources/UI/ModuleInstance.resx | 4 +- Oqtane.Client/UI/ModuleInstance.razor | 156 ++++++++++-------- 6 files changed, 161 insertions(+), 143 deletions(-) diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index bc94cebc..5fc59bfc 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -65,8 +65,8 @@ } catch (Exception ex) { - await logger.LogError(ex, "An Error Occurred Loading Html/Text Content. " + ex.Message); - AddModuleMessage(ex.Message, MessageType.Error); + await logger.LogError(ex, "Error Loading Content {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Content.Load"], MessageType.Error); } } @@ -91,7 +91,7 @@ await HtmlTextService.AddHtmlTextAsync(htmltext); } - await logger.LogInformation("Html/Text Content Saved {HtmlText}", htmltext); + await logger.LogInformation("Content Saved {HtmlText}", htmltext); NavigationManager.NavigateTo(NavigateUrl()); } catch (Exception ex) diff --git a/Oqtane.Client/Modules/HtmlText/Index.razor b/Oqtane.Client/Modules/HtmlText/Index.razor index 57a95cef..4428d033 100644 --- a/Oqtane.Client/Modules/HtmlText/Index.razor +++ b/Oqtane.Client/Modules/HtmlText/Index.razor @@ -15,16 +15,16 @@ } @code { - public override List Resources => new List() + public override List Resources => new List() { new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" } }; - private string content = ""; + private string content = ""; - protected override async Task OnParametersSetAsync() - { - try + protected override async Task OnParametersSetAsync() + { + try { var htmltext = await HtmlTextService.GetHtmlTextAsync(ModuleState.ModuleId); if (htmltext != null) @@ -35,8 +35,8 @@ } catch (Exception ex) { - await logger.LogError(ex, "An Error Occurred Loading Html/Text Content. " + ex.Message); - AddModuleMessage(ex.Message, MessageType.Error); + await logger.LogError(ex, "Error Loading Content {Error}", ex.Message); + AddModuleMessage(Localizer["Error.Content.Load"], MessageType.Error); } } } \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/HtmlText/Edit.resx b/Oqtane.Client/Resources/Modules/HtmlText/Edit.resx index 0439bfae..e2eed7a2 100644 --- a/Oqtane.Client/Resources/Modules/HtmlText/Edit.resx +++ b/Oqtane.Client/Resources/Modules/HtmlText/Edit.resx @@ -117,7 +117,10 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + An Error Occurred Loading Content + - Error Saving Content + An Error Occurred Saving Content \ No newline at end of file diff --git a/Oqtane.Client/Resources/Modules/HtmlText/Index.resx b/Oqtane.Client/Resources/Modules/HtmlText/Index.resx index 7c534702..1e0f92e6 100644 --- a/Oqtane.Client/Resources/Modules/HtmlText/Index.resx +++ b/Oqtane.Client/Resources/Modules/HtmlText/Index.resx @@ -1,65 +1,65 @@  - + mimetype: application/x-microsoft.net.object.bytearray.base64 + value : The object must be serialized into a byte array + : using a System.ComponentModel.TypeConverter + : and then encoded with base64 encoding. + --> + @@ -120,4 +120,7 @@ Edit + + An Error Occurred Loading Content + \ No newline at end of file diff --git a/Oqtane.Client/Resources/UI/ModuleInstance.resx b/Oqtane.Client/Resources/UI/ModuleInstance.resx index a10f61d6..fc0994f2 100644 --- a/Oqtane.Client/Resources/UI/ModuleInstance.resx +++ b/Oqtane.Client/Resources/UI/ModuleInstance.resx @@ -1,4 +1,4 @@ - + diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index 6fa559ca..bb3f75c4 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -40,6 +40,7 @@ namespace Oqtane.Pages public RenderMode RenderMode = RenderMode.Server; public string HeadResources = ""; public string BodyResources = ""; + public string Title = ""; public void OnGet() { @@ -80,6 +81,7 @@ namespace Oqtane.Pages { RenderMode = (RenderMode)Enum.Parse(typeof(RenderMode), site.RenderMode, true); } + Title = site.Name; } // if culture not specified diff --git a/Oqtane.Server/wwwroot/favicon.ico b/Oqtane.Server/wwwroot/favicon.ico index 0e569015cd5b8ef24cb0b2b28fe9e49e5fe34a87..550d600ee8531545eb17aa6d73e63280c6329287 100644 GIT binary patch literal 318 zcmb`9F%Ezr5CjMC0aVt6%GgN4WBiVViQh5tfyi+b7Iq5Ry`9bFz|`-(N8V&$lvyQB zs4@)IVQa3Y+nUd1rtEMX>to}W81#zm#}rKzOxT7wHH4g`hM2Pk=X#^~>ZQOJ-O^Mi Axc~qF literal 5430 zcmc&&Ye-{96rRMG#28InV|*K*Q4vE3F^KqnA@Ps+0I5*-M`@)LtYK|oDar0q*HV@( zl%+okQYfXA{t#KDl+qt=TUzOlZ7F40N};x07Lig?yDTD-+wUY!xS8CWYusQ54l{G+ zyyl!U=gwTlbWG3ec80#5Eg2YdGsf!c6Z21izYSa)a2SFjfk$`dHa9nCsI06ETCLV= zg@uJTDk>_bCMPG2XA#iY*yuKyO!q-6$pN^Bb#-;#OfuTr+bcp!C*Mf&(A-W z%@5peca55i;^N{rIjzlRyE!^KY8@XRHv@k~r_;slDJUqoqsGte2F6PXsB_&hDPk>yytVELuH#Rn=r#QlAkNf)i%$aD_*5HQ__WzdJx)#2*wbj|u z(o&y^E*4?z$i-OH#@O%QG4`hn{{4Zmf8N3R2aKKk1^_M56G#M7qRx*dGT(|Z0 zb>raRptYx`#~KcY&*jH#Z9@ICAn%tP4#$_syT1`fI+GH{hrsP3pI$>fbYv^{EcDII z&Cj9MJOVAes}8Uy3fe2n%gctd$kn0=g+hAl`3|p>nRLt7P$M=G7mJpBt##;rTP`=7 zad~<9ryCm^dMzDl>-g>rqedzE8}*uM>0hWp2RO?oYIY$OOKS49@TH}t@meL9O>scI z{BU@9xNU1|E50|>-Ws%9u=PkzOJn52BhY3Yhd?0EuM~59t3zsb!>%CtMYI9m{>y4S zYWT9UviNsVE(>RDM~$B2LGzxRhsMBd^7XU!i0fyf9NaPHwfN!dfao{W>W5l<;yU8? zm8gGye%>$AiSy~{X{*IzNr?eu9f)*VbI3^3-__Nnsefi><`T|BihkU2veu8>{}?u= z$U*L1)v~*(scBl|!#Um6;uF_V%U==YU?2Oqf2r1Y+{X;an;%6!8U6SHI4kD*l;(eyIqRUC>On6Z$Obj1Bt!7t0eE#$0^)6;~v6c?9!__j-sAC%V_#|Y9rbB*b#*mf ze`{-N=`NP$clhMR^XL?LkoUKgR?6c`xR4PN#DdwIFUE(L75V8X7Vp_tV~P z6bIbF9BXT9M#MQ;FA%f+-rnA1e4a%&=k4t5^ee^Tv`(<@?(R0MKcRfb*^T>!^X96D zPw5<|#TobMS<->?7s6TpJXiWeIe5PmlW&1fv4PG=Fc@^MtgIODo~aP|ayiF6gK|1W zKh1I9Q>{z6)K70X+_!%bZNT^HaAah}oJ(D5vfzW~Mg7PPssR_$@P;&^-X-4xIETl0 zOIBTo@>3<%)zw!qjOPJz{-cZ3O}cQ;sKHzQn9jT3?;pHq{iF{y?=Euj*X`}?oV>NN z-2>{*G~V&5|826B_kYk!)Q((|v}cl}YdZRM5QkXaP9$cFMow(effLtJ3IIP4GesjY p(_Tc%+mWQ}*8%q=Y3FOmc?s~kBt-`ja!K|H0p>A+NCKop`wt!H9{>OV diff --git a/Oqtane.Server/wwwroot/oqtane.ico b/Oqtane.Server/wwwroot/oqtane.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e569015cd5b8ef24cb0b2b28fe9e49e5fe34a87 GIT binary patch literal 5430 zcmc&&Ye-{96rRMG#28InV|*K*Q4vE3F^KqnA@Ps+0I5*-M`@)LtYK|oDar0q*HV@( zl%+okQYfXA{t#KDl+qt=TUzOlZ7F40N};x07Lig?yDTD-+wUY!xS8CWYusQ54l{G+ zyyl!U=gwTlbWG3ec80#5Eg2YdGsf!c6Z21izYSa)a2SFjfk$`dHa9nCsI06ETCLV= zg@uJTDk>_bCMPG2XA#iY*yuKyO!q-6$pN^Bb#-;#OfuTr+bcp!C*Mf&(A-W z%@5peca55i;^N{rIjzlRyE!^KY8@XRHv@k~r_;slDJUqoqsGte2F6PXsB_&hDPk>yytVELuH#Rn=r#QlAkNf)i%$aD_*5HQ__WzdJx)#2*wbj|u z(o&y^E*4?z$i-OH#@O%QG4`hn{{4Zmf8N3R2aKKk1^_M56G#M7qRx*dGT(|Z0 zb>raRptYx`#~KcY&*jH#Z9@ICAn%tP4#$_syT1`fI+GH{hrsP3pI$>fbYv^{EcDII z&Cj9MJOVAes}8Uy3fe2n%gctd$kn0=g+hAl`3|p>nRLt7P$M=G7mJpBt##;rTP`=7 zad~<9ryCm^dMzDl>-g>rqedzE8}*uM>0hWp2RO?oYIY$OOKS49@TH}t@meL9O>scI z{BU@9xNU1|E50|>-Ws%9u=PkzOJn52BhY3Yhd?0EuM~59t3zsb!>%CtMYI9m{>y4S zYWT9UviNsVE(>RDM~$B2LGzxRhsMBd^7XU!i0fyf9NaPHwfN!dfao{W>W5l<;yU8? zm8gGye%>$AiSy~{X{*IzNr?eu9f)*VbI3^3-__Nnsefi><`T|BihkU2veu8>{}?u= z$U*L1)v~*(scBl|!#Um6;uF_V%U==YU?2Oqf2r1Y+{X;an;%6!8U6SHI4kD*l;(eyIqRUC>On6Z$Obj1Bt!7t0eE#$0^)6;~v6c?9!__j-sAC%V_#|Y9rbB*b#*mf ze`{-N=`NP$clhMR^XL?LkoUKgR?6c`xR4PN#DdwIFUE(L75V8X7Vp_tV~P z6bIbF9BXT9M#MQ;FA%f+-rnA1e4a%&=k4t5^ee^Tv`(<@?(R0MKcRfb*^T>!^X96D zPw5<|#TobMS<->?7s6TpJXiWeIe5PmlW&1fv4PG=Fc@^MtgIODo~aP|ayiF6gK|1W zKh1I9Q>{z6)K70X+_!%bZNT^HaAah}oJ(D5vfzW~Mg7PPssR_$@P;&^-X-4xIETl0 zOIBTo@>3<%)zw!qjOPJz{-cZ3O}cQ;sKHzQn9jT3?;pHq{iF{y?=Euj*X`}?oV>NN z-2>{*G~V&5|826B_kYk!)Q((|v}cl}YdZRM5QkXaP9$cFMow(effLtJ3IIP4GesjY p(_Tc%+mWQ}*8%q=Y3FOmc?s~kBt-`ja!K|H0p>A+NCKop`wt!H9{>OV literal 0 HcmV?d00001 diff --git a/Oqtane.Shared/Shared/Utilities.cs b/Oqtane.Shared/Shared/Utilities.cs index aee8b568..1ac3f900 100644 --- a/Oqtane.Shared/Shared/Utilities.cs +++ b/Oqtane.Shared/Shared/Utilities.cs @@ -113,9 +113,14 @@ namespace Oqtane.Shared } public static string ImageUrl(Alias alias, int fileId, int width, int height, string mode) + { + return ImageUrl(alias, fileId, width, height, mode, 0); + } + + public static string ImageUrl(Alias alias, int fileId, int width, int height, string mode, int rotate) { var aliasUrl = (alias != null && !string.IsNullOrEmpty(alias.Path)) ? "/" + alias.Path : ""; - return $"{aliasUrl}{Constants.ImageUrl}{fileId}/{width}/{height}/{mode}"; + return $"{aliasUrl}{Constants.ImageUrl}{fileId}/{width}/{height}/{mode}/{rotate}"; } public static string TenantUrl(Alias alias, string url) From 03106526e9d13f6c167f48b4b307b2865e0d0fa2 Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 24 Nov 2021 09:07:43 -0500 Subject: [PATCH 13/33] Enhance the default site template with a Develop page that makes the Module Creator more discoverable for new users --- .../SiteTemplates/DefaultSiteTemplate.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs index a1370f9f..ae03d057 100644 --- a/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs +++ b/Oqtane.Server/Infrastructure/SiteTemplates/DefaultSiteTemplate.cs @@ -133,6 +133,35 @@ namespace Oqtane.SiteTemplates } } }); + _pageTemplates.Add(new PageTemplate + { + Name = "Develop", + Parent = "", + Order = 7, + Path = "develop", + Icon = "oi oi-wrench", + IsNavigation = true, + IsPersonalizable = true, + PagePermissions = new List { + new Permission(PermissionNames.View, RoleNames.Host, true), + new Permission(PermissionNames.Edit, RoleNames.Host, true) + }.EncodePermissions(), + PageTemplateModules = new List { + new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.HtmlText, Oqtane.Client", Title = "Software Development", Pane = PaneNames.Admin, + ModulePermissions = new List { + new Permission(PermissionNames.View, RoleNames.Host, true), + new Permission(PermissionNames.Edit, RoleNames.Host, true) + }.EncodePermissions(), + Content = "

Oqtane offers a Module Creator which allows you to create new modules to extend the framework with additional capabilities. Simply provide some basic information and the system will scaffold a completely functional module which includes all of the necessary code files and assets to get you up and running as quickly as possible.

" + }, + new PageTemplateModule { ModuleDefinitionName = "Oqtane.Modules.Admin.ModuleCreator, Oqtane.Client", Title = "Module Creator", Pane = PaneNames.Admin, + ModulePermissions = new List { + new Permission(PermissionNames.View, RoleNames.Host, true), + new Permission(PermissionNames.Edit, RoleNames.Host, true) + }.EncodePermissions() + } + } + }); if (System.IO.File.Exists(Path.Combine(_environment.WebRootPath, "images", "logo-white.png"))) { From a21a2ab3bb290f9fc17fec01cad84f666cc9ddb6 Mon Sep 17 00:00:00 2001 From: Leigh Date: Wed, 24 Nov 2021 16:06:52 +0100 Subject: [PATCH 14/33] Settings for ModuleDefinitions #1829 Add Update settings for the ModuleDefinition --- .../Services/Interfaces/ISettingService.cs | 17 ++++++++++++++++- Oqtane.Client/Services/SettingService.cs | 10 ++++++++++ Oqtane.Server/Controllers/SettingController.cs | 3 +++ .../Repository/Context/TenantDBContext.cs | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Oqtane.Client/Services/Interfaces/ISettingService.cs b/Oqtane.Client/Services/Interfaces/ISettingService.cs index 2358f2aa..e9bb5126 100644 --- a/Oqtane.Client/Services/Interfaces/ISettingService.cs +++ b/Oqtane.Client/Services/Interfaces/ISettingService.cs @@ -70,7 +70,7 @@ namespace Oqtane.Services /// /// Returns a key-value dictionary of all module settings for the given module /// - /// + /// /// Task> GetModuleSettingsAsync(int moduleId); @@ -82,6 +82,21 @@ namespace Oqtane.Services /// Task UpdateModuleSettingsAsync(Dictionary moduleSettings, int moduleId); + /// + /// Returns a key-value dictionary of all module settings for the given module + /// + /// + /// + Task> GetModuleDefinitionSettingsAsync(int moduleDefinitionId); + + /// + /// Updates a module setting + /// + /// + /// + /// + Task UpdateModuleDefinitionSettingsAsync(Dictionary moduleDefinitionSettings, int moduleDefinitionId); + /// /// Returns a key-value dictionary of all user settings for the given user /// diff --git a/Oqtane.Client/Services/SettingService.cs b/Oqtane.Client/Services/SettingService.cs index 66e361fa..fb7c7704 100644 --- a/Oqtane.Client/Services/SettingService.cs +++ b/Oqtane.Client/Services/SettingService.cs @@ -71,6 +71,16 @@ namespace Oqtane.Services await UpdateSettingsAsync(moduleSettings, EntityNames.Module, moduleId); } + public async Task> GetModuleDefinitionSettingsAsync(int moduleDefinitionId) + { + return await GetSettingsAsync(EntityNames.ModuleDefinition, moduleDefinitionId); + } + + public async Task UpdateModuleDefinitionSettingsAsync(Dictionary moduleDefinitionSettings, int moduleDefinitionId) + { + await UpdateSettingsAsync(moduleDefinitionSettings, EntityNames.ModuleDefinition, moduleDefinitionId); + } + public async Task> GetUserSettingsAsync(int userId) { return await GetSettingsAsync(EntityNames.User, userId); diff --git a/Oqtane.Server/Controllers/SettingController.cs b/Oqtane.Server/Controllers/SettingController.cs index b305686e..99596c53 100644 --- a/Oqtane.Server/Controllers/SettingController.cs +++ b/Oqtane.Server/Controllers/SettingController.cs @@ -154,6 +154,9 @@ namespace Oqtane.Controllers break; case EntityNames.Page: case EntityNames.Module: + case EntityNames.ModuleDefinition: + authorized = User.IsInRole(RoleNames.Host); + break; case EntityNames.Folder: authorized = _userPermissions.IsAuthorized(User, entityName, entityId, permissionName); break; diff --git a/Oqtane.Server/Repository/Context/TenantDBContext.cs b/Oqtane.Server/Repository/Context/TenantDBContext.cs index ca8c822d..033d9df1 100644 --- a/Oqtane.Server/Repository/Context/TenantDBContext.cs +++ b/Oqtane.Server/Repository/Context/TenantDBContext.cs @@ -18,6 +18,7 @@ namespace Oqtane.Repository public virtual DbSet Page { get; set; } public virtual DbSet PageModule { get; set; } public virtual DbSet Module { get; set; } + public virtual DbSet ModuleDefinition { get; set; } public virtual DbSet User { get; set; } public virtual DbSet Profile { get; set; } public virtual DbSet Role { get; set; } From 43d166fb7d3ca6124512b0b923002a4ace42173b Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 1 Dec 2021 08:22:59 -0500 Subject: [PATCH 15/33] Route parsing abstraction and optimization, site router performance improvements, migrate site-based concepts (favicon, PWA support) to server for performance and prerendering benefits, move ThemeBuilder interop logic to OnAfterRenderAsync, upgrade SqlClient to release version, update installer to Bootstrap 5.1.3 --- Oqtane.Client/Installer/Installer.razor | 4 +- Oqtane.Client/Modules/Admin/Pages/Edit.razor | 2 +- Oqtane.Client/UI/SiteRouter.razor | 194 ++++++------------- Oqtane.Client/UI/ThemeBuilder.razor | 138 +++++-------- Oqtane.Server/Oqtane.Server.csproj | 2 +- Oqtane.Server/Pages/_Host.cshtml | 14 +- Oqtane.Server/Pages/_Host.cshtml.cs | 101 ++++++++-- Oqtane.Shared/Models/Route.cs | 124 ++++++++++++ Oqtane.Shared/Oqtane.Shared.csproj | 2 +- 9 files changed, 335 insertions(+), 246 deletions(-) create mode 100644 Oqtane.Shared/Models/Route.cs diff --git a/Oqtane.Client/Installer/Installer.razor b/Oqtane.Client/Installer/Installer.razor index 1ced68d1..75343a49 100644 --- a/Oqtane.Client/Installer/Installer.razor +++ b/Oqtane.Client/Installer/Installer.razor @@ -158,8 +158,8 @@ if (firstRender) { var interop = new Interop(JSRuntime); - await interop.IncludeLink("", "stylesheet", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/css/bootstrap.min.css", "text/css", "sha512-usVBAd66/NpVNfBge19gws2j6JZinnca12rAe2l+d+QkLU9fiG02O1X8Q6hepIpr/EYKZvKx/I9WsnujJuOmBA==", "anonymous", ""); - await interop.IncludeScript("", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.0.2/js/bootstrap.min.js", "sha512-a6ctI6w1kg3J4dSjknHj3aWLEbjitAXAjLDRUxo2wyYmDFRcz2RJuQr5M3Kt8O/TtUSp8n2rAyaXYy1sjoKmrQ==", "anonymous", "", "head", ""); + await interop.IncludeLink("", "stylesheet", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/css/bootstrap.min.css", "text/css", "sha512-GQGU0fMMi238uA+a/bdWJfpUGKUkBdgfFdgBm72SUQ6BeyWjoY/ton0tEjH+OSH9iP4Dfh+7HM0I9f5eR0L/4w==", "anonymous", ""); + await interop.IncludeScript("", "https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.1.3/js/bootstrap.bundle.min.js", "sha512-pax4MlgXjHEPfCwcJLQhigY7+N8rt6bVvWLFyUMuxShv170X53TRzGPmPkZmGBhk+jikR8WBM4yl7A9WMHHqvg==", "anonymous", "", "head", ""); } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 6a118a62..5f2a8536 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -170,7 +170,7 @@ @context.Title - @context.ModuleDefinition.Name + @context.ModuleDefinition?.Name } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index b1570c9f..876f1ead 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -15,78 +15,72 @@ @DynamicComponent @code { - private string _absoluteUri; - private bool _navigationInterceptionEnabled; - private PageState _pagestate; + private string _absoluteUri; + private bool _navigationInterceptionEnabled; + private PageState _pagestate; - [Parameter] - public string Runtime { get; set; } + [Parameter] + public string Runtime { get; set; } - [Parameter] - public string RenderMode { get; set; } + [Parameter] + public string RenderMode { get; set; } - [CascadingParameter] - PageState PageState { get; set; } + [CascadingParameter] + PageState PageState { get; set; } - [Parameter] - public Action OnStateChange { get; set; } + [Parameter] + public Action OnStateChange { get; set; } - private RenderFragment DynamicComponent { get; set; } + private RenderFragment DynamicComponent { get; set; } - protected override void OnInitialized() - { - _absoluteUri = NavigationManager.Uri; - NavigationManager.LocationChanged += LocationChanged; + protected override void OnInitialized() + { + _absoluteUri = NavigationManager.Uri; + NavigationManager.LocationChanged += LocationChanged; - DynamicComponent = builder => - { - if (PageState != null) - { - builder.OpenComponent(0, Type.GetType(Constants.PageComponent)); - builder.CloseComponent(); - } - }; - } + DynamicComponent = builder => + { + if (PageState != null) + { + builder.OpenComponent(0, Type.GetType(Constants.PageComponent)); + builder.CloseComponent(); + } + }; + } - public void Dispose() - { - NavigationManager.LocationChanged -= LocationChanged; - } + public void Dispose() + { + NavigationManager.LocationChanged -= LocationChanged; + } - protected override async Task OnParametersSetAsync() - { - if (PageState == null) - { - await Refresh(); - } - } + protected override async Task OnParametersSetAsync() + { + if (PageState == null) + { + await Refresh(); + } + } - [SuppressMessage("ReSharper", "StringIndexOfIsCultureSpecific.1")] - private async Task Refresh() - { - Site site; - List pages; - Page page; - User user = null; - List modules; - var moduleid = -1; - var action = Constants.DefaultAction; - var urlparameters = string.Empty; - var editmode = false; - var refresh = UI.Refresh.None; - var lastsyncdate = DateTime.UtcNow.AddHours(-1); - var runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime); + [SuppressMessage("ReSharper", "StringIndexOfIsCultureSpecific.1")] + private async Task Refresh() + { + Site site; + List pages; + Page page; + User user = null; + List modules; + var editmode = false; + var refresh = UI.Refresh.None; + var lastsyncdate = DateTime.UtcNow.AddHours(-1); + var runtime = (Shared.Runtime)Enum.Parse(typeof(Shared.Runtime), Runtime); - Uri uri = new Uri(_absoluteUri); - - // get path - var path = uri.LocalPath.Substring(1); - - // parse querystring - var querystring = ParseQueryString(uri.Query); + Route route = new Route(_absoluteUri, SiteState.Alias.Path); + var moduleid = (int.TryParse(route.ModuleId, out int mid)) ? mid : -1; + var action = (!string.IsNullOrEmpty(route.Action)) ? route.Action : Constants.DefaultAction; + var querystring = ParseQueryString(route.Query); // reload the client application if there is a forced reload or the user navigated to a site with a different alias - if (querystring.ContainsKey("reload") || (!path.ToLower().StartsWith(SiteState.Alias.Path.ToLower()) && !string.IsNullOrEmpty(SiteState.Alias.Path))) + if (querystring.ContainsKey("reload") || (!route.AbsolutePath.Substring(1).ToLower().StartsWith(SiteState.Alias.Path.ToLower()) && !string.IsNullOrEmpty(SiteState.Alias.Path))) { NavigationManager.NavigateTo(_absoluteUri.Replace("?reload", ""), true); return; @@ -168,72 +162,9 @@ pages = PageState.Pages; } - // format path and remove alias - path = path.Replace("//", "/"); // in case of doubleslash at end - path += (!path.EndsWith("/")) ? "/" : ""; - if (SiteState.Alias.Path != "" && path.StartsWith(SiteState.Alias.Path)) - { - path = path.Substring(SiteState.Alias.Path.Length + 1); - } - - // extract admin route elements from path - var segments = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - int result; - - int modIdPos = 0; - int actionPos = 0; - int urlParametersPos = 0; - - for (int i = 0; i < segments.Length; i++) - { - - if (segments[i] == Constants.UrlParametersDelimiter) - { - urlParametersPos = i + 1; - } - - if (i >= urlParametersPos && urlParametersPos != 0) - { - urlparameters += "/" + segments[i]; - } - - if (segments[i] == Constants.ModuleDelimiter) - { - modIdPos = i + 1; - actionPos = modIdPos + 1; - if (actionPos <= segments.Length - 1) - { - action = segments[actionPos]; - } - } - } - - // check if path has moduleid and action specification ie. pagename/*/moduleid/action/ - if (modIdPos > 0) - { - int.TryParse(segments[modIdPos], out result); - moduleid = result; - if (actionPos > segments.Length - 1) - { - path = path.Replace(segments[modIdPos - 1] + "/" + segments[modIdPos] + "/", ""); - } - else - { - path = path.Replace(segments[modIdPos - 1] + "/" + segments[modIdPos] + "/" + segments[actionPos] + "/", ""); - } - } - - if (urlParametersPos > 0) - { - path = path.Replace(segments[urlParametersPos - 1] + urlparameters + "/", ""); - } - - // remove trailing slash so it can be used as a key for Pages - if (path.EndsWith("/")) path = path.Substring(0, path.Length - 1); - if (PageState == null || refresh == UI.Refresh.Site) { - page = pages.FirstOrDefault(item => item.Path.Equals(path, StringComparison.OrdinalIgnoreCase)); + page = pages.FirstOrDefault(item => item.Path.Equals(route.PagePath, StringComparison.OrdinalIgnoreCase)); } else { @@ -241,14 +172,13 @@ } // get the page if the path has changed - if (page == null || page.Path != path) + if (page == null || page.Path != route.PagePath) { - page = pages.FirstOrDefault(item => item.Path.Equals(path, StringComparison.OrdinalIgnoreCase)); - // if the home page path does not exist then use the first page in the collection (a future enhancement would allow the admin to specify a home page) - if (page == null && path == "") + page = pages.FirstOrDefault(item => item.Path.Equals(route.PagePath, StringComparison.OrdinalIgnoreCase)); + // if the home page path does not exist then use the first page in the collection (a future enhancement would allow the admin to specify the home page) + if (page == null && route.PagePath == "") { page = pages.FirstOrDefault(); - path = page.Path; } editmode = false; } @@ -286,7 +216,7 @@ Modules = modules, Uri = new Uri(_absoluteUri, UriKind.Absolute), QueryString = querystring, - UrlParameters = urlparameters, + UrlParameters = route.UrlParameters, ModuleId = moduleid, Action = action, EditMode = editmode, @@ -302,12 +232,12 @@ if (user == null) { // redirect to login page - NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, "login", "?returnurl=" + path)); + NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, "login", "?returnurl=" + route.AbsolutePath)); } else { - await LogService.Log(null, null, user.UserId, GetType().AssemblyQualifiedName, Utilities.GetTypeNameLastSegment(GetType().AssemblyQualifiedName, 1), LogFunction.Security, LogLevel.Error, null, "Page Does Not Exist Or User Is Not Authorized To View Page {Path}", path); - if (path != "") + await LogService.Log(null, null, user.UserId, GetType().AssemblyQualifiedName, Utilities.GetTypeNameLastSegment(GetType().AssemblyQualifiedName, 1), LogFunction.Security, LogLevel.Error, null, "Page Does Not Exist Or User Is Not Authorized To View Page {Path}", route.PagePath); + if (route.PagePath != "") { // redirect to home page NavigationManager.NavigateTo(Utilities.NavigateUrl(SiteState.Alias.Path, "", "")); diff --git a/Oqtane.Client/UI/ThemeBuilder.razor b/Oqtane.Client/UI/ThemeBuilder.razor index e1bec737..0f96323e 100644 --- a/Oqtane.Client/UI/ThemeBuilder.razor +++ b/Oqtane.Client/UI/ThemeBuilder.razor @@ -5,103 +5,55 @@ @DynamicComponent @code { - [CascadingParameter] PageState PageState { get; set; } + [CascadingParameter] PageState PageState { get; set; } - RenderFragment DynamicComponent { get; set; } + RenderFragment DynamicComponent { get; set; } - protected override async Task OnParametersSetAsync() - { - var interop = new Interop(JsRuntime); + protected override void OnParametersSet() + { + // handle page redirection + if (!string.IsNullOrEmpty(PageState.Page.Url)) + { + NavigationManager.NavigateTo(PageState.Page.Url); + return; + } - // handle page redirection - if (!string.IsNullOrEmpty(PageState.Page.Url)) - { - NavigationManager.NavigateTo(PageState.Page.Url); - return; - } + DynamicComponent = builder => + { + var themeType = Type.GetType(PageState.Page.ThemeType); + builder.OpenComponent(0, themeType); + builder.CloseComponent(); + }; + } - // set page title - if (!string.IsNullOrEmpty(PageState.Page.Title)) - { - await interop.UpdateTitle(PageState.Page.Title); - } - else - { - await interop.UpdateTitle(PageState.Site.Name + " - " + PageState.Page.Name); - } + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (!firstRender) + { + var interop = new Interop(JsRuntime); - // manage stylesheets for this page - string batch = DateTime.Now.ToString("yyyyMMddHHmmssfff"); - var links = new List(); - foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet && item.Declaration != ResourceDeclaration.Global)) - { - links.Add(new { id = "app-stylesheet-" + batch + "-" + (links.Count + 1).ToString("00"), rel = "stylesheet", href = resource.Url, type = "text/css", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", key = "" }); - } - if (links.Any()) - { - await interop.IncludeLinks(links.ToArray()); - } - await interop.RemoveElementsById("app-stylesheet", "", "app-stylesheet-" + batch + "-00"); + // set page title + if (!string.IsNullOrEmpty(PageState.Page.Title)) + { + await interop.UpdateTitle(PageState.Page.Title); + } + else + { + await interop.UpdateTitle(PageState.Site.Name + " - " + PageState.Page.Name); + } - // add favicon - if (PageState.Site.FaviconFileId != null) - { - await interop.IncludeLink("app-favicon", "shortcut icon", Utilities.ContentUrl(PageState.Alias, PageState.Site.FaviconFileId.Value), "image/x-icon", "", "", "id"); - } - // add PWA support - if (PageState.Site.PwaIsEnabled && PageState.Site.PwaAppIconFileId != null && PageState.Site.PwaSplashIconFileId != null) - { - await InitializePwa(interop); - } - - DynamicComponent = builder => - { - var themeType = Type.GetType(PageState.Page.ThemeType); - builder.OpenComponent(0, themeType); - builder.CloseComponent(); - }; - } - - private async Task InitializePwa(Interop interop) - { - string url = NavigationManager.BaseUri; - url = url.Substring(0, url.Length - 1); - - // dynamically create manifest.json and add to page - string manifest = "setTimeout(() => { " + - "var manifest = { " + - "\"name\": \"" + PageState.Site.Name + "\", " + - "\"short_name\": \"" + PageState.Site.Name + "\", " + - "\"start_url\": \"" + url + "/\", " + - "\"display\": \"standalone\", " + - "\"background_color\": \"#fff\", " + - "\"description\": \"" + PageState.Site.Name + "\", " + - "\"icons\": [{ " + - "\"src\": \"" + url + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaAppIconFileId.Value) + "\", " + - "\"sizes\": \"192x192\", " + - "\"type\": \"image/png\" " + - "}, { " + - "\"src\": \"" + url + Utilities.ContentUrl(PageState.Alias, PageState.Site.PwaSplashIconFileId.Value) + "\", " + - "\"sizes\": \"512x512\", " + - "\"type\": \"image/png\" " + - "}] " + - "}; " + - "const serialized = JSON.stringify(manifest); " + - "const blob = new Blob([serialized], {type: 'application/javascript'}); " + - "const url = URL.createObjectURL(blob); " + - "document.getElementById('app-manifest').setAttribute('href', url); " + - "} " + - ", 1000);"; - await interop.IncludeScript("app-pwa", "", "", "", manifest, "body", "id"); - - // service worker must be in root of site - string serviceworker = "if ('serviceWorker' in navigator) { " + - "navigator.serviceWorker.register('/service-worker.js').then(function(registration) { " + - "console.log('ServiceWorker Registration Successful'); " + - "}).catch (function(err) { " + - "console.log('ServiceWorker Registration Failed ', err); " + - "}); " + - "}"; - await interop.IncludeScript("app-serviceworker", "", "", "", serviceworker, "body", "id"); - } + // manage stylesheets for this page + string batch = DateTime.Now.ToString("yyyyMMddHHmmssfff"); + var links = new List(); + foreach (Resource resource in PageState.Page.Resources.Where(item => item.ResourceType == ResourceType.Stylesheet && item.Declaration != ResourceDeclaration.Global)) + { + links.Add(new { id = "app-stylesheet-" + batch + "-" + (links.Count + 1).ToString("00"), rel = "stylesheet", href = resource.Url, type = "text/css", integrity = resource.Integrity ?? "", crossorigin = resource.CrossOrigin ?? "", key = "" }); + } + if (links.Any()) + { + await interop.IncludeLinks(links.ToArray()); + } + await interop.RemoveElementsById("app-stylesheet", "", "app-stylesheet-" + batch + "-00"); + } + } } diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index b171ea56..6ac2caaf 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -33,7 +33,7 @@ - + diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 1800176c..8e0980ec 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -9,12 +9,14 @@ @Model.Title - - - - + + @if (!string.IsNullOrEmpty(Model.PWAScript)) + { + + } + @Html.Raw(@Model.HeadResources) @@ -44,6 +46,10 @@ { } + @if (!string.IsNullOrEmpty(Model.PWAScript)) + { + @Model.PWAScript + } @Html.Raw(@Model.BodyResources) diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index bb3f75c4..cb878e2e 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -13,6 +13,7 @@ using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.Configuration; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.AspNetCore.Antiforgery; +using Microsoft.AspNetCore.Http.Extensions; namespace Oqtane.Pages { @@ -24,8 +25,9 @@ namespace Oqtane.Pages private readonly ILanguageRepository _languages; private readonly IAntiforgery _antiforgery; private readonly ISiteRepository _sites; + private readonly IPageRepository _pages; - public HostModel(IConfiguration configuration, ITenantManager tenantManager, ILocalizationManager localizationManager, ILanguageRepository languages, IAntiforgery antiforgery, ISiteRepository sites) + public HostModel(IConfiguration configuration, ITenantManager tenantManager, ILocalizationManager localizationManager, ILanguageRepository languages, IAntiforgery antiforgery, ISiteRepository sites, IPageRepository pages) { _configuration = configuration; _tenantManager = tenantManager; @@ -33,6 +35,7 @@ namespace Oqtane.Pages _languages = languages; _antiforgery = antiforgery; _sites = sites; + _pages = pages; } public string AntiForgeryToken = ""; @@ -41,6 +44,9 @@ namespace Oqtane.Pages public string HeadResources = ""; public string BodyResources = ""; public string Title = ""; + public string FavIcon = "favicon.ico"; + public string PWAScript = ""; + public string ThemeType = ""; public void OnGet() { @@ -55,14 +61,6 @@ namespace Oqtane.Pages { RenderMode = (RenderMode)Enum.Parse(typeof(RenderMode), _configuration.GetSection("RenderMode").Value, true); } - - var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); - foreach (Assembly assembly in assemblies) - { - ProcessHostResources(assembly); - ProcessModuleControls(assembly); - ProcessThemeControls(assembly); - } // if framework is installed if (!string.IsNullOrEmpty(_configuration.GetConnectionString("DefaultConnection"))) @@ -70,6 +68,8 @@ namespace Oqtane.Pages var alias = _tenantManager.GetAlias(); if (alias != null) { + Route route = new Route(HttpContext.Request.GetEncodedUrl(), alias.Path); + var site = _sites.GetSite(alias.SiteId); if (site != null) { @@ -81,10 +81,48 @@ namespace Oqtane.Pages { RenderMode = (RenderMode)Enum.Parse(typeof(RenderMode), site.RenderMode, true); } + if (site.FaviconFileId != null) + { + FavIcon = Utilities.ContentUrl(alias, site.FaviconFileId.Value); + } + if (site.PwaIsEnabled && site.PwaAppIconFileId != null && site.PwaSplashIconFileId != null) + { + PWAScript = CreatePWAScript(alias, site, route); + } Title = site.Name; + ThemeType = site.DefaultThemeType; + + var page = _pages.GetPage(route.PagePath, site.SiteId); + if (page != null) + { + // set page title + if (!string.IsNullOrEmpty(page.Title)) + { + Title = page.Title; + } + else + { + Title = Title + " - " + page.Name; + } + + // include theme resources + if (!string.IsNullOrEmpty(page.ThemeType)) + { + ThemeType = page.ThemeType; + } + } } - // if culture not specified + // include global resources + var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); + foreach (Assembly assembly in assemblies) + { + ProcessHostResources(assembly); + ProcessModuleControls(assembly); + ProcessThemeControls(assembly); + } + + // set culture if not specified if (HttpContext.Request.Cookies[CookieRequestCultureProvider.DefaultCookieName] == null) { // set default language for site if the culture is not supported @@ -103,6 +141,44 @@ namespace Oqtane.Pages } } + private string CreatePWAScript(Alias alias, Site site, Route route) + { + return + ""; + } + private void ProcessHostResources(Assembly assembly) { var types = assembly.GetTypes().Where(item => item.GetInterfaces().Contains(typeof(IHostResources))); @@ -151,7 +227,7 @@ namespace Oqtane.Pages { foreach (var resource in obj.Resources) { - if (resource.Declaration == ResourceDeclaration.Global) + if (resource.Declaration == ResourceDeclaration.Global || (Utilities.GetFullTypeName(type.AssemblyQualifiedName) == ThemeType && resource.ResourceType == ResourceType.Stylesheet)) { ProcessResource(resource); } @@ -166,7 +242,8 @@ namespace Oqtane.Pages case ResourceType.Stylesheet: if (!HeadResources.Contains(resource.Url, StringComparison.OrdinalIgnoreCase)) { - HeadResources += "" + Environment.NewLine; + var id = (resource.Declaration == ResourceDeclaration.Global) ? "" : "id=\"app-stylesheet-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "-00\" "; + HeadResources += "" + Environment.NewLine; } break; case ResourceType.Script: diff --git a/Oqtane.Shared/Models/Route.cs b/Oqtane.Shared/Models/Route.cs new file mode 100644 index 00000000..6f02538a --- /dev/null +++ b/Oqtane.Shared/Models/Route.cs @@ -0,0 +1,124 @@ +using System; +using Oqtane.Shared; + +namespace Oqtane.Models +{ + /// + /// A route is comprised of multiple components: + /// {scheme}://{hostname}/{aliaspath}/{pagepath}/*/{moduleid}/{action}/!/{urlparameters}?{query}#{fragment} + /// + public class Route + { + // default constructor accepts an absolute route url and alias + public Route(string route, string aliaspath) + { + Uri uri = new Uri(route); + Authority = uri.Authority; + Scheme = uri.Scheme; + Host = uri.Host; + Port = uri.Port.ToString(); + Query = uri.Query; + Fragment = uri.Fragment; + AbsolutePath = uri.AbsolutePath; + AliasPath = aliaspath; + PagePath = AbsolutePath; + ModuleId = ""; + Action = ""; + UrlParameters = ""; + + if (AliasPath.Length != 0) + { + PagePath = PagePath.Substring(AliasPath.Length + 1); + } + int pos = PagePath.IndexOf("/" + Constants.UrlParametersDelimiter + "/"); + if (pos != -1) + { + UrlParameters = PagePath.Substring(pos + 3); + PagePath = PagePath.Substring(1, pos); + } + pos = PagePath.IndexOf("/" + Constants.ModuleDelimiter + "/"); + if (pos != -1) + { + ModuleId = PagePath.Substring(pos + 3); + PagePath = PagePath.Substring(1, pos); + } + if (ModuleId.Length != 0) + { + pos = ModuleId.IndexOf("/"); + if (pos != -1) + { + Action = ModuleId.Substring(pos + 1); + ModuleId = ModuleId.Substring(0, pos); + } + } + if (PagePath.StartsWith("/")) + { + PagePath = (PagePath.Length == 1) ? "" : PagePath.Substring(1); + } + if (PagePath.EndsWith("/")) + { + PagePath = PagePath.Substring(0, PagePath.Length - 1); + } + } + + /// + /// The host name or IP address and port number (does not include scheme or trailing slash) + /// + public string Authority { get; set; } + + /// + /// A fully qualified route contains a scheme (ie. http, https ) + /// + public string Scheme { get; set; } + + /// + /// A fully qualified route contains a host name. The host name may include a port number. + /// + public string Host { get; set; } + + /// + /// A host name may contain a port number + /// + public string Port { get; set; } + + /// + /// The absolute path for the route + /// + public string AbsolutePath { get; set; } + + /// + /// An absolute path may contain an alias path + /// + public string AliasPath { get; set; } + + /// + /// A absolute path may contain a page path. + /// + public string PagePath { get; set; } + + /// + /// A route may contain a module id (ie. when created using EditUrl) located after the module delimiter segment (/*/). + /// + public string ModuleId { get; set; } + + /// + /// A route may contain an action (ie. when created using EditUrl) located after the module id. + /// + public string Action { get; set; } + + /// + /// A route may contain parameters located after the url parameter delimiter segment (/!/). + /// + public string UrlParameters { get; set; } + + /// + /// A route may contain querystring parameters located after the ? delimiter + /// + public string Query { get; set; } + + /// + /// A route may contain a fragment located after the # delimiter + /// + public string Fragment { get; set; } + } +} diff --git a/Oqtane.Shared/Oqtane.Shared.csproj b/Oqtane.Shared/Oqtane.Shared.csproj index 44e525ab..bd43767f 100644 --- a/Oqtane.Shared/Oqtane.Shared.csproj +++ b/Oqtane.Shared/Oqtane.Shared.csproj @@ -22,7 +22,7 @@ - + From 97133510a7081b8fbfd7b955e9ef923257aa1eec Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Wed, 1 Dec 2021 09:11:21 -0500 Subject: [PATCH 16/33] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index af47e6b0..03a987a4 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,12 @@ V.1.0.0 ( May 19, 2020 - released in conjunction with .NET Core 3.2 ) - [x] Dynamic CSS/Lazy Loading # Background -Oqtane was created by [Shaun Walker](https://www.linkedin.com/in/shaunbrucewalker/) and is inspired by the DotNetNuke web application framework. Initially created as a proof of concept, Oqtane is a native Blazor application written from the ground up using modern .NET Core technology and a Single Page Application (SPA) architecture. It is a modular application framework offering a fully dynamic page compositing model, multi-site support, designer friendly templates (skins), and extensibility via third party modules. +Oqtane was created by [Shaun Walker](https://www.linkedin.com/in/shaunbrucewalker/) and is inspired by the DotNetNuke web application framework. Initially created as a proof of concept, Oqtane is a native Blazor application written from the ground up using modern .NET Core technology and a Single Page Application (SPA) architecture. It is a modular application framework offering a fully dynamic page compositing model, multi-site support, designer friendly themes, and extensibility via third party modules. # Release Announcements + +[Oqtane 3.0](https://www.oqtane.org/Resources/Blog/PostId/551/announcing-oqtane-30-for-net-6) + [Oqtane 2.2](https://www.oqtane.org/Resources/Blog/PostId/549/oqtane-22-upgrades-to-bootstrap-5) [Oqtane 2.1](https://www.oqtane.org/Resources/Blog/PostId/548/oqtane-21-now-supports-multiple-databases) From 9dfd9ad519cedb84b78776975f9d2d4172a1275f Mon Sep 17 00:00:00 2001 From: Leigh Date: Thu, 2 Dec 2021 09:56:55 +0100 Subject: [PATCH 17/33] Quill Security related bug fixes. Upgraded Quill references to 1.3.7 Tabnabbing vulnerability in snow theme #2438 https://github.com/quilljs/quill/issues/2438 https://github.com/quilljs/quill/releases/tag/v1.3.7 --- .../Modules/Controls/RichTextEditor.razor | 2 +- Oqtane.Client/Modules/HtmlText/Edit.razor | 4 +- .../wwwroot/css/quill/quill1.3.7.bubble.css | 1173 +++++++++++++++++ .../wwwroot/css/quill/quill1.3.7.snow.css | 1170 ++++++++++++++++ Oqtane.Server/wwwroot/js/quill1.3.7.min.js | 8 + 5 files changed, 2354 insertions(+), 3 deletions(-) create mode 100644 Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css create mode 100644 Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css create mode 100644 Oqtane.Server/wwwroot/js/quill1.3.7.min.js diff --git a/Oqtane.Client/Modules/Controls/RichTextEditor.razor b/Oqtane.Client/Modules/Controls/RichTextEditor.razor index 793761f5..b924807c 100644 --- a/Oqtane.Client/Modules/Controls/RichTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/RichTextEditor.razor @@ -115,7 +115,7 @@ 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/quill1.3.7.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" } }; diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index 5fc59bfc..9c3191a0 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -30,8 +30,8 @@ public override List Resources => new List() { new Resource { ResourceType = ResourceType.Stylesheet, Url = ModulePath() + "Module.css" }, - new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.6.bubble.css" }, - new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.6.snow.css" } + new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.7.bubble.css" }, + new Resource { ResourceType = ResourceType.Stylesheet, Url = "css/quill/quill1.3.7.snow.css" } }; private RichTextEditor RichTextEditorHtml; diff --git a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css new file mode 100644 index 00000000..15661dda --- /dev/null +++ b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.bubble.css @@ -0,0 +1,1173 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} + + .ql-container.ql-disabled .ql-tooltip { + visibility: hidden; + } + + .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; + } + +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} + + .ql-clipboard p { + margin: 0; + padding: 0; + } + +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} + + .ql-editor > * { + cursor: text; + } + + .ql-editor p, + .ql-editor ol, + .ql-editor ul, + .ql-editor pre, + .ql-editor blockquote, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol, + .ql-editor ul { + padding-left: 1.5em; + } + + .ql-editor ol > li, + .ql-editor ul > li { + list-style-type: none; + } + + .ql-editor ul > li::before { + content: '\2022'; + } + + .ql-editor ul[data-checked=true], + .ql-editor ul[data-checked=false] { + pointer-events: none; + } + + .ql-editor ul[data-checked=true] > li *, + .ql-editor ul[data-checked=false] > li * { + pointer-events: all; + } + + .ql-editor ul[data-checked=true] > li::before, + .ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; + } + + .ql-editor ul[data-checked=true] > li::before { + content: '\2611'; + } + + .ql-editor ul[data-checked=false] > li::before { + content: '\2610'; + } + + .ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; + } + + .ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; + } + + .ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; + } + + .ql-editor ol li:not(.ql-direction-rtl), + .ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; + } + + .ql-editor ol li.ql-direction-rtl, + .ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; + } + + .ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; + } + + .ql-editor ol li:before { + content: counter(list-0, decimal) '. '; + } + + .ql-editor ol li.ql-indent-1 { + counter-increment: list-1; + } + + .ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-2 { + counter-increment: list-2; + } + + .ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-3 { + counter-increment: list-3; + } + + .ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; + } + + .ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-4 { + counter-increment: list-4; + } + + .ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-5 { + counter-increment: list-5; + } + + .ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-6 { + counter-increment: list-6; + } + + .ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; + } + + .ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-7 { + counter-increment: list-7; + } + + .ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; + } + + .ql-editor ol li.ql-indent-8 { + counter-increment: list-8; + } + + .ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-8 { + counter-reset: list-9; + } + + .ql-editor ol li.ql-indent-9 { + counter-increment: list-9; + } + + .ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; + } + + .ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; + } + + .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; + } + + .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; + } + + .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; + } + + .ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; + } + + .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; + } + + .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; + } + + .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; + } + + .ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; + } + + .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; + } + + .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; + } + + .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; + } + + .ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; + } + + .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; + } + + .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; + } + + .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; + } + + .ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; + } + + .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; + } + + .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; + } + + .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; + } + + .ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; + } + + .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; + } + + .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; + } + + .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; + } + + .ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; + } + + .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; + } + + .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; + } + + .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; + } + + .ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; + } + + .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; + } + + .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; + } + + .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; + } + + .ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; + } + + .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; + } + + .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; + } + + .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; + } + + .ql-editor .ql-video { + display: block; + max-width: 100%; + } + + .ql-editor .ql-video.ql-align-center { + margin: 0 auto; + } + + .ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; + } + + .ql-editor .ql-bg-black { + background-color: #000; + } + + .ql-editor .ql-bg-red { + background-color: #e60000; + } + + .ql-editor .ql-bg-orange { + background-color: #f90; + } + + .ql-editor .ql-bg-yellow { + background-color: #ff0; + } + + .ql-editor .ql-bg-green { + background-color: #008a00; + } + + .ql-editor .ql-bg-blue { + background-color: #06c; + } + + .ql-editor .ql-bg-purple { + background-color: #93f; + } + + .ql-editor .ql-color-white { + color: #fff; + } + + .ql-editor .ql-color-red { + color: #e60000; + } + + .ql-editor .ql-color-orange { + color: #f90; + } + + .ql-editor .ql-color-yellow { + color: #ff0; + } + + .ql-editor .ql-color-green { + color: #008a00; + } + + .ql-editor .ql-color-blue { + color: #06c; + } + + .ql-editor .ql-color-purple { + color: #93f; + } + + .ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; + } + + .ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; + } + + .ql-editor .ql-size-small { + font-size: 0.75em; + } + + .ql-editor .ql-size-large { + font-size: 1.5em; + } + + .ql-editor .ql-size-huge { + font-size: 2.5em; + } + + .ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; + } + + .ql-editor .ql-align-center { + text-align: center; + } + + .ql-editor .ql-align-justify { + text-align: justify; + } + + .ql-editor .ql-align-right { + text-align: right; + } + + .ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; + } + +.ql-bubble.ql-toolbar:after, +.ql-bubble .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} + +.ql-bubble.ql-toolbar button, +.ql-bubble .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} + + .ql-bubble.ql-toolbar button svg, + .ql-bubble .ql-toolbar button svg { + float: left; + height: 100%; + } + + .ql-bubble.ql-toolbar button:active:hover, + .ql-bubble .ql-toolbar button:active:hover { + outline: none; + } + +.ql-bubble.ql-toolbar input.ql-image[type=file], +.ql-bubble .ql-toolbar input.ql-image[type=file] { + display: none; +} + +.ql-bubble.ql-toolbar button:hover, +.ql-bubble .ql-toolbar button:hover, +.ql-bubble.ql-toolbar button:focus, +.ql-bubble .ql-toolbar button:focus, +.ql-bubble.ql-toolbar button.ql-active, +.ql-bubble .ql-toolbar button.ql-active, +.ql-bubble.ql-toolbar .ql-picker-label:hover, +.ql-bubble .ql-toolbar .ql-picker-label:hover, +.ql-bubble.ql-toolbar .ql-picker-label.ql-active, +.ql-bubble .ql-toolbar .ql-picker-label.ql-active, +.ql-bubble.ql-toolbar .ql-picker-item:hover, +.ql-bubble .ql-toolbar .ql-picker-item:hover, +.ql-bubble.ql-toolbar .ql-picker-item.ql-selected, +.ql-bubble .ql-toolbar .ql-picker-item.ql-selected { + color: #fff; +} + + .ql-bubble.ql-toolbar button:hover .ql-fill, + .ql-bubble .ql-toolbar button:hover .ql-fill, + .ql-bubble.ql-toolbar button:focus .ql-fill, + .ql-bubble .ql-toolbar button:focus .ql-fill, + .ql-bubble.ql-toolbar button.ql-active .ql-fill, + .ql-bubble .ql-toolbar button.ql-active .ql-fill, + .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill, + .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill, + .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill, + .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill, + .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill, + .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill, + .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill, + .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill, + .ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, + .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #fff; + } + + .ql-bubble.ql-toolbar button:hover .ql-stroke, + .ql-bubble .ql-toolbar button:hover .ql-stroke, + .ql-bubble.ql-toolbar button:focus .ql-stroke, + .ql-bubble .ql-toolbar button:focus .ql-stroke, + .ql-bubble.ql-toolbar button.ql-active .ql-stroke, + .ql-bubble .ql-toolbar button.ql-active .ql-stroke, + .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke, + .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke, + .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke, + .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke, + .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke, + .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke, + .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, + .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, + .ql-bubble.ql-toolbar button:hover .ql-stroke-miter, + .ql-bubble .ql-toolbar button:hover .ql-stroke-miter, + .ql-bubble.ql-toolbar button:focus .ql-stroke-miter, + .ql-bubble .ql-toolbar button:focus .ql-stroke-miter, + .ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter, + .ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter, + .ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, + .ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, + .ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, + .ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, + .ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, + .ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, + .ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, + .ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #fff; + } + +@media (pointer: coarse) { + .ql-bubble.ql-toolbar button:hover:not(.ql-active), + .ql-bubble .ql-toolbar button:hover:not(.ql-active) { + color: #ccc; + } + + .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #ccc; + } + + .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #ccc; + } +} + +.ql-bubble { + box-sizing: border-box; +} + + .ql-bubble * { + box-sizing: border-box; + } + + .ql-bubble .ql-hidden { + display: none; + } + + .ql-bubble .ql-out-bottom, + .ql-bubble .ql-out-top { + visibility: hidden; + } + + .ql-bubble .ql-tooltip { + position: absolute; + transform: translateY(10px); + } + + .ql-bubble .ql-tooltip a { + cursor: pointer; + text-decoration: none; + } + + .ql-bubble .ql-tooltip.ql-flip { + transform: translateY(-10px); + } + + .ql-bubble .ql-formats { + display: inline-block; + vertical-align: middle; + } + + .ql-bubble .ql-formats:after { + clear: both; + content: ''; + display: table; + } + + .ql-bubble .ql-stroke { + fill: none; + stroke: #ccc; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; + } + + .ql-bubble .ql-stroke-miter { + fill: none; + stroke: #ccc; + stroke-miterlimit: 10; + stroke-width: 2; + } + + .ql-bubble .ql-fill, + .ql-bubble .ql-stroke.ql-fill { + fill: #ccc; + } + + .ql-bubble .ql-empty { + fill: none; + } + + .ql-bubble .ql-even { + fill-rule: evenodd; + } + + .ql-bubble .ql-thin, + .ql-bubble .ql-stroke.ql-thin { + stroke-width: 1; + } + + .ql-bubble .ql-transparent { + opacity: 0.4; + } + + .ql-bubble .ql-direction svg:last-child { + display: none; + } + + .ql-bubble .ql-direction.ql-active svg:last-child { + display: inline; + } + + .ql-bubble .ql-direction.ql-active svg:first-child { + display: none; + } + + .ql-bubble .ql-editor h1 { + font-size: 2em; + } + + .ql-bubble .ql-editor h2 { + font-size: 1.5em; + } + + .ql-bubble .ql-editor h3 { + font-size: 1.17em; + } + + .ql-bubble .ql-editor h4 { + font-size: 1em; + } + + .ql-bubble .ql-editor h5 { + font-size: 0.83em; + } + + .ql-bubble .ql-editor h6 { + font-size: 0.67em; + } + + .ql-bubble .ql-editor a { + text-decoration: underline; + } + + .ql-bubble .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; + } + + .ql-bubble .ql-editor code, + .ql-bubble .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; + } + + .ql-bubble .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; + } + + .ql-bubble .ql-editor code { + font-size: 85%; + padding: 2px 4px; + } + + .ql-bubble .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; + } + + .ql-bubble .ql-editor img { + max-width: 100%; + } + + .ql-bubble .ql-picker { + color: #ccc; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; + } + + .ql-bubble .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; + } + + .ql-bubble .ql-picker-label::before { + display: inline-block; + line-height: 22px; + } + + .ql-bubble .ql-picker-options { + background-color: #444; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; + } + + .ql-bubble .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; + } + + .ql-bubble .ql-picker.ql-expanded .ql-picker-label { + color: #777; + z-index: 2; + } + + .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #777; + } + + .ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #777; + } + + .ql-bubble .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; + } + + .ql-bubble .ql-color-picker, + .ql-bubble .ql-icon-picker { + width: 28px; + } + + .ql-bubble .ql-color-picker .ql-picker-label, + .ql-bubble .ql-icon-picker .ql-picker-label { + padding: 2px 4px; + } + + .ql-bubble .ql-color-picker .ql-picker-label svg, + .ql-bubble .ql-icon-picker .ql-picker-label svg { + right: 4px; + } + + .ql-bubble .ql-icon-picker .ql-picker-options { + padding: 4px 0px; + } + + .ql-bubble .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; + } + + .ql-bubble .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; + } + + .ql-bubble .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; + } + + .ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, + .ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); + } + + .ql-bubble .ql-picker.ql-header { + width: 98px; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; + } + + .ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; + } + + .ql-bubble .ql-picker.ql-font { + width: 108px; + } + + .ql-bubble .ql-picker.ql-font .ql-picker-label::before, + .ql-bubble .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; + } + + .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, + .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; + } + + .ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, + .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; + } + + .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; + } + + .ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; + } + + .ql-bubble .ql-picker.ql-size { + width: 98px; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-label::before, + .ql-bubble .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before, + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before, + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; + } + + .ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; + } + + .ql-bubble .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; + } + + .ql-bubble .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; + } + + .ql-bubble .ql-toolbar .ql-formats { + margin: 8px 12px 8px 0px; + } + + .ql-bubble .ql-toolbar .ql-formats:first-child { + margin-left: 12px; + } + + .ql-bubble .ql-color-picker svg { + margin: 1px; + } + + .ql-bubble .ql-color-picker .ql-picker-item.ql-selected, + .ql-bubble .ql-color-picker .ql-picker-item:hover { + border-color: #fff; + } + + .ql-bubble .ql-tooltip { + background-color: #444; + border-radius: 25px; + color: #fff; + } + + .ql-bubble .ql-tooltip-arrow { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + content: " "; + display: block; + left: 50%; + margin-left: -6px; + position: absolute; + } + + .ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow { + border-bottom: 6px solid #444; + top: -6px; + } + + .ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow { + border-top: 6px solid #444; + bottom: -6px; + } + + .ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor { + display: block; + } + + .ql-bubble .ql-tooltip.ql-editing .ql-formats { + visibility: hidden; + } + + .ql-bubble .ql-tooltip-editor { + display: none; + } + + .ql-bubble .ql-tooltip-editor input[type=text] { + background: transparent; + border: none; + color: #fff; + font-size: 13px; + height: 100%; + outline: none; + padding: 10px 20px; + position: absolute; + width: 100%; + } + + .ql-bubble .ql-tooltip-editor a { + top: 10px; + position: absolute; + right: 20px; + } + + .ql-bubble .ql-tooltip-editor a:before { + color: #ccc; + content: "\D7"; + font-size: 16px; + font-weight: bold; + } + +.ql-container.ql-bubble:not(.ql-disabled) a { + position: relative; + white-space: nowrap; +} + + .ql-container.ql-bubble:not(.ql-disabled) a::before { + background-color: #444; + border-radius: 15px; + top: -5px; + font-size: 12px; + color: #fff; + content: attr(href); + font-weight: normal; + overflow: hidden; + padding: 5px 15px; + text-decoration: none; + z-index: 1; + } + + .ql-container.ql-bubble:not(.ql-disabled) a::after { + border-top: 6px solid #444; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + top: 0; + content: " "; + height: 0; + width: 0; + } + + .ql-container.ql-bubble:not(.ql-disabled) a::before, + .ql-container.ql-bubble:not(.ql-disabled) a::after { + left: 0; + margin-left: 50%; + position: absolute; + transform: translate(-50%, -100%); + transition: visibility 0s ease 200ms; + visibility: hidden; + } + + .ql-container.ql-bubble:not(.ql-disabled) a:hover::before, + .ql-container.ql-bubble:not(.ql-disabled) a:hover::after { + visibility: visible; + } diff --git a/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css new file mode 100644 index 00000000..31ffab18 --- /dev/null +++ b/Oqtane.Server/wwwroot/css/quill/quill1.3.7.snow.css @@ -0,0 +1,1170 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +.ql-container { + box-sizing: border-box; + font-family: Helvetica, Arial, sans-serif; + font-size: 13px; + height: 100%; + margin: 0px; + position: relative; +} + + .ql-container.ql-disabled .ql-tooltip { + visibility: hidden; + } + + .ql-container.ql-disabled .ql-editor ul[data-checked] > li::before { + pointer-events: none; + } + +.ql-clipboard { + left: -100000px; + height: 1px; + overflow-y: hidden; + position: absolute; + top: 50%; +} + + .ql-clipboard p { + margin: 0; + padding: 0; + } + +.ql-editor { + box-sizing: border-box; + line-height: 1.42; + height: 100%; + outline: none; + overflow-y: auto; + padding: 12px 15px; + tab-size: 4; + -moz-tab-size: 4; + text-align: left; + white-space: pre-wrap; + word-wrap: break-word; +} + + .ql-editor > * { + cursor: text; + } + + .ql-editor p, + .ql-editor ol, + .ql-editor ul, + .ql-editor pre, + .ql-editor blockquote, + .ql-editor h1, + .ql-editor h2, + .ql-editor h3, + .ql-editor h4, + .ql-editor h5, + .ql-editor h6 { + margin: 0; + padding: 0; + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol, + .ql-editor ul { + padding-left: 1.5em; + } + + .ql-editor ol > li, + .ql-editor ul > li { + list-style-type: none; + } + + .ql-editor ul > li::before { + content: '\2022'; + } + + .ql-editor ul[data-checked=true], + .ql-editor ul[data-checked=false] { + pointer-events: none; + } + + .ql-editor ul[data-checked=true] > li *, + .ql-editor ul[data-checked=false] > li * { + pointer-events: all; + } + + .ql-editor ul[data-checked=true] > li::before, + .ql-editor ul[data-checked=false] > li::before { + color: #777; + cursor: pointer; + pointer-events: all; + } + + .ql-editor ul[data-checked=true] > li::before { + content: '\2611'; + } + + .ql-editor ul[data-checked=false] > li::before { + content: '\2610'; + } + + .ql-editor li::before { + display: inline-block; + white-space: nowrap; + width: 1.2em; + } + + .ql-editor li:not(.ql-direction-rtl)::before { + margin-left: -1.5em; + margin-right: 0.3em; + text-align: right; + } + + .ql-editor li.ql-direction-rtl::before { + margin-left: 0.3em; + margin-right: -1.5em; + } + + .ql-editor ol li:not(.ql-direction-rtl), + .ql-editor ul li:not(.ql-direction-rtl) { + padding-left: 1.5em; + } + + .ql-editor ol li.ql-direction-rtl, + .ql-editor ul li.ql-direction-rtl { + padding-right: 1.5em; + } + + .ql-editor ol li { + counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + counter-increment: list-0; + } + + .ql-editor ol li:before { + content: counter(list-0, decimal) '. '; + } + + .ql-editor ol li.ql-indent-1 { + counter-increment: list-1; + } + + .ql-editor ol li.ql-indent-1:before { + content: counter(list-1, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-1 { + counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-2 { + counter-increment: list-2; + } + + .ql-editor ol li.ql-indent-2:before { + content: counter(list-2, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-2 { + counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-3 { + counter-increment: list-3; + } + + .ql-editor ol li.ql-indent-3:before { + content: counter(list-3, decimal) '. '; + } + + .ql-editor ol li.ql-indent-3 { + counter-reset: list-4 list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-4 { + counter-increment: list-4; + } + + .ql-editor ol li.ql-indent-4:before { + content: counter(list-4, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-4 { + counter-reset: list-5 list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-5 { + counter-increment: list-5; + } + + .ql-editor ol li.ql-indent-5:before { + content: counter(list-5, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-5 { + counter-reset: list-6 list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-6 { + counter-increment: list-6; + } + + .ql-editor ol li.ql-indent-6:before { + content: counter(list-6, decimal) '. '; + } + + .ql-editor ol li.ql-indent-6 { + counter-reset: list-7 list-8 list-9; + } + + .ql-editor ol li.ql-indent-7 { + counter-increment: list-7; + } + + .ql-editor ol li.ql-indent-7:before { + content: counter(list-7, lower-alpha) '. '; + } + + .ql-editor ol li.ql-indent-7 { + counter-reset: list-8 list-9; + } + + .ql-editor ol li.ql-indent-8 { + counter-increment: list-8; + } + + .ql-editor ol li.ql-indent-8:before { + content: counter(list-8, lower-roman) '. '; + } + + .ql-editor ol li.ql-indent-8 { + counter-reset: list-9; + } + + .ql-editor ol li.ql-indent-9 { + counter-increment: list-9; + } + + .ql-editor ol li.ql-indent-9:before { + content: counter(list-9, decimal) '. '; + } + + .ql-editor .ql-indent-1:not(.ql-direction-rtl) { + padding-left: 3em; + } + + .ql-editor li.ql-indent-1:not(.ql-direction-rtl) { + padding-left: 4.5em; + } + + .ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 3em; + } + + .ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right { + padding-right: 4.5em; + } + + .ql-editor .ql-indent-2:not(.ql-direction-rtl) { + padding-left: 6em; + } + + .ql-editor li.ql-indent-2:not(.ql-direction-rtl) { + padding-left: 7.5em; + } + + .ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 6em; + } + + .ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right { + padding-right: 7.5em; + } + + .ql-editor .ql-indent-3:not(.ql-direction-rtl) { + padding-left: 9em; + } + + .ql-editor li.ql-indent-3:not(.ql-direction-rtl) { + padding-left: 10.5em; + } + + .ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 9em; + } + + .ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right { + padding-right: 10.5em; + } + + .ql-editor .ql-indent-4:not(.ql-direction-rtl) { + padding-left: 12em; + } + + .ql-editor li.ql-indent-4:not(.ql-direction-rtl) { + padding-left: 13.5em; + } + + .ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 12em; + } + + .ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right { + padding-right: 13.5em; + } + + .ql-editor .ql-indent-5:not(.ql-direction-rtl) { + padding-left: 15em; + } + + .ql-editor li.ql-indent-5:not(.ql-direction-rtl) { + padding-left: 16.5em; + } + + .ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 15em; + } + + .ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right { + padding-right: 16.5em; + } + + .ql-editor .ql-indent-6:not(.ql-direction-rtl) { + padding-left: 18em; + } + + .ql-editor li.ql-indent-6:not(.ql-direction-rtl) { + padding-left: 19.5em; + } + + .ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 18em; + } + + .ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right { + padding-right: 19.5em; + } + + .ql-editor .ql-indent-7:not(.ql-direction-rtl) { + padding-left: 21em; + } + + .ql-editor li.ql-indent-7:not(.ql-direction-rtl) { + padding-left: 22.5em; + } + + .ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 21em; + } + + .ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right { + padding-right: 22.5em; + } + + .ql-editor .ql-indent-8:not(.ql-direction-rtl) { + padding-left: 24em; + } + + .ql-editor li.ql-indent-8:not(.ql-direction-rtl) { + padding-left: 25.5em; + } + + .ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 24em; + } + + .ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right { + padding-right: 25.5em; + } + + .ql-editor .ql-indent-9:not(.ql-direction-rtl) { + padding-left: 27em; + } + + .ql-editor li.ql-indent-9:not(.ql-direction-rtl) { + padding-left: 28.5em; + } + + .ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 27em; + } + + .ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right { + padding-right: 28.5em; + } + + .ql-editor .ql-video { + display: block; + max-width: 100%; + } + + .ql-editor .ql-video.ql-align-center { + margin: 0 auto; + } + + .ql-editor .ql-video.ql-align-right { + margin: 0 0 0 auto; + } + + .ql-editor .ql-bg-black { + background-color: #000; + } + + .ql-editor .ql-bg-red { + background-color: #e60000; + } + + .ql-editor .ql-bg-orange { + background-color: #f90; + } + + .ql-editor .ql-bg-yellow { + background-color: #ff0; + } + + .ql-editor .ql-bg-green { + background-color: #008a00; + } + + .ql-editor .ql-bg-blue { + background-color: #06c; + } + + .ql-editor .ql-bg-purple { + background-color: #93f; + } + + .ql-editor .ql-color-white { + color: #fff; + } + + .ql-editor .ql-color-red { + color: #e60000; + } + + .ql-editor .ql-color-orange { + color: #f90; + } + + .ql-editor .ql-color-yellow { + color: #ff0; + } + + .ql-editor .ql-color-green { + color: #008a00; + } + + .ql-editor .ql-color-blue { + color: #06c; + } + + .ql-editor .ql-color-purple { + color: #93f; + } + + .ql-editor .ql-font-serif { + font-family: Georgia, Times New Roman, serif; + } + + .ql-editor .ql-font-monospace { + font-family: Monaco, Courier New, monospace; + } + + .ql-editor .ql-size-small { + font-size: 0.75em; + } + + .ql-editor .ql-size-large { + font-size: 1.5em; + } + + .ql-editor .ql-size-huge { + font-size: 2.5em; + } + + .ql-editor .ql-direction-rtl { + direction: rtl; + text-align: inherit; + } + + .ql-editor .ql-align-center { + text-align: center; + } + + .ql-editor .ql-align-justify { + text-align: justify; + } + + .ql-editor .ql-align-right { + text-align: right; + } + + .ql-editor.ql-blank::before { + color: rgba(0,0,0,0.6); + content: attr(data-placeholder); + font-style: italic; + left: 15px; + pointer-events: none; + position: absolute; + right: 15px; + } + +.ql-snow.ql-toolbar:after, +.ql-snow .ql-toolbar:after { + clear: both; + content: ''; + display: table; +} + +.ql-snow.ql-toolbar button, +.ql-snow .ql-toolbar button { + background: none; + border: none; + cursor: pointer; + display: inline-block; + float: left; + height: 24px; + padding: 3px 5px; + width: 28px; +} + + .ql-snow.ql-toolbar button svg, + .ql-snow .ql-toolbar button svg { + float: left; + height: 100%; + } + + .ql-snow.ql-toolbar button:active:hover, + .ql-snow .ql-toolbar button:active:hover { + outline: none; + } + +.ql-snow.ql-toolbar input.ql-image[type=file], +.ql-snow .ql-toolbar input.ql-image[type=file] { + display: none; +} + +.ql-snow.ql-toolbar button:hover, +.ql-snow .ql-toolbar button:hover, +.ql-snow.ql-toolbar button:focus, +.ql-snow .ql-toolbar button:focus, +.ql-snow.ql-toolbar button.ql-active, +.ql-snow .ql-toolbar button.ql-active, +.ql-snow.ql-toolbar .ql-picker-label:hover, +.ql-snow .ql-toolbar .ql-picker-label:hover, +.ql-snow.ql-toolbar .ql-picker-label.ql-active, +.ql-snow .ql-toolbar .ql-picker-label.ql-active, +.ql-snow.ql-toolbar .ql-picker-item:hover, +.ql-snow .ql-toolbar .ql-picker-item:hover, +.ql-snow.ql-toolbar .ql-picker-item.ql-selected, +.ql-snow .ql-toolbar .ql-picker-item.ql-selected { + color: #06c; +} + + .ql-snow.ql-toolbar button:hover .ql-fill, + .ql-snow .ql-toolbar button:hover .ql-fill, + .ql-snow.ql-toolbar button:focus .ql-fill, + .ql-snow .ql-toolbar button:focus .ql-fill, + .ql-snow.ql-toolbar button.ql-active .ql-fill, + .ql-snow .ql-toolbar button.ql-active .ql-fill, + .ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill, + .ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill, + .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill, + .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill, + .ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill, + .ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill, + .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill, + .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill, + .ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill, + .ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill, + .ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill, + .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, + .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill, + .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, + .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill, + .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, + .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill, + .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill, + .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill { + fill: #06c; + } + + .ql-snow.ql-toolbar button:hover .ql-stroke, + .ql-snow .ql-toolbar button:hover .ql-stroke, + .ql-snow.ql-toolbar button:focus .ql-stroke, + .ql-snow .ql-toolbar button:focus .ql-stroke, + .ql-snow.ql-toolbar button.ql-active .ql-stroke, + .ql-snow .ql-toolbar button.ql-active .ql-stroke, + .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke, + .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke, + .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke, + .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke, + .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke, + .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke, + .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke, + .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke, + .ql-snow.ql-toolbar button:hover .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover .ql-stroke-miter, + .ql-snow.ql-toolbar button:focus .ql-stroke-miter, + .ql-snow .ql-toolbar button:focus .ql-stroke-miter, + .ql-snow.ql-toolbar button.ql-active .ql-stroke-miter, + .ql-snow .ql-toolbar button.ql-active .ql-stroke-miter, + .ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter, + .ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter, + .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, + .ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter, + .ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter, + .ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter, + .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter, + .ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter { + stroke: #06c; + } + +@media (pointer: coarse) { + .ql-snow.ql-toolbar button:hover:not(.ql-active), + .ql-snow .ql-toolbar button:hover:not(.ql-active) { + color: #444; + } + + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill { + fill: #444; + } + + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke, + .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter, + .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter { + stroke: #444; + } +} + +.ql-snow { + box-sizing: border-box; +} + + .ql-snow * { + box-sizing: border-box; + } + + .ql-snow .ql-hidden { + display: none; + } + + .ql-snow .ql-out-bottom, + .ql-snow .ql-out-top { + visibility: hidden; + } + + .ql-snow .ql-tooltip { + position: absolute; + transform: translateY(10px); + } + + .ql-snow .ql-tooltip a { + cursor: pointer; + text-decoration: none; + } + + .ql-snow .ql-tooltip.ql-flip { + transform: translateY(-10px); + } + + .ql-snow .ql-formats { + display: inline-block; + vertical-align: middle; + } + + .ql-snow .ql-formats:after { + clear: both; + content: ''; + display: table; + } + + .ql-snow .ql-stroke { + fill: none; + stroke: #444; + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2; + } + + .ql-snow .ql-stroke-miter { + fill: none; + stroke: #444; + stroke-miterlimit: 10; + stroke-width: 2; + } + + .ql-snow .ql-fill, + .ql-snow .ql-stroke.ql-fill { + fill: #444; + } + + .ql-snow .ql-empty { + fill: none; + } + + .ql-snow .ql-even { + fill-rule: evenodd; + } + + .ql-snow .ql-thin, + .ql-snow .ql-stroke.ql-thin { + stroke-width: 1; + } + + .ql-snow .ql-transparent { + opacity: 0.4; + } + + .ql-snow .ql-direction svg:last-child { + display: none; + } + + .ql-snow .ql-direction.ql-active svg:last-child { + display: inline; + } + + .ql-snow .ql-direction.ql-active svg:first-child { + display: none; + } + + .ql-snow .ql-editor h1 { + font-size: 2em; + } + + .ql-snow .ql-editor h2 { + font-size: 1.5em; + } + + .ql-snow .ql-editor h3 { + font-size: 1.17em; + } + + .ql-snow .ql-editor h4 { + font-size: 1em; + } + + .ql-snow .ql-editor h5 { + font-size: 0.83em; + } + + .ql-snow .ql-editor h6 { + font-size: 0.67em; + } + + .ql-snow .ql-editor a { + text-decoration: underline; + } + + .ql-snow .ql-editor blockquote { + border-left: 4px solid #ccc; + margin-bottom: 5px; + margin-top: 5px; + padding-left: 16px; + } + + .ql-snow .ql-editor code, + .ql-snow .ql-editor pre { + background-color: #f0f0f0; + border-radius: 3px; + } + + .ql-snow .ql-editor pre { + white-space: pre-wrap; + margin-bottom: 5px; + margin-top: 5px; + padding: 5px 10px; + } + + .ql-snow .ql-editor code { + font-size: 85%; + padding: 2px 4px; + } + + .ql-snow .ql-editor pre.ql-syntax { + background-color: #23241f; + color: #f8f8f2; + overflow: visible; + } + + .ql-snow .ql-editor img { + max-width: 100%; + } + + .ql-snow .ql-picker { + color: #444; + display: inline-block; + float: left; + font-size: 14px; + font-weight: 500; + height: 24px; + position: relative; + vertical-align: middle; + } + + .ql-snow .ql-picker-label { + cursor: pointer; + display: inline-block; + height: 100%; + padding-left: 8px; + padding-right: 2px; + position: relative; + width: 100%; + } + + .ql-snow .ql-picker-label::before { + display: inline-block; + line-height: 22px; + } + + .ql-snow .ql-picker-options { + background-color: #fff; + display: none; + min-width: 100%; + padding: 4px 8px; + position: absolute; + white-space: nowrap; + } + + .ql-snow .ql-picker-options .ql-picker-item { + cursor: pointer; + display: block; + padding-bottom: 5px; + padding-top: 5px; + } + + .ql-snow .ql-picker.ql-expanded .ql-picker-label { + color: #ccc; + z-index: 2; + } + + .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill { + fill: #ccc; + } + + .ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke { + stroke: #ccc; + } + + .ql-snow .ql-picker.ql-expanded .ql-picker-options { + display: block; + margin-top: -1px; + top: 100%; + z-index: 1; + } + + .ql-snow .ql-color-picker, + .ql-snow .ql-icon-picker { + width: 28px; + } + + .ql-snow .ql-color-picker .ql-picker-label, + .ql-snow .ql-icon-picker .ql-picker-label { + padding: 2px 4px; + } + + .ql-snow .ql-color-picker .ql-picker-label svg, + .ql-snow .ql-icon-picker .ql-picker-label svg { + right: 4px; + } + + .ql-snow .ql-icon-picker .ql-picker-options { + padding: 4px 0px; + } + + .ql-snow .ql-icon-picker .ql-picker-item { + height: 24px; + width: 24px; + padding: 2px 4px; + } + + .ql-snow .ql-color-picker .ql-picker-options { + padding: 3px 5px; + width: 152px; + } + + .ql-snow .ql-color-picker .ql-picker-item { + border: 1px solid transparent; + float: left; + height: 16px; + margin: 2px; + padding: 0px; + width: 16px; + } + + .ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg { + position: absolute; + margin-top: -9px; + right: 0; + top: 50%; + width: 18px; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before, + .ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before, + .ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before { + content: attr(data-label); + } + + .ql-snow .ql-picker.ql-header { + width: 98px; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label::before, + .ql-snow .ql-picker.ql-header .ql-picker-item::before { + content: 'Normal'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + content: 'Heading 1'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + content: 'Heading 2'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + content: 'Heading 3'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + content: 'Heading 4'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + content: 'Heading 5'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + content: 'Heading 6'; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { + font-size: 2em; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { + font-size: 1.5em; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { + font-size: 1.17em; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { + font-size: 1em; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { + font-size: 0.83em; + } + + .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { + font-size: 0.67em; + } + + .ql-snow .ql-picker.ql-font { + width: 108px; + } + + .ql-snow .ql-picker.ql-font .ql-picker-label::before, + .ql-snow .ql-picker.ql-font .ql-picker-item::before { + content: 'Sans Serif'; + } + + .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before, + .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + content: 'Serif'; + } + + .ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before, + .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + content: 'Monospace'; + } + + .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before { + font-family: Georgia, Times New Roman, serif; + } + + .ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before { + font-family: Monaco, Courier New, monospace; + } + + .ql-snow .ql-picker.ql-size { + width: 98px; + } + + .ql-snow .ql-picker.ql-size .ql-picker-label::before, + .ql-snow .ql-picker.ql-size .ql-picker-item::before { + content: 'Normal'; + } + + .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before, + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + content: 'Small'; + } + + .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before, + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + content: 'Large'; + } + + .ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before, + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + content: 'Huge'; + } + + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before { + font-size: 10px; + } + + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before { + font-size: 18px; + } + + .ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before { + font-size: 32px; + } + + .ql-snow .ql-color-picker.ql-background .ql-picker-item { + background-color: #fff; + } + + .ql-snow .ql-color-picker.ql-color .ql-picker-item { + background-color: #000; + } + +.ql-toolbar.ql-snow { + border: 1px solid #ccc; + box-sizing: border-box; + font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif; + padding: 8px; +} + + .ql-toolbar.ql-snow .ql-formats { + margin-right: 15px; + } + + .ql-toolbar.ql-snow .ql-picker-label { + border: 1px solid transparent; + } + + .ql-toolbar.ql-snow .ql-picker-options { + border: 1px solid transparent; + box-shadow: rgba(0,0,0,0.2) 0 2px 8px; + } + + .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label { + border-color: #ccc; + } + + .ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options { + border-color: #ccc; + } + + .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected, + .ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover { + border-color: #000; + } + + .ql-toolbar.ql-snow + .ql-container.ql-snow { + border-top: 0px; + } + +.ql-snow .ql-tooltip { + background-color: #fff; + border: 1px solid #ccc; + box-shadow: 0px 0px 5px #ddd; + color: #444; + padding: 5px 12px; + white-space: nowrap; +} + + .ql-snow .ql-tooltip::before { + content: "Visit URL:"; + line-height: 26px; + margin-right: 8px; + } + + .ql-snow .ql-tooltip input[type=text] { + display: none; + border: 1px solid #ccc; + font-size: 13px; + height: 26px; + margin: 0px; + padding: 3px 5px; + width: 170px; + } + + .ql-snow .ql-tooltip a.ql-preview { + display: inline-block; + max-width: 200px; + overflow-x: hidden; + text-overflow: ellipsis; + vertical-align: top; + } + + .ql-snow .ql-tooltip a.ql-action::after { + border-right: 1px solid #ccc; + content: 'Edit'; + margin-left: 16px; + padding-right: 8px; + } + + .ql-snow .ql-tooltip a.ql-remove::before { + content: 'Remove'; + margin-left: 8px; + } + + .ql-snow .ql-tooltip a { + line-height: 26px; + } + + .ql-snow .ql-tooltip.ql-editing a.ql-preview, + .ql-snow .ql-tooltip.ql-editing a.ql-remove { + display: none; + } + + .ql-snow .ql-tooltip.ql-editing input[type=text] { + display: inline-block; + } + + .ql-snow .ql-tooltip.ql-editing a.ql-action::after { + border-right: 0px; + content: 'Save'; + padding-right: 0px; + } + + .ql-snow .ql-tooltip[data-mode=link]::before { + content: "Enter link:"; + } + + .ql-snow .ql-tooltip[data-mode=formula]::before { + content: "Enter formula:"; + } + + .ql-snow .ql-tooltip[data-mode=video]::before { + content: "Enter video:"; + } + +.ql-snow a { + color: #06c; +} + +.ql-container.ql-snow { + border: 1px solid #ccc; +} diff --git a/Oqtane.Server/wwwroot/js/quill1.3.7.min.js b/Oqtane.Server/wwwroot/js/quill1.3.7.min.js new file mode 100644 index 00000000..c0d84f88 --- /dev/null +++ b/Oqtane.Server/wwwroot/js/quill1.3.7.min.js @@ -0,0 +1,8 @@ +/*! + * Quill Editor v1.3.7 + * https://quilljs.com/ + * Copyright (c) 2014, Jason Chen + * Copyright (c) 2013, salesforce.com + */ +!function (t, e) { "object" == typeof exports && "object" == typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define([], e) : "object" == typeof exports ? exports.Quill = e() : t.Quill = e() }("undefined" != typeof self ? self : this, function () { return function (t) { function e(r) { if (n[r]) return n[r].exports; var o = n[r] = { i: r, l: !1, exports: {} }; return t[r].call(o.exports, o, o.exports, e), o.l = !0, o.exports } var n = {}; return e.m = t, e.c = n, e.d = function (t, n, r) { e.o(t, n) || Object.defineProperty(t, n, { configurable: !1, enumerable: !0, get: r }) }, e.n = function (t) { var n = t && t.__esModule ? function () { return t.default } : function () { return t }; return e.d(n, "a", n), n }, e.o = function (t, e) { return Object.prototype.hasOwnProperty.call(t, e) }, e.p = "", e(e.s = 45) }([function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(17), o = n(18), i = n(19), l = n(48), a = n(49), s = n(50), u = n(51), c = n(52), f = n(11), h = n(29), p = n(30), d = n(28), y = n(1), v = { Scope: y.Scope, create: y.create, find: y.find, query: y.query, register: y.register, Container: r.default, Format: o.default, Leaf: i.default, Embed: u.default, Scroll: l.default, Block: s.default, Inline: a.default, Text: c.default, Attributor: { Attribute: f.default, Class: h.default, Style: p.default, Store: d.default } }; e.default = v }, function (t, e, n) { "use strict"; function r(t, e) { var n = i(t); if (null == n) throw new s("Unable to create " + t + " blot"); var r = n; return new r(t instanceof Node || t.nodeType === Node.TEXT_NODE ? t : r.create(e), e) } function o(t, n) { return void 0 === n && (n = !1), null == t ? null : null != t[e.DATA_KEY] ? t[e.DATA_KEY].blot : n ? o(t.parentNode, n) : null } function i(t, e) { void 0 === e && (e = p.ANY); var n; if ("string" == typeof t) n = h[t] || u[t]; else if (t instanceof Text || t.nodeType === Node.TEXT_NODE) n = h.text; else if ("number" == typeof t) t & p.LEVEL & p.BLOCK ? n = h.block : t & p.LEVEL & p.INLINE && (n = h.inline); else if (t instanceof HTMLElement) { var r = (t.getAttribute("class") || "").split(/\s+/); for (var o in r) if (n = c[r[o]]) break; n = n || f[t.tagName] } return null == n ? null : e & p.LEVEL & n.scope && e & p.TYPE & n.scope ? n : null } function l() { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; if (t.length > 1) return t.map(function (t) { return l(t) }); var n = t[0]; if ("string" != typeof n.blotName && "string" != typeof n.attrName) throw new s("Invalid definition"); if ("abstract" === n.blotName) throw new s("Cannot register abstract class"); if (h[n.blotName || n.attrName] = n, "string" == typeof n.keyName) u[n.keyName] = n; else if (null != n.className && (c[n.className] = n), null != n.tagName) { Array.isArray(n.tagName) ? n.tagName = n.tagName.map(function (t) { return t.toUpperCase() }) : n.tagName = n.tagName.toUpperCase(); var r = Array.isArray(n.tagName) ? n.tagName : [n.tagName]; r.forEach(function (t) { null != f[t] && null != n.className || (f[t] = n) }) } return n } var a = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var s = function (t) { function e(e) { var n = this; return e = "[Parchment] " + e, n = t.call(this, e) || this, n.message = e, n.name = n.constructor.name, n } return a(e, t), e }(Error); e.ParchmentError = s; var u = {}, c = {}, f = {}, h = {}; e.DATA_KEY = "__blot"; var p; !function (t) { t[t.TYPE = 3] = "TYPE", t[t.LEVEL = 12] = "LEVEL", t[t.ATTRIBUTE = 13] = "ATTRIBUTE", t[t.BLOT = 14] = "BLOT", t[t.INLINE = 7] = "INLINE", t[t.BLOCK = 11] = "BLOCK", t[t.BLOCK_BLOT = 10] = "BLOCK_BLOT", t[t.INLINE_BLOT = 6] = "INLINE_BLOT", t[t.BLOCK_ATTRIBUTE = 9] = "BLOCK_ATTRIBUTE", t[t.INLINE_ATTRIBUTE = 5] = "INLINE_ATTRIBUTE", t[t.ANY = 15] = "ANY" }(p = e.Scope || (e.Scope = {})), e.create = r, e.find = o, e.query = i, e.register = l }, function (t, e) { "use strict"; var n = Object.prototype.hasOwnProperty, r = Object.prototype.toString, o = Object.defineProperty, i = Object.getOwnPropertyDescriptor, l = function (t) { return "function" == typeof Array.isArray ? Array.isArray(t) : "[object Array]" === r.call(t) }, a = function (t) { if (!t || "[object Object]" !== r.call(t)) return !1; var e = n.call(t, "constructor"), o = t.constructor && t.constructor.prototype && n.call(t.constructor.prototype, "isPrototypeOf"); if (t.constructor && !e && !o) return !1; var i; for (i in t); return void 0 === i || n.call(t, i) }, s = function (t, e) { o && "__proto__" === e.name ? o(t, e.name, { enumerable: !0, configurable: !0, value: e.newValue, writable: !0 }) : t[e.name] = e.newValue }, u = function (t, e) { if ("__proto__" === e) { if (!n.call(t, e)) return; if (i) return i(t, e).value } return t[e] }; t.exports = function t() { var e, n, r, o, i, c, f = arguments[0], h = 1, p = arguments.length, d = !1; for ("boolean" == typeof f && (d = f, f = arguments[1] || {}, h = 2), (null == f || "object" != typeof f && "function" != typeof f) && (f = {}); h < p; ++h)if (null != (e = arguments[h])) for (n in e) r = u(f, n), o = u(e, n), f !== o && (d && o && (a(o) || (i = l(o))) ? (i ? (i = !1, c = r && l(r) ? r : []) : c = r && a(r) ? r : {}, s(f, { name: n, newValue: t(d, c, o) })) : void 0 !== o && s(f, { name: n, newValue: o })); return f } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; return null == t ? e : ("function" == typeof t.formats && (e = (0, f.default)(e, t.formats())), null == t.parent || "scroll" == t.parent.blotName || t.parent.statics.scope !== t.statics.scope ? e : a(t.parent, e)) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BlockEmbed = e.bubbleFormats = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(2), f = r(c), h = n(4), p = r(h), d = n(0), y = r(d), v = n(14), b = r(v), g = n(5), m = r(g), _ = n(8), O = r(_), w = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "attach", value: function () { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "attach", this).call(this), this.attributes = new y.default.Attributor.Store(this.domNode) } }, { key: "delta", value: function () { return (new p.default).insert(this.value(), (0, f.default)(this.formats(), this.attributes.values())) } }, { key: "format", value: function (t, e) { var n = y.default.query(t, y.default.Scope.BLOCK_ATTRIBUTE); null != n && this.attributes.attribute(n, e) } }, { key: "formatAt", value: function (t, e, n, r) { this.format(n, r) } }, { key: "insertAt", value: function (t, n, r) { if ("string" == typeof n && n.endsWith("\n")) { var o = y.default.create(x.blotName); this.parent.insertBefore(o, 0 === t ? this : this.next), o.insertAt(0, n.slice(0, -1)) } else u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r) } }]), e }(y.default.Embed); w.scope = y.default.Scope.BLOCK_BLOT; var x = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.cache = {}, n } return l(e, t), s(e, [{ key: "delta", value: function () { return null == this.cache.delta && (this.cache.delta = this.descendants(y.default.Leaf).reduce(function (t, e) { return 0 === e.length() ? t : t.insert(e.value(), a(e)) }, new p.default).insert("\n", a(this))), this.cache.delta } }, { key: "deleteAt", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), this.cache = {} } }, { key: "formatAt", value: function (t, n, r, o) { n <= 0 || (y.default.query(r, y.default.Scope.BLOCK) ? t + n === this.length() && this.format(r, o) : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, Math.min(n, this.length() - t - 1), r, o), this.cache = {}) } }, { key: "insertAt", value: function (t, n, r) { if (null != r) return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); if (0 !== n.length) { var o = n.split("\n"), i = o.shift(); i.length > 0 && (t < this.length() - 1 || null == this.children.tail ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, Math.min(t, this.length() - 1), i) : this.children.tail.insertAt(this.children.tail.length(), i), this.cache = {}); var l = this; o.reduce(function (t, e) { return l = l.split(t, !0), l.insertAt(0, e), e.length }, t + i.length) } } }, { key: "insertBefore", value: function (t, n) { var r = this.children.head; u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n), r instanceof b.default && r.remove(), this.cache = {} } }, { key: "length", value: function () { return null == this.cache.length && (this.cache.length = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "length", this).call(this) + 1), this.cache.length } }, { key: "moveChildren", value: function (t, n) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "moveChildren", this).call(this, t, n), this.cache = {} } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.cache = {} } }, { key: "path", value: function (t) { return u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t, !0) } }, { key: "removeChild", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "removeChild", this).call(this, t), this.cache = {} } }, { key: "split", value: function (t) { var n = arguments.length > 1 && void 0 !== arguments[1] && arguments[1]; if (n && (0 === t || t >= this.length() - 1)) { var r = this.clone(); return 0 === t ? (this.parent.insertBefore(r, this), this) : (this.parent.insertBefore(r, this.next), r) } var o = u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "split", this).call(this, t, n); return this.cache = {}, o } }]), e }(y.default.Block); x.blotName = "block", x.tagName = "P", x.defaultChild = "break", x.allowedChildren = [m.default, y.default.Embed, O.default], e.bubbleFormats = a, e.BlockEmbed = w, e.default = x }, function (t, e, n) { var r = n(54), o = n(12), i = n(2), l = n(20), a = String.fromCharCode(0), s = function (t) { Array.isArray(t) ? this.ops = t : null != t && Array.isArray(t.ops) ? this.ops = t.ops : this.ops = [] }; s.prototype.insert = function (t, e) { var n = {}; return 0 === t.length ? this : (n.insert = t, null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n)) }, s.prototype.delete = function (t) { return t <= 0 ? this : this.push({ delete: t }) }, s.prototype.retain = function (t, e) { if (t <= 0) return this; var n = { retain: t }; return null != e && "object" == typeof e && Object.keys(e).length > 0 && (n.attributes = e), this.push(n) }, s.prototype.push = function (t) { var e = this.ops.length, n = this.ops[e - 1]; if (t = i(!0, {}, t), "object" == typeof n) { if ("number" == typeof t.delete && "number" == typeof n.delete) return this.ops[e - 1] = { delete: n.delete + t.delete }, this; if ("number" == typeof n.delete && null != t.insert && (e -= 1, "object" != typeof (n = this.ops[e - 1]))) return this.ops.unshift(t), this; if (o(t.attributes, n.attributes)) { if ("string" == typeof t.insert && "string" == typeof n.insert) return this.ops[e - 1] = { insert: n.insert + t.insert }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this; if ("number" == typeof t.retain && "number" == typeof n.retain) return this.ops[e - 1] = { retain: n.retain + t.retain }, "object" == typeof t.attributes && (this.ops[e - 1].attributes = t.attributes), this } } return e === this.ops.length ? this.ops.push(t) : this.ops.splice(e, 0, t), this }, s.prototype.chop = function () { var t = this.ops[this.ops.length - 1]; return t && t.retain && !t.attributes && this.ops.pop(), this }, s.prototype.filter = function (t) { return this.ops.filter(t) }, s.prototype.forEach = function (t) { this.ops.forEach(t) }, s.prototype.map = function (t) { return this.ops.map(t) }, s.prototype.partition = function (t) { var e = [], n = []; return this.forEach(function (r) { (t(r) ? e : n).push(r) }), [e, n] }, s.prototype.reduce = function (t, e) { return this.ops.reduce(t, e) }, s.prototype.changeLength = function () { return this.reduce(function (t, e) { return e.insert ? t + l.length(e) : e.delete ? t - e.delete : t }, 0) }, s.prototype.length = function () { return this.reduce(function (t, e) { return t + l.length(e) }, 0) }, s.prototype.slice = function (t, e) { t = t || 0, "number" != typeof e && (e = 1 / 0); for (var n = [], r = l.iterator(this.ops), o = 0; o < e && r.hasNext();) { var i; o < t ? i = r.next(t - o) : (i = r.next(e - o), n.push(i)), o += l.length(i) } return new s(n) }, s.prototype.compose = function (t) { var e = l.iterator(this.ops), n = l.iterator(t.ops), r = [], i = n.peek(); if (null != i && "number" == typeof i.retain && null == i.attributes) { for (var a = i.retain; "insert" === e.peekType() && e.peekLength() <= a;)a -= e.peekLength(), r.push(e.next()); i.retain - a > 0 && n.next(i.retain - a) } for (var u = new s(r); e.hasNext() || n.hasNext();)if ("insert" === n.peekType()) u.push(n.next()); else if ("delete" === e.peekType()) u.push(e.next()); else { var c = Math.min(e.peekLength(), n.peekLength()), f = e.next(c), h = n.next(c); if ("number" == typeof h.retain) { var p = {}; "number" == typeof f.retain ? p.retain = c : p.insert = f.insert; var d = l.attributes.compose(f.attributes, h.attributes, "number" == typeof f.retain); if (d && (p.attributes = d), u.push(p), !n.hasNext() && o(u.ops[u.ops.length - 1], p)) { var y = new s(e.rest()); return u.concat(y).chop() } } else "number" == typeof h.delete && "number" == typeof f.retain && u.push(h) } return u.chop() }, s.prototype.concat = function (t) { var e = new s(this.ops.slice()); return t.ops.length > 0 && (e.push(t.ops[0]), e.ops = e.ops.concat(t.ops.slice(1))), e }, s.prototype.diff = function (t, e) { if (this.ops === t.ops) return new s; var n = [this, t].map(function (e) { return e.map(function (n) { if (null != n.insert) return "string" == typeof n.insert ? n.insert : a; var r = e === t ? "on" : "with"; throw new Error("diff() called " + r + " non-document") }).join("") }), i = new s, u = r(n[0], n[1], e), c = l.iterator(this.ops), f = l.iterator(t.ops); return u.forEach(function (t) { for (var e = t[1].length; e > 0;) { var n = 0; switch (t[0]) { case r.INSERT: n = Math.min(f.peekLength(), e), i.push(f.next(n)); break; case r.DELETE: n = Math.min(e, c.peekLength()), c.next(n), i.delete(n); break; case r.EQUAL: n = Math.min(c.peekLength(), f.peekLength(), e); var a = c.next(n), s = f.next(n); o(a.insert, s.insert) ? i.retain(n, l.attributes.diff(a.attributes, s.attributes)) : i.push(s).delete(n) }e -= n } }), i.chop() }, s.prototype.eachLine = function (t, e) { e = e || "\n"; for (var n = l.iterator(this.ops), r = new s, o = 0; n.hasNext();) { if ("insert" !== n.peekType()) return; var i = n.peek(), a = l.length(i) - n.peekLength(), u = "string" == typeof i.insert ? i.insert.indexOf(e, a) - a : -1; if (u < 0) r.push(n.next()); else if (u > 0) r.push(n.next(u)); else { if (!1 === t(r, n.next(1).attributes || {}, o)) return; o += 1, r = new s } } r.length() > 0 && t(r, {}, o) }, s.prototype.transform = function (t, e) { if (e = !!e, "number" == typeof t) return this.transformPosition(t, e); for (var n = l.iterator(this.ops), r = l.iterator(t.ops), o = new s; n.hasNext() || r.hasNext();)if ("insert" !== n.peekType() || !e && "insert" === r.peekType()) if ("insert" === r.peekType()) o.push(r.next()); else { var i = Math.min(n.peekLength(), r.peekLength()), a = n.next(i), u = r.next(i); if (a.delete) continue; u.delete ? o.push(u) : o.retain(i, l.attributes.transform(a.attributes, u.attributes, e)) } else o.retain(l.length(n.next())); return o.chop() }, s.prototype.transformPosition = function (t, e) { e = !!e; for (var n = l.iterator(this.ops), r = 0; n.hasNext() && r <= t;) { var o = n.peekLength(), i = n.peekType(); n.next(), "delete" !== i ? ("insert" === i && (r < t || !e) && (t += o), r += o) : t -= Math.min(o, t - r) } return t }, t.exports = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(8), c = r(u), f = n(0), h = r(f), p = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "formatAt", value: function (t, n, r, o) { if (e.compare(this.statics.blotName, r) < 0 && h.default.query(r, h.default.Scope.BLOT)) { var i = this.isolate(t, n); o && i.wrap(r, o) } else s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o) } }, { key: "optimize", value: function (t) { if (s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.parent instanceof e && e.compare(this.statics.blotName, this.parent.statics.blotName) > 0) { var n = this.parent.isolate(this.offset(), this.length()); this.moveChildren(n), n.wrap(this) } } }], [{ key: "compare", value: function (t, n) { var r = e.order.indexOf(t), o = e.order.indexOf(n); return r >= 0 || o >= 0 ? r - o : t === n ? 0 : t < n ? -1 : 1 } }]), e }(h.default.Inline); p.allowedChildren = [p, h.default.Embed, c.default], p.order = ["cursor", "inline", "underline", "strike", "italic", "bold", "script", "link", "code"], e.default = p }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (e = (0, N.default)(!0, { container: t, modules: { clipboard: !0, keyboard: !0, history: !0 } }, e), e.theme && e.theme !== S.DEFAULTS.theme) { if (e.theme = S.import("themes/" + e.theme), null == e.theme) throw new Error("Invalid theme " + e.theme + ". Did you register it?") } else e.theme = T.default; var n = (0, N.default)(!0, {}, e.theme.DEFAULTS);[n, e].forEach(function (t) { t.modules = t.modules || {}, Object.keys(t.modules).forEach(function (e) { !0 === t.modules[e] && (t.modules[e] = {}) }) }); var r = Object.keys(n.modules).concat(Object.keys(e.modules)), o = r.reduce(function (t, e) { var n = S.import("modules/" + e); return null == n ? P.error("Cannot load " + e + " module. Are you sure you registered it?") : t[e] = n.DEFAULTS || {}, t }, {}); return null != e.modules && e.modules.toolbar && e.modules.toolbar.constructor !== Object && (e.modules.toolbar = { container: e.modules.toolbar }), e = (0, N.default)(!0, {}, S.DEFAULTS, { modules: o }, n, e), ["bounds", "container", "scrollingContainer"].forEach(function (t) { "string" == typeof e[t] && (e[t] = document.querySelector(e[t])) }), e.modules = Object.keys(e.modules).reduce(function (t, n) { return e.modules[n] && (t[n] = e.modules[n]), t }, {}), e } function a(t, e, n, r) { if (this.options.strict && !this.isEnabled() && e === g.default.sources.USER) return new d.default; var o = null == n ? null : this.getSelection(), i = this.editor.delta, l = t(); if (null != o && (!0 === n && (n = o.index), null == r ? o = u(o, l, e) : 0 !== r && (o = u(o, n, r, e)), this.setSelection(o, g.default.sources.SILENT)), l.length() > 0) { var a, s = [g.default.events.TEXT_CHANGE, l, i, e]; if ((a = this.emitter).emit.apply(a, [g.default.events.EDITOR_CHANGE].concat(s)), e !== g.default.sources.SILENT) { var c; (c = this.emitter).emit.apply(c, s) } } return l } function s(t, e, n, r, o) { var i = {}; return "number" == typeof t.index && "number" == typeof t.length ? "number" != typeof e ? (o = r, r = n, n = e, e = t.length, t = t.index) : (e = t.length, t = t.index) : "number" != typeof e && (o = r, r = n, n = e, e = 0), "object" === (void 0 === n ? "undefined" : c(n)) ? (i = n, o = r) : "string" == typeof n && (null != r ? i[n] = r : o = n), o = o || g.default.sources.API, [t, e, i, o] } function u(t, e, n, r) { if (null == t) return null; var o = void 0, i = void 0; if (e instanceof d.default) { var l = [t.index, t.index + t.length].map(function (t) { return e.transformPosition(t, r !== g.default.sources.USER) }), a = f(l, 2); o = a[0], i = a[1] } else { var s = [t.index, t.index + t.length].map(function (t) { return t < e || t === e && r === g.default.sources.USER ? t : n >= 0 ? t + n : Math.max(e, t + n) }), u = f(s, 2); o = u[0], i = u[1] } return new x.Range(o, i - o) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.overload = e.expandConfig = void 0; var c = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(); n(53); var p = n(4), d = r(p), y = n(57), v = r(y), b = n(9), g = r(b), m = n(7), _ = r(m), O = n(0), w = r(O), x = n(22), k = r(x), E = n(2), N = r(E), j = n(10), A = r(j), q = n(32), T = r(q), P = (0, A.default)("quill"), S = function () { function t(e) { var n = this, r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; if (i(this, t), this.options = l(e, r), this.container = this.options.container, null == this.container) return P.error("Invalid Quill container", e); this.options.debug && t.debug(this.options.debug); var o = this.container.innerHTML.trim(); this.container.classList.add("ql-container"), this.container.innerHTML = "", this.container.__quill = this, this.root = this.addContainer("ql-editor"), this.root.classList.add("ql-blank"), this.root.setAttribute("data-gramm", !1), this.scrollingContainer = this.options.scrollingContainer || this.root, this.emitter = new g.default, this.scroll = w.default.create(this.root, { emitter: this.emitter, whitelist: this.options.formats }), this.editor = new v.default(this.scroll), this.selection = new k.default(this.scroll, this.emitter), this.theme = new this.options.theme(this, this.options), this.keyboard = this.theme.addModule("keyboard"), this.clipboard = this.theme.addModule("clipboard"), this.history = this.theme.addModule("history"), this.theme.init(), this.emitter.on(g.default.events.EDITOR_CHANGE, function (t) { t === g.default.events.TEXT_CHANGE && n.root.classList.toggle("ql-blank", n.editor.isBlank()) }), this.emitter.on(g.default.events.SCROLL_UPDATE, function (t, e) { var r = n.selection.lastRange, o = r && 0 === r.length ? r.index : void 0; a.call(n, function () { return n.editor.update(null, e, o) }, t) }); var s = this.clipboard.convert("
" + o + "


"); this.setContents(s), this.history.clear(), this.options.placeholder && this.root.setAttribute("data-placeholder", this.options.placeholder), this.options.readOnly && this.disable() } return h(t, null, [{ key: "debug", value: function (t) { !0 === t && (t = "log"), A.default.level(t) } }, { key: "find", value: function (t) { return t.__quill || w.default.find(t) } }, { key: "import", value: function (t) { return null == this.imports[t] && P.error("Cannot import " + t + ". Are you sure it was registered?"), this.imports[t] } }, { key: "register", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; if ("string" != typeof t) { var o = t.attrName || t.blotName; "string" == typeof o ? this.register("formats/" + o, t, e) : Object.keys(t).forEach(function (r) { n.register(r, t[r], e) }) } else null == this.imports[t] || r || P.warn("Overwriting " + t + " with", e), this.imports[t] = e, (t.startsWith("blots/") || t.startsWith("formats/")) && "abstract" !== e.blotName ? w.default.register(e) : t.startsWith("modules") && "function" == typeof e.register && e.register() } }]), h(t, [{ key: "addContainer", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; if ("string" == typeof t) { var n = t; t = document.createElement("div"), t.classList.add(n) } return this.container.insertBefore(t, e), t } }, { key: "blur", value: function () { this.selection.setRange(null) } }, { key: "deleteText", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.deleteText(t, e) }, n, t, -1 * e) } }, { key: "disable", value: function () { this.enable(!1) } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.scroll.enable(t), this.container.classList.toggle("ql-disabled", !t) } }, { key: "focus", value: function () { var t = this.scrollingContainer.scrollTop; this.selection.focus(), this.scrollingContainer.scrollTop = t, this.scrollIntoView() } }, { key: "format", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : g.default.sources.API; return a.call(this, function () { var r = n.getSelection(!0), i = new d.default; if (null == r) return i; if (w.default.query(t, w.default.Scope.BLOCK)) i = n.editor.formatLine(r.index, r.length, o({}, t, e)); else { if (0 === r.length) return n.selection.format(t, e), i; i = n.editor.formatText(r.index, r.length, o({}, t, e)) } return n.setSelection(r, g.default.sources.SILENT), i }, r) } }, { key: "formatLine", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatLine(t, e, l) }, o, t, 0) } }, { key: "formatText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, e, n, r, o), c = f(u, 4); return t = c[0], e = c[1], l = c[2], o = c[3], a.call(this, function () { return i.editor.formatText(t, e, l) }, o, t, 0) } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = void 0; n = "number" == typeof t ? this.selection.getBounds(t, e) : this.selection.getBounds(t.index, t.length); var r = this.container.getBoundingClientRect(); return { bottom: n.bottom - r.top, height: n.height, left: n.left - r.left, right: n.right - r.left, top: n.top - r.top, width: n.width } } }, { key: "getContents", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getContents(t, e) } }, { key: "getFormat", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : this.getSelection(!0), e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; return "number" == typeof t ? this.editor.getFormat(t, e) : this.editor.getFormat(t.index, t.length) } }, { key: "getIndex", value: function (t) { return t.offset(this.scroll) } }, { key: "getLength", value: function () { return this.scroll.length() } }, { key: "getLeaf", value: function (t) { return this.scroll.leaf(t) } }, { key: "getLine", value: function (t) { return this.scroll.line(t) } }, { key: "getLines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return "number" != typeof t ? this.scroll.lines(t.index, t.length) : this.scroll.lines(t, e) } }, { key: "getModule", value: function (t) { return this.theme.modules[t] } }, { key: "getSelection", value: function () { return arguments.length > 0 && void 0 !== arguments[0] && arguments[0] && this.focus(), this.update(), this.selection.getRange()[0] } }, { key: "getText", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : this.getLength() - t, n = s(t, e), r = f(n, 2); return t = r[0], e = r[1], this.editor.getText(t, e) } }, { key: "hasFocus", value: function () { return this.selection.hasFocus() } }, { key: "insertEmbed", value: function (e, n, r) { var o = this, i = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : t.sources.API; return a.call(this, function () { return o.editor.insertEmbed(e, n, r) }, i, e) } }, { key: "insertText", value: function (t, e, n, r, o) { var i = this, l = void 0, u = s(t, 0, n, r, o), c = f(u, 4); return t = c[0], l = c[2], o = c[3], a.call(this, function () { return i.editor.insertText(t, e, l) }, o, t, e.length) } }, { key: "isEnabled", value: function () { return !this.container.classList.contains("ql-disabled") } }, { key: "off", value: function () { return this.emitter.off.apply(this.emitter, arguments) } }, { key: "on", value: function () { return this.emitter.on.apply(this.emitter, arguments) } }, { key: "once", value: function () { return this.emitter.once.apply(this.emitter, arguments) } }, { key: "pasteHTML", value: function (t, e, n) { this.clipboard.dangerouslyPasteHTML(t, e, n) } }, { key: "removeFormat", value: function (t, e, n) { var r = this, o = s(t, e, n), i = f(o, 4); return t = i[0], e = i[1], n = i[3], a.call(this, function () { return r.editor.removeFormat(t, e) }, n, t) } }, { key: "scrollIntoView", value: function () { this.selection.scrollIntoView(this.scrollingContainer) } }, { key: "setContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { t = new d.default(t); var n = e.getLength(), r = e.editor.deleteText(0, n), o = e.editor.applyDelta(t), i = o.ops[o.ops.length - 1]; return null != i && "string" == typeof i.insert && "\n" === i.insert[i.insert.length - 1] && (e.editor.deleteText(e.getLength() - 1, 1), o.delete(1)), r.compose(o) }, n) } }, { key: "setSelection", value: function (e, n, r) { if (null == e) this.selection.setRange(null, n || t.sources.API); else { var o = s(e, n, r), i = f(o, 4); e = i[0], n = i[1], r = i[3], this.selection.setRange(new x.Range(e, n), r), r !== g.default.sources.SILENT && this.selection.scrollIntoView(this.scrollingContainer) } } }, { key: "setText", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API, n = (new d.default).insert(t); return this.setContents(n, e) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : g.default.sources.USER, e = this.scroll.update(t); return this.selection.update(t), e } }, { key: "updateContents", value: function (t) { var e = this, n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : g.default.sources.API; return a.call(this, function () { return t = new d.default(t), e.editor.applyDelta(t, n) }, n, !0) } }]), t }(); S.DEFAULTS = { bounds: null, formats: null, modules: {}, placeholder: "", readOnly: !1, scrollingContainer: null, strict: !0, theme: "default" }, S.events = g.default.events, S.sources = g.default.sources, S.version = "1.3.7", S.imports = { delta: d.default, parchment: w.default, "core/module": _.default, "core/theme": T.default }, e.expandConfig = l, e.overload = s, e.default = S }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; r(this, t), this.quill = e, this.options = n }; o.DEFAULTS = {}, e.default = o }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(0), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default.Text); e.default = s }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(58), c = r(u), f = n(10), h = r(f), p = (0, h.default)("quill:events");["selectionchange", "mousedown", "mouseup", "click"].forEach(function (t) { document.addEventListener(t, function () { for (var t = arguments.length, e = Array(t), n = 0; n < t; n++)e[n] = arguments[n];[].slice.call(document.querySelectorAll(".ql-container")).forEach(function (t) { if (t.__quill && t.__quill.emitter) { var n; (n = t.__quill.emitter).handleDOM.apply(n, e) } }) }) }); var d = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); return t.listeners = {}, t.on("error", p.error), t } return l(e, t), a(e, [{ key: "emit", value: function () { p.log.apply(p, arguments), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "emit", this).apply(this, arguments) } }, { key: "handleDOM", value: function (t) { for (var e = arguments.length, n = Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)n[r - 1] = arguments[r]; (this.listeners[t.type] || []).forEach(function (e) { var r = e.node, o = e.handler; (t.target === r || r.contains(t.target)) && o.apply(void 0, [t].concat(n)) }) } }, { key: "listenDOM", value: function (t, e, n) { this.listeners[t] || (this.listeners[t] = []), this.listeners[t].push({ node: e, handler: n }) } }]), e }(c.default); d.events = { EDITOR_CHANGE: "editor-change", SCROLL_BEFORE_UPDATE: "scroll-before-update", SCROLL_OPTIMIZE: "scroll-optimize", SCROLL_UPDATE: "scroll-update", SELECTION_CHANGE: "selection-change", TEXT_CHANGE: "text-change" }, d.sources = { API: "api", SILENT: "silent", USER: "user" }, e.default = d }, function (t, e, n) { "use strict"; function r(t) { if (i.indexOf(t) <= i.indexOf(l)) { for (var e, n = arguments.length, r = Array(n > 1 ? n - 1 : 0), o = 1; o < n; o++)r[o - 1] = arguments[o]; (e = console)[t].apply(e, r) } } function o(t) { return i.reduce(function (e, n) { return e[n] = r.bind(console, n, t), e }, {}) } Object.defineProperty(e, "__esModule", { value: !0 }); var i = ["error", "warn", "log", "info"], l = "warn"; r.level = o.level = function (t) { l = t }, e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t, e, n) { void 0 === n && (n = {}), this.attrName = t, this.keyName = e; var o = r.Scope.TYPE & r.Scope.ATTRIBUTE; null != n.scope ? this.scope = n.scope & r.Scope.LEVEL | o : this.scope = r.Scope.ATTRIBUTE, null != n.whitelist && (this.whitelist = n.whitelist) } return t.keys = function (t) { return [].map.call(t.attributes, function (t) { return t.name }) }, t.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.setAttribute(this.keyName, e), !0) }, t.prototype.canAdd = function (t, e) { return null != r.query(t, r.Scope.BLOT & (this.scope | r.Scope.TYPE)) && (null == this.whitelist || ("string" == typeof e ? this.whitelist.indexOf(e.replace(/["']/g, "")) > -1 : this.whitelist.indexOf(e) > -1)) }, t.prototype.remove = function (t) { t.removeAttribute(this.keyName) }, t.prototype.value = function (t) { var e = t.getAttribute(this.keyName); return this.canAdd(t, e) && e ? e : "" }, t }(); e.default = o }, function (t, e, n) { function r(t) { return null === t || void 0 === t } function o(t) { return !(!t || "object" != typeof t || "number" != typeof t.length) && ("function" == typeof t.copy && "function" == typeof t.slice && !(t.length > 0 && "number" != typeof t[0])) } function i(t, e, n) { var i, c; if (r(t) || r(e)) return !1; if (t.prototype !== e.prototype) return !1; if (s(t)) return !!s(e) && (t = l.call(t), e = l.call(e), u(t, e, n)); if (o(t)) { if (!o(e)) return !1; if (t.length !== e.length) return !1; for (i = 0; i < t.length; i++)if (t[i] !== e[i]) return !1; return !0 } try { var f = a(t), h = a(e) } catch (t) { return !1 } if (f.length != h.length) return !1; for (f.sort(), h.sort(), i = f.length - 1; i >= 0; i--)if (f[i] != h[i]) return !1; for (i = f.length - 1; i >= 0; i--)if (c = f[i], !u(t[c], e[c], n)) return !1; return typeof t == typeof e } var l = Array.prototype.slice, a = n(55), s = n(56), u = t.exports = function (t, e, n) { return n || (n = {}), t === e || (t instanceof Date && e instanceof Date ? t.getTime() === e.getTime() : !t || !e || "object" != typeof t && "object" != typeof e ? n.strict ? t === e : t == e : i(t, e, n)) } }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Code = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(4), f = r(c), h = n(0), p = r(h), d = n(3), y = r(d), v = n(5), b = r(v), g = n(8), m = r(g), _ = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(b.default); _.blotName = "code", _.tagName = "CODE"; var O = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), s(e, [{ key: "delta", value: function () { var t = this, e = this.domNode.textContent; return e.endsWith("\n") && (e = e.slice(0, -1)), e.split("\n").reduce(function (e, n) { return e.insert(n).insert("\n", t.formats()) }, new f.default) } }, { key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) { var r = this.descendant(m.default, this.length() - 1), o = a(r, 1), i = o[0]; null != i && i.deleteAt(i.length() - 1, 1), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } } }, { key: "formatAt", value: function (t, n, r, o) { if (0 !== n && null != p.default.query(r, p.default.Scope.BLOCK) && (r !== this.statics.blotName || o !== this.statics.formats(this.domNode))) { var i = this.newlineIndex(t); if (!(i < 0 || i >= t + n)) { var l = this.newlineIndex(t, !0) + 1, a = i - l + 1, s = this.isolate(l, a), u = s.next; s.format(r, o), u instanceof e && u.formatAt(0, t - l + n - a, r, o) } } } }, { key: "insertAt", value: function (t, e, n) { if (null == n) { var r = this.descendant(m.default, t), o = a(r, 2), i = o[0], l = o[1]; i.insertAt(l, e) } } }, { key: "length", value: function () { var t = this.domNode.textContent.length; return this.domNode.textContent.endsWith("\n") ? t : t + 1 } }, { key: "newlineIndex", value: function (t) { if (arguments.length > 1 && void 0 !== arguments[1] && arguments[1]) return this.domNode.textContent.slice(0, t).lastIndexOf("\n"); var e = this.domNode.textContent.slice(t).indexOf("\n"); return e > -1 ? t + e : -1 } }, { key: "optimize", value: function (t) { this.domNode.textContent.endsWith("\n") || this.appendChild(p.default.create("text", "\n")), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && this.statics.formats(this.domNode) === n.statics.formats(n.domNode) && (n.optimize(t), n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t), [].slice.call(this.domNode.querySelectorAll("*")).forEach(function (t) { var e = p.default.find(t); null == e ? t.parentNode.removeChild(t) : e instanceof p.default.Embed ? e.remove() : e.unwrap() }) } }], [{ key: "create", value: function (t) { var n = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("spellcheck", !1), n } }, { key: "formats", value: function () { return !0 } }]), e }(y.default); O.blotName = "code-block", O.tagName = "PRE", O.TAB = " ", e.Code = _, e.default = O }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "insertInto", value: function (t, n) { 0 === t.children.length ? a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertInto", this).call(this, t, n) : this.remove() } }, { key: "length", value: function () { return 0 } }, { key: "value", value: function () { return "" } }], [{ key: "value", value: function () { } }]), e }(u.default.Embed); c.blotName = "break", c.tagName = "BR", e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function l(t, e) { var n = document.createElement("a"); n.href = t; var r = n.href.slice(0, n.href.indexOf(":")); return e.indexOf(r) > -1 } Object.defineProperty(e, "__esModule", { value: !0 }), e.sanitize = e.default = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(5), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), a(e, [{ key: "format", value: function (t, n) { if (t !== this.statics.blotName || !n) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); n = this.constructor.sanitize(n), this.domNode.setAttribute("href", n) } }], [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return t = this.sanitize(t), n.setAttribute("href", t), n.setAttribute("rel", "noopener noreferrer"), n.setAttribute("target", "_blank"), n } }, { key: "formats", value: function (t) { return t.getAttribute("href") } }, { key: "sanitize", value: function (t) { return l(t, this.PROTOCOL_WHITELIST) ? t : this.SANITIZED_URL } }]), e }(c.default); f.blotName = "link", f.tagName = "A", f.SANITIZED_URL = "about:blank", f.PROTOCOL_WHITELIST = ["http", "https", "mailto", "tel"], e.default = f, e.sanitize = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { t.setAttribute(e, !("true" === t.getAttribute(e))) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = n(25), u = r(s), c = n(106), f = r(c), h = 0, p = function () { function t(e) { var n = this; o(this, t), this.select = e, this.container = document.createElement("span"), this.buildPicker(), this.select.style.display = "none", this.select.parentNode.insertBefore(this.container, this.select), this.label.addEventListener("mousedown", function () { n.togglePicker() }), this.label.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: n.togglePicker(); break; case u.default.keys.ESCAPE: n.escape(), t.preventDefault() } }), this.select.addEventListener("change", this.update.bind(this)) } return a(t, [{ key: "togglePicker", value: function () { this.container.classList.toggle("ql-expanded"), i(this.label, "aria-expanded"), i(this.options, "aria-hidden") } }, { key: "buildItem", value: function (t) { var e = this, n = document.createElement("span"); return n.tabIndex = "0", n.setAttribute("role", "button"), n.classList.add("ql-picker-item"), t.hasAttribute("value") && n.setAttribute("data-value", t.getAttribute("value")), t.textContent && n.setAttribute("data-label", t.textContent), n.addEventListener("click", function () { e.selectItem(n, !0) }), n.addEventListener("keydown", function (t) { switch (t.keyCode) { case u.default.keys.ENTER: e.selectItem(n, !0), t.preventDefault(); break; case u.default.keys.ESCAPE: e.escape(), t.preventDefault() } }), n } }, { key: "buildLabel", value: function () { var t = document.createElement("span"); return t.classList.add("ql-picker-label"), t.innerHTML = f.default, t.tabIndex = "0", t.setAttribute("role", "button"), t.setAttribute("aria-expanded", "false"), this.container.appendChild(t), t } }, { key: "buildOptions", value: function () { var t = this, e = document.createElement("span"); e.classList.add("ql-picker-options"), e.setAttribute("aria-hidden", "true"), e.tabIndex = "-1", e.id = "ql-picker-options-" + h, h += 1, this.label.setAttribute("aria-controls", e.id), this.options = e, [].slice.call(this.select.options).forEach(function (n) { var r = t.buildItem(n); e.appendChild(r), !0 === n.selected && t.selectItem(r) }), this.container.appendChild(e) } }, { key: "buildPicker", value: function () { var t = this;[].slice.call(this.select.attributes).forEach(function (e) { t.container.setAttribute(e.name, e.value) }), this.container.classList.add("ql-picker"), this.label = this.buildLabel(), this.buildOptions() } }, { key: "escape", value: function () { var t = this; this.close(), setTimeout(function () { return t.label.focus() }, 1) } }, { key: "close", value: function () { this.container.classList.remove("ql-expanded"), this.label.setAttribute("aria-expanded", "false"), this.options.setAttribute("aria-hidden", "true") } }, { key: "selectItem", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = this.container.querySelector(".ql-selected"); if (t !== n && (null != n && n.classList.remove("ql-selected"), null != t && (t.classList.add("ql-selected"), this.select.selectedIndex = [].indexOf.call(t.parentNode.children, t), t.hasAttribute("data-value") ? this.label.setAttribute("data-value", t.getAttribute("data-value")) : this.label.removeAttribute("data-value"), t.hasAttribute("data-label") ? this.label.setAttribute("data-label", t.getAttribute("data-label")) : this.label.removeAttribute("data-label"), e))) { if ("function" == typeof Event) this.select.dispatchEvent(new Event("change")); else if ("object" === ("undefined" == typeof Event ? "undefined" : l(Event))) { var r = document.createEvent("Event"); r.initEvent("change", !0, !0), this.select.dispatchEvent(r) } this.close() } } }, { key: "update", value: function () { var t = void 0; if (this.select.selectedIndex > -1) { var e = this.container.querySelector(".ql-picker-options").children[this.select.selectedIndex]; t = this.select.options[this.select.selectedIndex], this.selectItem(e) } else this.selectItem(null); var n = null != t && t !== this.select.querySelector("option[selected]"); this.label.classList.toggle("ql-active", n) } }]), t }(); e.default = p }, function (t, e, n) { "use strict"; function r(t) { var e = a.find(t); if (null == e) try { e = a.create(t) } catch (n) { e = a.create(a.Scope.INLINE), [].slice.call(t.childNodes).forEach(function (t) { e.domNode.appendChild(t) }), t.parentNode && t.parentNode.replaceChild(e.domNode, t), e.attach() } return e } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(47), l = n(27), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.build(), n } return o(e, t), e.prototype.appendChild = function (t) { this.insertBefore(t) }, e.prototype.attach = function () { t.prototype.attach.call(this), this.children.forEach(function (t) { t.attach() }) }, e.prototype.build = function () { var t = this; this.children = new i.default, [].slice.call(this.domNode.childNodes).reverse().forEach(function (e) { try { var n = r(e); t.insertBefore(n, t.children.head || void 0) } catch (t) { if (t instanceof a.ParchmentError) return; throw t } }) }, e.prototype.deleteAt = function (t, e) { if (0 === t && e === this.length()) return this.remove(); this.children.forEachAt(t, e, function (t, e, n) { t.deleteAt(e, n) }) }, e.prototype.descendant = function (t, n) { var r = this.children.find(n), o = r[0], i = r[1]; return null == t.blotName && t(o) || null != t.blotName && o instanceof t ? [o, i] : o instanceof e ? o.descendant(t, i) : [null, -1] }, e.prototype.descendants = function (t, n, r) { void 0 === n && (n = 0), void 0 === r && (r = Number.MAX_VALUE); var o = [], i = r; return this.children.forEachAt(n, r, function (n, r, l) { (null == t.blotName && t(n) || null != t.blotName && n instanceof t) && o.push(n), n instanceof e && (o = o.concat(n.descendants(t, r, i))), i -= l }), o }, e.prototype.detach = function () { this.children.forEach(function (t) { t.detach() }), t.prototype.detach.call(this) }, e.prototype.formatAt = function (t, e, n, r) { this.children.forEachAt(t, e, function (t, e, o) { t.formatAt(e, o, n, r) }) }, e.prototype.insertAt = function (t, e, n) { var r = this.children.find(t), o = r[0], i = r[1]; if (o) o.insertAt(i, e, n); else { var l = null == n ? a.create("text", e) : a.create(e, n); this.appendChild(l) } }, e.prototype.insertBefore = function (t, e) { if (null != this.statics.allowedChildren && !this.statics.allowedChildren.some(function (e) { return t instanceof e })) throw new a.ParchmentError("Cannot insert " + t.statics.blotName + " into " + this.statics.blotName); t.insertInto(this, e) }, e.prototype.length = function () { return this.children.reduce(function (t, e) { return t + e.length() }, 0) }, e.prototype.moveChildren = function (t, e) { this.children.forEach(function (n) { t.insertBefore(n, e) }) }, e.prototype.optimize = function (e) { if (t.prototype.optimize.call(this, e), 0 === this.children.length) if (null != this.statics.defaultChild) { var n = a.create(this.statics.defaultChild); this.appendChild(n), n.optimize(e) } else this.remove() }, e.prototype.path = function (t, n) { void 0 === n && (n = !1); var r = this.children.find(t, n), o = r[0], i = r[1], l = [[this, t]]; return o instanceof e ? l.concat(o.path(i, n)) : (null != o && l.push([o, i]), l) }, e.prototype.removeChild = function (t) { this.children.remove(t) }, e.prototype.replace = function (n) { n instanceof e && n.moveChildren(this), t.prototype.replace.call(this, n) }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = this.clone(); return this.parent.insertBefore(n, this.next), this.children.forEachAt(t, this.length(), function (t, r, o) { t = t.split(r, e), n.appendChild(t) }), n }, e.prototype.unwrap = function () { this.moveChildren(this.parent, this.next), this.remove() }, e.prototype.update = function (t, e) { var n = this, o = [], i = []; t.forEach(function (t) { t.target === n.domNode && "childList" === t.type && (o.push.apply(o, t.addedNodes), i.push.apply(i, t.removedNodes)) }), i.forEach(function (t) { if (!(null != t.parentNode && "IFRAME" !== t.tagName && document.body.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY)) { var e = a.find(t); null != e && (null != e.domNode.parentNode && e.domNode.parentNode !== n.domNode || e.detach()) } }), o.filter(function (t) { return t.parentNode == n.domNode }).sort(function (t, e) { return t === e ? 0 : t.compareDocumentPosition(e) & Node.DOCUMENT_POSITION_FOLLOWING ? 1 : -1 }).forEach(function (t) { var e = null; null != t.nextSibling && (e = a.find(t.nextSibling)); var o = r(t); o.next == e && null != o.next || (null != o.parent && o.parent.removeChild(n), n.insertBefore(o, e || void 0)) }) }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(11), i = n(28), l = n(17), a = n(1), s = function (t) { function e(e) { var n = t.call(this, e) || this; return n.attributes = new i.default(n.domNode), n } return r(e, t), e.formats = function (t) { return "string" == typeof this.tagName || (Array.isArray(this.tagName) ? t.tagName.toLowerCase() : void 0) }, e.prototype.format = function (t, e) { var n = a.query(t); n instanceof o.default ? this.attributes.attribute(n, e) : e && (null == n || t === this.statics.blotName && this.formats()[t] === e || this.replaceWith(t, e)) }, e.prototype.formats = function () { var t = this.attributes.values(), e = this.statics.formats(this.domNode); return null != e && (t[this.statics.blotName] = e), t }, e.prototype.replaceWith = function (e, n) { var r = t.prototype.replaceWith.call(this, e, n); return this.attributes.copy(r), r }, e.prototype.update = function (e, n) { var r = this; t.prototype.update.call(this, e, n), e.some(function (t) { return t.target === r.domNode && "attributes" === t.type }) && this.attributes.build() }, e.prototype.wrap = function (n, r) { var o = t.prototype.wrap.call(this, n, r); return o instanceof e && o.statics.scope === this.statics.scope && this.attributes.move(o), o }, e }(l.default); e.default = s }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(27), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.value = function (t) { return !0 }, e.prototype.index = function (t, e) { return this.domNode === t || this.domNode.compareDocumentPosition(t) & Node.DOCUMENT_POSITION_CONTAINED_BY ? Math.min(e, 1) : -1 }, e.prototype.position = function (t, e) { var n = [].indexOf.call(this.parent.domNode.childNodes, this.domNode); return t > 0 && (n += 1), [this.parent.domNode, n] }, e.prototype.value = function () { var t; return t = {}, t[this.statics.blotName] = this.statics.value(this.domNode) || !0, t }, e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { function r(t) { this.ops = t, this.index = 0, this.offset = 0 } var o = n(12), i = n(2), l = { attributes: { compose: function (t, e, n) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var r = i(!0, {}, e); n || (r = Object.keys(r).reduce(function (t, e) { return null != r[e] && (t[e] = r[e]), t }, {})); for (var o in t) void 0 !== t[o] && void 0 === e[o] && (r[o] = t[o]); return Object.keys(r).length > 0 ? r : void 0 }, diff: function (t, e) { "object" != typeof t && (t = {}), "object" != typeof e && (e = {}); var n = Object.keys(t).concat(Object.keys(e)).reduce(function (n, r) { return o(t[r], e[r]) || (n[r] = void 0 === e[r] ? null : e[r]), n }, {}); return Object.keys(n).length > 0 ? n : void 0 }, transform: function (t, e, n) { if ("object" != typeof t) return e; if ("object" == typeof e) { if (!n) return e; var r = Object.keys(e).reduce(function (n, r) { return void 0 === t[r] && (n[r] = e[r]), n }, {}); return Object.keys(r).length > 0 ? r : void 0 } } }, iterator: function (t) { return new r(t) }, length: function (t) { return "number" == typeof t.delete ? t.delete : "number" == typeof t.retain ? t.retain : "string" == typeof t.insert ? t.insert.length : 1 } }; r.prototype.hasNext = function () { return this.peekLength() < 1 / 0 }, r.prototype.next = function (t) { t || (t = 1 / 0); var e = this.ops[this.index]; if (e) { var n = this.offset, r = l.length(e); if (t >= r - n ? (t = r - n, this.index += 1, this.offset = 0) : this.offset += t, "number" == typeof e.delete) return { delete: t }; var o = {}; return e.attributes && (o.attributes = e.attributes), "number" == typeof e.retain ? o.retain = t : "string" == typeof e.insert ? o.insert = e.insert.substr(n, t) : o.insert = e.insert, o } return { retain: 1 / 0 } }, r.prototype.peek = function () { return this.ops[this.index] }, r.prototype.peekLength = function () { return this.ops[this.index] ? l.length(this.ops[this.index]) - this.offset : 1 / 0 }, r.prototype.peekType = function () { return this.ops[this.index] ? "number" == typeof this.ops[this.index].delete ? "delete" : "number" == typeof this.ops[this.index].retain ? "retain" : "insert" : "retain" }, r.prototype.rest = function () { if (this.hasNext()) { if (0 === this.offset) return this.ops.slice(this.index); var t = this.offset, e = this.index, n = this.next(), r = this.ops.slice(this.index); return this.offset = t, this.index = e, [n].concat(r) } return [] }, t.exports = l }, function (t, e) { var n = function () { "use strict"; function t(t, e) { return null != e && t instanceof e } function e(n, r, o, i, c) { function f(n, o) { if (null === n) return null; if (0 === o) return n; var y, v; if ("object" != typeof n) return n; if (t(n, a)) y = new a; else if (t(n, s)) y = new s; else if (t(n, u)) y = new u(function (t, e) { n.then(function (e) { t(f(e, o - 1)) }, function (t) { e(f(t, o - 1)) }) }); else if (e.__isArray(n)) y = []; else if (e.__isRegExp(n)) y = new RegExp(n.source, l(n)), n.lastIndex && (y.lastIndex = n.lastIndex); else if (e.__isDate(n)) y = new Date(n.getTime()); else { if (d && Buffer.isBuffer(n)) return y = Buffer.allocUnsafe ? Buffer.allocUnsafe(n.length) : new Buffer(n.length), n.copy(y), y; t(n, Error) ? y = Object.create(n) : void 0 === i ? (v = Object.getPrototypeOf(n), y = Object.create(v)) : (y = Object.create(i), v = i) } if (r) { var b = h.indexOf(n); if (-1 != b) return p[b]; h.push(n), p.push(y) } t(n, a) && n.forEach(function (t, e) { var n = f(e, o - 1), r = f(t, o - 1); y.set(n, r) }), t(n, s) && n.forEach(function (t) { var e = f(t, o - 1); y.add(e) }); for (var g in n) { var m; v && (m = Object.getOwnPropertyDescriptor(v, g)), m && null == m.set || (y[g] = f(n[g], o - 1)) } if (Object.getOwnPropertySymbols) for (var _ = Object.getOwnPropertySymbols(n), g = 0; g < _.length; g++) { var O = _[g], w = Object.getOwnPropertyDescriptor(n, O); (!w || w.enumerable || c) && (y[O] = f(n[O], o - 1), w.enumerable || Object.defineProperty(y, O, { enumerable: !1 })) } if (c) for (var x = Object.getOwnPropertyNames(n), g = 0; g < x.length; g++) { var k = x[g], w = Object.getOwnPropertyDescriptor(n, k); w && w.enumerable || (y[k] = f(n[k], o - 1), Object.defineProperty(y, k, { enumerable: !1 })) } return y } "object" == typeof r && (o = r.depth, i = r.prototype, c = r.includeNonEnumerable, r = r.circular); var h = [], p = [], d = "undefined" != typeof Buffer; return void 0 === r && (r = !0), void 0 === o && (o = 1 / 0), f(n, o) } function n(t) { return Object.prototype.toString.call(t) } function r(t) { return "object" == typeof t && "[object Date]" === n(t) } function o(t) { return "object" == typeof t && "[object Array]" === n(t) } function i(t) { return "object" == typeof t && "[object RegExp]" === n(t) } function l(t) { var e = ""; return t.global && (e += "g"), t.ignoreCase && (e += "i"), t.multiline && (e += "m"), e } var a; try { a = Map } catch (t) { a = function () { } } var s; try { s = Set } catch (t) { s = function () { } } var u; try { u = Promise } catch (t) { u = function () { } } return e.clonePrototype = function (t) { if (null === t) return null; var e = function () { }; return e.prototype = t, new e }, e.__objToStr = n, e.__isDate = r, e.__isArray = o, e.__isRegExp = i, e.__getRegExpFlags = l, e }(); "object" == typeof t && t.exports && (t.exports = n) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t) { if (Array.isArray(t)) { for (var e = 0, n = Array(t.length); e < t.length; e++)n[e] = t[e]; return n } return Array.from(t) } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { try { e.parentNode } catch (t) { return !1 } return e instanceof Text && (e = e.parentNode), t.contains(e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.Range = void 0; var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(0), c = r(u), f = n(21), h = r(f), p = n(12), d = r(p), y = n(9), v = r(y), b = n(10), g = r(b), m = (0, g.default)("quill:selection"), _ = function t(e) { var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0; i(this, t), this.index = e, this.length = n }, O = function () { function t(e, n) { var r = this; i(this, t), this.emitter = n, this.scroll = e, this.composing = !1, this.mouseDown = !1, this.root = this.scroll.domNode, this.cursor = c.default.create("cursor", this), this.lastRange = this.savedRange = new _(0, 0), this.handleComposition(), this.handleDragging(), this.emitter.listenDOM("selectionchange", document, function () { r.mouseDown || setTimeout(r.update.bind(r, v.default.sources.USER), 1) }), this.emitter.on(v.default.events.EDITOR_CHANGE, function (t, e) { t === v.default.events.TEXT_CHANGE && e.length() > 0 && r.update(v.default.sources.SILENT) }), this.emitter.on(v.default.events.SCROLL_BEFORE_UPDATE, function () { if (r.hasFocus()) { var t = r.getNativeRange(); null != t && t.start.node !== r.cursor.textNode && r.emitter.once(v.default.events.SCROLL_UPDATE, function () { try { r.setNativeRange(t.start.node, t.start.offset, t.end.node, t.end.offset) } catch (t) { } }) } }), this.emitter.on(v.default.events.SCROLL_OPTIMIZE, function (t, e) { if (e.range) { var n = e.range, o = n.startNode, i = n.startOffset, l = n.endNode, a = n.endOffset; r.setNativeRange(o, i, l, a) } }), this.update(v.default.sources.SILENT) } return s(t, [{ key: "handleComposition", value: function () { var t = this; this.root.addEventListener("compositionstart", function () { t.composing = !0 }), this.root.addEventListener("compositionend", function () { if (t.composing = !1, t.cursor.parent) { var e = t.cursor.restore(); if (!e) return; setTimeout(function () { t.setNativeRange(e.startNode, e.startOffset, e.endNode, e.endOffset) }, 1) } }) } }, { key: "handleDragging", value: function () { var t = this; this.emitter.listenDOM("mousedown", document.body, function () { t.mouseDown = !0 }), this.emitter.listenDOM("mouseup", document.body, function () { t.mouseDown = !1, t.update(v.default.sources.USER) }) } }, { key: "focus", value: function () { this.hasFocus() || (this.root.focus(), this.setRange(this.savedRange)) } }, { key: "format", value: function (t, e) { if (null == this.scroll.whitelist || this.scroll.whitelist[t]) { this.scroll.update(); var n = this.getNativeRange(); if (null != n && n.native.collapsed && !c.default.query(t, c.default.Scope.BLOCK)) { if (n.start.node !== this.cursor.textNode) { var r = c.default.find(n.start.node, !1); if (null == r) return; if (r instanceof c.default.Leaf) { var o = r.split(n.start.offset); r.parent.insertBefore(this.cursor, o) } else r.insertBefore(this.cursor, n.start.node); this.cursor.attach() } this.cursor.format(t, e), this.scroll.optimize(), this.setNativeRange(this.cursor.textNode, this.cursor.textNode.data.length), this.update() } } } }, { key: "getBounds", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = this.scroll.length(); t = Math.min(t, n - 1), e = Math.min(t + e, n - 1) - t; var r = void 0, o = this.scroll.leaf(t), i = a(o, 2), l = i[0], s = i[1]; if (null == l) return null; var u = l.position(s, !0), c = a(u, 2); r = c[0], s = c[1]; var f = document.createRange(); if (e > 0) { f.setStart(r, s); var h = this.scroll.leaf(t + e), p = a(h, 2); if (l = p[0], s = p[1], null == l) return null; var d = l.position(s, !0), y = a(d, 2); return r = y[0], s = y[1], f.setEnd(r, s), f.getBoundingClientRect() } var v = "left", b = void 0; return r instanceof Text ? (s < r.data.length ? (f.setStart(r, s), f.setEnd(r, s + 1)) : (f.setStart(r, s - 1), f.setEnd(r, s), v = "right"), b = f.getBoundingClientRect()) : (b = l.domNode.getBoundingClientRect(), s > 0 && (v = "right")), { bottom: b.top + b.height, height: b.height, left: b[v], right: b[v], top: b.top, width: 0 } } }, { key: "getNativeRange", value: function () { var t = document.getSelection(); if (null == t || t.rangeCount <= 0) return null; var e = t.getRangeAt(0); if (null == e) return null; var n = this.normalizeNative(e); return m.info("getNativeRange", n), n } }, { key: "getRange", value: function () { var t = this.getNativeRange(); return null == t ? [null, null] : [this.normalizedToRange(t), t] } }, { key: "hasFocus", value: function () { return document.activeElement === this.root } }, { key: "normalizedToRange", value: function (t) { var e = this, n = [[t.start.node, t.start.offset]]; t.native.collapsed || n.push([t.end.node, t.end.offset]); var r = n.map(function (t) { var n = a(t, 2), r = n[0], o = n[1], i = c.default.find(r, !0), l = i.offset(e.scroll); return 0 === o ? l : i instanceof c.default.Container ? l + i.length() : l + i.index(r, o) }), i = Math.min(Math.max.apply(Math, o(r)), this.scroll.length() - 1), l = Math.min.apply(Math, [i].concat(o(r))); return new _(l, i - l) } }, { key: "normalizeNative", value: function (t) { if (!l(this.root, t.startContainer) || !t.collapsed && !l(this.root, t.endContainer)) return null; var e = { start: { node: t.startContainer, offset: t.startOffset }, end: { node: t.endContainer, offset: t.endOffset }, native: t }; return [e.start, e.end].forEach(function (t) { for (var e = t.node, n = t.offset; !(e instanceof Text) && e.childNodes.length > 0;)if (e.childNodes.length > n) e = e.childNodes[n], n = 0; else { if (e.childNodes.length !== n) break; e = e.lastChild, n = e instanceof Text ? e.data.length : e.childNodes.length + 1 } t.node = e, t.offset = n }), e } }, { key: "rangeToNative", value: function (t) { var e = this, n = t.collapsed ? [t.index] : [t.index, t.index + t.length], r = [], o = this.scroll.length(); return n.forEach(function (t, n) { t = Math.min(o - 1, t); var i = void 0, l = e.scroll.leaf(t), s = a(l, 2), u = s[0], c = s[1], f = u.position(c, 0 !== n), h = a(f, 2); i = h[0], c = h[1], r.push(i, c) }), r.length < 2 && (r = r.concat(r)), r } }, { key: "scrollIntoView", value: function (t) { var e = this.lastRange; if (null != e) { var n = this.getBounds(e.index, e.length); if (null != n) { var r = this.scroll.length() - 1, o = this.scroll.line(Math.min(e.index, r)), i = a(o, 1), l = i[0], s = l; if (e.length > 0) { var u = this.scroll.line(Math.min(e.index + e.length, r)); s = a(u, 1)[0] } if (null != l && null != s) { var c = t.getBoundingClientRect(); n.top < c.top ? t.scrollTop -= c.top - n.top : n.bottom > c.bottom && (t.scrollTop += n.bottom - c.bottom) } } } } }, { key: "setNativeRange", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : t, r = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : e, o = arguments.length > 4 && void 0 !== arguments[4] && arguments[4]; if (m.info("setNativeRange", t, e, n, r), null == t || null != this.root.parentNode && null != t.parentNode && null != n.parentNode) { var i = document.getSelection(); if (null != i) if (null != t) { this.hasFocus() || this.root.focus(); var l = (this.getNativeRange() || {}).native; if (null == l || o || t !== l.startContainer || e !== l.startOffset || n !== l.endContainer || r !== l.endOffset) { "BR" == t.tagName && (e = [].indexOf.call(t.parentNode.childNodes, t), t = t.parentNode), "BR" == n.tagName && (r = [].indexOf.call(n.parentNode.childNodes, n), n = n.parentNode); var a = document.createRange(); a.setStart(t, e), a.setEnd(n, r), i.removeAllRanges(), i.addRange(a) } } else i.removeAllRanges(), this.root.blur(), document.body.focus() } } }, { key: "setRange", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] && arguments[1], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : v.default.sources.API; if ("string" == typeof e && (n = e, e = !1), m.info("setRange", t), null != t) { var r = this.rangeToNative(t); this.setNativeRange.apply(this, o(r).concat([e])) } else this.setNativeRange(null); this.update(n) } }, { key: "update", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : v.default.sources.USER, e = this.lastRange, n = this.getRange(), r = a(n, 2), o = r[0], i = r[1]; if (this.lastRange = o, null != this.lastRange && (this.savedRange = this.lastRange), !(0, d.default)(e, this.lastRange)) { var l; !this.composing && null != i && i.native.collapsed && i.start.node !== this.cursor.textNode && this.cursor.restore(); var s = [v.default.events.SELECTION_CHANGE, (0, h.default)(this.lastRange), (0, h.default)(e), t]; if ((l = this.emitter).emit.apply(l, [v.default.events.EDITOR_CHANGE].concat(s)), t !== v.default.sources.SILENT) { var u; (u = this.emitter).emit.apply(u, s) } } } }]), t }(); e.Range = _, e.default = O }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = n(0), s = r(a), u = n(3), c = r(u), f = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), e }(s.default.Container); f.allowedChildren = [c.default, u.BlockEmbed, f], e.default = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.ColorStyle = e.ColorClass = e.ColorAttributor = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t); return n.startsWith("rgb(") ? (n = n.replace(/^[^\d]+/, "").replace(/[^\d]+$/, ""), "#" + n.split(",").map(function (t) { return ("00" + parseInt(t).toString(16)).slice(-2) }).join("")) : n } }]), e }(u.default.Attributor.Style), f = new u.default.Attributor.Class("color", "ql-color", { scope: u.default.Scope.INLINE }), h = new c("color", "color", { scope: u.default.Scope.INLINE }); e.ColorAttributor = c, e.ColorClass = f, e.ColorStyle = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e) { var n, r = t === D.keys.LEFT ? "prefix" : "suffix"; return n = { key: t, shiftKey: e, altKey: null }, o(n, r, /^$/), o(n, "handler", function (n) { var r = n.index; t === D.keys.RIGHT && (r += n.length + 1); var o = this.quill.getLeaf(r); return !(b(o, 1)[0] instanceof T.default.Embed) || (t === D.keys.LEFT ? e ? this.quill.setSelection(n.index - 1, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index - 1, S.default.sources.USER) : e ? this.quill.setSelection(n.index, n.length + 1, S.default.sources.USER) : this.quill.setSelection(n.index + n.length + 1, S.default.sources.USER), !1) }), n } function u(t, e) { if (!(0 === t.index || this.quill.getLength() <= 1)) { var n = this.quill.getLine(t.index), r = b(n, 1), o = r[0], i = {}; if (0 === e.offset) { var l = this.quill.getLine(t.index - 1), a = b(l, 1), s = a[0]; if (null != s && s.length() > 1) { var u = o.formats(), c = this.quill.getFormat(t.index - 1, 1); i = A.default.attributes.diff(u, c) || {} } } var f = /[\uD800-\uDBFF][\uDC00-\uDFFF]$/.test(e.prefix) ? 2 : 1; this.quill.deleteText(t.index - f, f, S.default.sources.USER), Object.keys(i).length > 0 && this.quill.formatLine(t.index - f, f, i, S.default.sources.USER), this.quill.focus() } } function c(t, e) { var n = /^[\uD800-\uDBFF][\uDC00-\uDFFF]/.test(e.suffix) ? 2 : 1; if (!(t.index >= this.quill.getLength() - n)) { var r = {}, o = 0, i = this.quill.getLine(t.index), l = b(i, 1), a = l[0]; if (e.offset >= a.length() - 1) { var s = this.quill.getLine(t.index + 1), u = b(s, 1), c = u[0]; if (c) { var f = a.formats(), h = this.quill.getFormat(t.index, 1); r = A.default.attributes.diff(f, h) || {}, o = c.length() } } this.quill.deleteText(t.index, n, S.default.sources.USER), Object.keys(r).length > 0 && this.quill.formatLine(t.index + o - 1, n, r, S.default.sources.USER) } } function f(t) { var e = this.quill.getLines(t), n = {}; if (e.length > 1) { var r = e[0].formats(), o = e[e.length - 1].formats(); n = A.default.attributes.diff(o, r) || {} } this.quill.deleteText(t, S.default.sources.USER), Object.keys(n).length > 0 && this.quill.formatLine(t.index, 1, n, S.default.sources.USER), this.quill.setSelection(t.index, S.default.sources.SILENT), this.quill.focus() } function h(t, e) { var n = this; t.length > 0 && this.quill.scroll.deleteAt(t.index, t.length); var r = Object.keys(e.format).reduce(function (t, n) { return T.default.query(n, T.default.Scope.BLOCK) && !Array.isArray(e.format[n]) && (t[n] = e.format[n]), t }, {}); this.quill.insertText(t.index, "\n", r, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.focus(), Object.keys(e.format).forEach(function (t) { null == r[t] && (Array.isArray(e.format[t]) || "link" !== t && n.quill.format(t, e.format[t], S.default.sources.USER)) }) } function p(t) { return { key: D.keys.TAB, shiftKey: !t, format: { "code-block": !0 }, handler: function (e) { var n = T.default.query("code-block"), r = e.index, o = e.length, i = this.quill.scroll.descendant(n, r), l = b(i, 2), a = l[0], s = l[1]; if (null != a) { var u = this.quill.getIndex(a), c = a.newlineIndex(s, !0) + 1, f = a.newlineIndex(u + s + o), h = a.domNode.textContent.slice(c, f).split("\n"); s = 0, h.forEach(function (e, i) { t ? (a.insertAt(c + s, n.TAB), s += n.TAB.length, 0 === i ? r += n.TAB.length : o += n.TAB.length) : e.startsWith(n.TAB) && (a.deleteAt(c + s, n.TAB.length), s -= n.TAB.length, 0 === i ? r -= n.TAB.length : o -= n.TAB.length), s += e.length + 1 }), this.quill.update(S.default.sources.USER), this.quill.setSelection(r, o, S.default.sources.SILENT) } } } } function d(t) { return { key: t[0].toUpperCase(), shortKey: !0, handler: function (e, n) { this.quill.format(t, !n.format[t], S.default.sources.USER) } } } function y(t) { if ("string" == typeof t || "number" == typeof t) return y({ key: t }); if ("object" === (void 0 === t ? "undefined" : v(t)) && (t = (0, _.default)(t, !1)), "string" == typeof t.key) if (null != D.keys[t.key.toUpperCase()]) t.key = D.keys[t.key.toUpperCase()]; else { if (1 !== t.key.length) return null; t.key = t.key.toUpperCase().charCodeAt(0) } return t.shortKey && (t[B] = t.shortKey, delete t.shortKey), t } Object.defineProperty(e, "__esModule", { value: !0 }), e.SHORTKEY = e.default = void 0; var v = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, b = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), g = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), m = n(21), _ = r(m), O = n(12), w = r(O), x = n(2), k = r(x), E = n(4), N = r(E), j = n(20), A = r(j), q = n(0), T = r(q), P = n(6), S = r(P), C = n(10), L = r(C), M = n(7), R = r(M), I = (0, L.default)("quill:keyboard"), B = /Mac/i.test(navigator.platform) ? "metaKey" : "ctrlKey", D = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.bindings = {}, Object.keys(r.options.bindings).forEach(function (e) { ("list autofill" !== e || null == t.scroll.whitelist || t.scroll.whitelist.list) && r.options.bindings[e] && r.addBinding(r.options.bindings[e]) }), r.addBinding({ key: e.keys.ENTER, shiftKey: null }, h), r.addBinding({ key: e.keys.ENTER, metaKey: null, ctrlKey: null, altKey: null }, function () { }), /Firefox/i.test(navigator.userAgent) ? (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0 }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0 }, c)) : (r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !0, prefix: /^.?$/ }, u), r.addBinding({ key: e.keys.DELETE }, { collapsed: !0, suffix: /^.?$/ }, c)), r.addBinding({ key: e.keys.BACKSPACE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.DELETE }, { collapsed: !1 }, f), r.addBinding({ key: e.keys.BACKSPACE, altKey: null, ctrlKey: null, metaKey: null, shiftKey: null }, { collapsed: !0, offset: 0 }, u), r.listen(), r } return a(e, t), g(e, null, [{ key: "match", value: function (t, e) { return e = y(e), !["altKey", "ctrlKey", "metaKey", "shiftKey"].some(function (n) { return !!e[n] !== t[n] && null !== e[n] }) && e.key === (t.which || t.keyCode) } }]), g(e, [{ key: "addBinding", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, r = y(t); if (null == r || null == r.key) return I.warn("Attempted to add invalid keyboard binding", r); "function" == typeof e && (e = { handler: e }), "function" == typeof n && (n = { handler: n }), r = (0, k.default)(r, e, n), this.bindings[r.key] = this.bindings[r.key] || [], this.bindings[r.key].push(r) } }, { key: "listen", value: function () { var t = this; this.quill.root.addEventListener("keydown", function (n) { if (!n.defaultPrevented) { var r = n.which || n.keyCode, o = (t.bindings[r] || []).filter(function (t) { return e.match(n, t) }); if (0 !== o.length) { var i = t.quill.getSelection(); if (null != i && t.quill.hasFocus()) { var l = t.quill.getLine(i.index), a = b(l, 2), s = a[0], u = a[1], c = t.quill.getLeaf(i.index), f = b(c, 2), h = f[0], p = f[1], d = 0 === i.length ? [h, p] : t.quill.getLeaf(i.index + i.length), y = b(d, 2), g = y[0], m = y[1], _ = h instanceof T.default.Text ? h.value().slice(0, p) : "", O = g instanceof T.default.Text ? g.value().slice(m) : "", x = { collapsed: 0 === i.length, empty: 0 === i.length && s.length() <= 1, format: t.quill.getFormat(i), offset: u, prefix: _, suffix: O }; o.some(function (e) { if (null != e.collapsed && e.collapsed !== x.collapsed) return !1; if (null != e.empty && e.empty !== x.empty) return !1; if (null != e.offset && e.offset !== x.offset) return !1; if (Array.isArray(e.format)) { if (e.format.every(function (t) { return null == x.format[t] })) return !1 } else if ("object" === v(e.format) && !Object.keys(e.format).every(function (t) { return !0 === e.format[t] ? null != x.format[t] : !1 === e.format[t] ? null == x.format[t] : (0, w.default)(e.format[t], x.format[t]) })) return !1; return !(null != e.prefix && !e.prefix.test(x.prefix)) && (!(null != e.suffix && !e.suffix.test(x.suffix)) && !0 !== e.handler.call(t, i, x)) }) && n.preventDefault() } } } }) } }]), e }(R.default); D.keys = { BACKSPACE: 8, TAB: 9, ENTER: 13, ESCAPE: 27, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }, D.DEFAULTS = { bindings: { bold: d("bold"), italic: d("italic"), underline: d("underline"), indent: { key: D.keys.TAB, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "+1", S.default.sources.USER) } }, outdent: { key: D.keys.TAB, shiftKey: !0, format: ["blockquote", "indent", "list"], handler: function (t, e) { if (e.collapsed && 0 !== e.offset) return !0; this.quill.format("indent", "-1", S.default.sources.USER) } }, "outdent backspace": { key: D.keys.BACKSPACE, collapsed: !0, shiftKey: null, metaKey: null, ctrlKey: null, altKey: null, format: ["indent", "list"], offset: 0, handler: function (t, e) { null != e.format.indent ? this.quill.format("indent", "-1", S.default.sources.USER) : null != e.format.list && this.quill.format("list", !1, S.default.sources.USER) } }, "indent code-block": p(!0), "outdent code-block": p(!1), "remove tab": { key: D.keys.TAB, shiftKey: !0, collapsed: !0, prefix: /\t$/, handler: function (t) { this.quill.deleteText(t.index - 1, 1, S.default.sources.USER) } }, tab: { key: D.keys.TAB, handler: function (t) { this.quill.history.cutoff(); var e = (new N.default).retain(t.index).delete(t.length).insert("\t"); this.quill.updateContents(e, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index + 1, S.default.sources.SILENT) } }, "list empty enter": { key: D.keys.ENTER, collapsed: !0, format: ["list"], empty: !0, handler: function (t, e) { this.quill.format("list", !1, S.default.sources.USER), e.format.indent && this.quill.format("indent", !1, S.default.sources.USER) } }, "checklist enter": { key: D.keys.ENTER, collapsed: !0, format: { list: "checked" }, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (0, k.default)({}, r.formats(), { list: "checked" }), l = (new N.default).retain(t.index).insert("\n", i).retain(r.length() - o - 1).retain(1, { list: "unchecked" }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "header enter": { key: D.keys.ENTER, collapsed: !0, format: ["header"], suffix: /^$/, handler: function (t, e) { var n = this.quill.getLine(t.index), r = b(n, 2), o = r[0], i = r[1], l = (new N.default).retain(t.index).insert("\n", e.format).retain(o.length() - i - 1).retain(1, { header: null }); this.quill.updateContents(l, S.default.sources.USER), this.quill.setSelection(t.index + 1, S.default.sources.SILENT), this.quill.scrollIntoView() } }, "list autofill": { key: " ", collapsed: !0, format: { list: !1 }, prefix: /^\s*?(\d+\.|-|\*|\[ ?\]|\[x\])$/, handler: function (t, e) { var n = e.prefix.length, r = this.quill.getLine(t.index), o = b(r, 2), i = o[0], l = o[1]; if (l > n) return !0; var a = void 0; switch (e.prefix.trim()) { case "[]": case "[ ]": a = "unchecked"; break; case "[x]": a = "checked"; break; case "-": case "*": a = "bullet"; break; default: a = "ordered" }this.quill.insertText(t.index, " ", S.default.sources.USER), this.quill.history.cutoff(); var s = (new N.default).retain(t.index - l).delete(n + 1).retain(i.length() - 2 - l).retain(1, { list: a }); this.quill.updateContents(s, S.default.sources.USER), this.quill.history.cutoff(), this.quill.setSelection(t.index - n, S.default.sources.SILENT) } }, "code exit": { key: D.keys.ENTER, collapsed: !0, format: ["code-block"], prefix: /\n\n$/, suffix: /^\s+$/, handler: function (t) { var e = this.quill.getLine(t.index), n = b(e, 2), r = n[0], o = n[1], i = (new N.default).retain(t.index + r.length() - o - 2).retain(1, { "code-block": null }).delete(1); this.quill.updateContents(i, S.default.sources.USER) } }, "embed left": s(D.keys.LEFT, !1), "embed left shift": s(D.keys.LEFT, !0), "embed right": s(D.keys.RIGHT, !1), "embed right shift": s(D.keys.RIGHT, !0) } }, e.default = D, e.SHORTKEY = B }, function (t, e, n) { "use strict"; t.exports = { align: { "": n(75), center: n(76), right: n(77), justify: n(78) }, background: n(79), blockquote: n(80), bold: n(81), clean: n(82), code: n(40), "code-block": n(40), color: n(83), direction: { "": n(84), rtl: n(85) }, float: { center: n(86), full: n(87), left: n(88), right: n(89) }, formula: n(90), header: { 1: n(91), 2: n(92) }, italic: n(93), image: n(94), indent: { "+1": n(95), "-1": n(96) }, link: n(97), list: { ordered: n(98), bullet: n(99), check: n(100) }, script: { sub: n(101), super: n(102) }, strike: n(103), underline: n(104), video: n(105) } }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(1), o = function () { function t(t) { this.domNode = t, this.domNode[r.DATA_KEY] = { blot: this } } return Object.defineProperty(t.prototype, "statics", { get: function () { return this.constructor }, enumerable: !0, configurable: !0 }), t.create = function (t) { if (null == this.tagName) throw new r.ParchmentError("Blot definition missing tagName"); var e; return Array.isArray(this.tagName) ? ("string" == typeof t && (t = t.toUpperCase(), parseInt(t).toString() === t && (t = parseInt(t))), e = "number" == typeof t ? document.createElement(this.tagName[t - 1]) : this.tagName.indexOf(t) > -1 ? document.createElement(t) : document.createElement(this.tagName[0])) : e = document.createElement(this.tagName), this.className && e.classList.add(this.className), e }, t.prototype.attach = function () { null != this.parent && (this.scroll = this.parent.scroll) }, t.prototype.clone = function () { var t = this.domNode.cloneNode(!1); return r.create(t) }, t.prototype.detach = function () { null != this.parent && this.parent.removeChild(this), delete this.domNode[r.DATA_KEY] }, t.prototype.deleteAt = function (t, e) { this.isolate(t, e).remove() }, t.prototype.formatAt = function (t, e, n, o) { var i = this.isolate(t, e); if (null != r.query(n, r.Scope.BLOT) && o) i.wrap(n, o); else if (null != r.query(n, r.Scope.ATTRIBUTE)) { var l = r.create(this.statics.scope); i.wrap(l), l.format(n, o) } }, t.prototype.insertAt = function (t, e, n) { var o = null == n ? r.create("text", e) : r.create(e, n), i = this.split(t); this.parent.insertBefore(o, i) }, t.prototype.insertInto = function (t, e) { void 0 === e && (e = null), null != this.parent && this.parent.children.remove(this); var n = null; t.children.insertBefore(this, e), null != e && (n = e.domNode), this.domNode.parentNode == t.domNode && this.domNode.nextSibling == n || t.domNode.insertBefore(this.domNode, n), this.parent = t, this.attach() }, t.prototype.isolate = function (t, e) { var n = this.split(t); return n.split(e), n }, t.prototype.length = function () { return 1 }, t.prototype.offset = function (t) { return void 0 === t && (t = this.parent), null == this.parent || this == t ? 0 : this.parent.children.offset(this) + this.parent.offset(t) }, t.prototype.optimize = function (t) { null != this.domNode[r.DATA_KEY] && delete this.domNode[r.DATA_KEY].mutations }, t.prototype.remove = function () { null != this.domNode.parentNode && this.domNode.parentNode.removeChild(this.domNode), this.detach() }, t.prototype.replace = function (t) { null != t.parent && (t.parent.insertBefore(this, t.next), t.remove()) }, t.prototype.replaceWith = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return n.replace(this), n }, t.prototype.split = function (t, e) { return 0 === t ? this : this.next }, t.prototype.update = function (t, e) { }, t.prototype.wrap = function (t, e) { var n = "string" == typeof t ? r.create(t, e) : t; return null != this.parent && this.parent.insertBefore(n, this.next), n.appendChild(this), n }, t.blotName = "abstract", t }(); e.default = o }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = n(11), o = n(29), i = n(30), l = n(1), a = function () { function t(t) { this.attributes = {}, this.domNode = t, this.build() } return t.prototype.attribute = function (t, e) { e ? t.add(this.domNode, e) && (null != t.value(this.domNode) ? this.attributes[t.attrName] = t : delete this.attributes[t.attrName]) : (t.remove(this.domNode), delete this.attributes[t.attrName]) }, t.prototype.build = function () { var t = this; this.attributes = {}; var e = r.default.keys(this.domNode), n = o.default.keys(this.domNode), a = i.default.keys(this.domNode); e.concat(n).concat(a).forEach(function (e) { var n = l.query(e, l.Scope.ATTRIBUTE); n instanceof r.default && (t.attributes[n.attrName] = n) }) }, t.prototype.copy = function (t) { var e = this; Object.keys(this.attributes).forEach(function (n) { var r = e.attributes[n].value(e.domNode); t.format(n, r) }) }, t.prototype.move = function (t) { var e = this; this.copy(t), Object.keys(this.attributes).forEach(function (t) { e.attributes[t].remove(e.domNode) }), this.attributes = {} }, t.prototype.values = function () { var t = this; return Object.keys(this.attributes).reduce(function (e, n) { return e[n] = t.attributes[n].value(t.domNode), e }, {}) }, t }(); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { return (t.getAttribute("class") || "").split(/\s+/).filter(function (t) { return 0 === t.indexOf(e + "-") }) } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("class") || "").split(/\s+/).map(function (t) { return t.split("-").slice(0, -1).join("-") }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (this.remove(t), t.classList.add(this.keyName + "-" + e), !0) }, e.prototype.remove = function (t) { r(t, this.keyName).forEach(function (e) { t.classList.remove(e) }), 0 === t.classList.length && t.removeAttribute("class") }, e.prototype.value = function (t) { var e = r(t, this.keyName)[0] || "", n = e.slice(this.keyName.length + 1); return this.canAdd(t, n) ? n : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { var e = t.split("-"), n = e.slice(1).map(function (t) { return t[0].toUpperCase() + t.slice(1) }).join(""); return e[0] + n } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(11), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.keys = function (t) { return (t.getAttribute("style") || "").split(";").map(function (t) { return t.split(":")[0].trim() }) }, e.prototype.add = function (t, e) { return !!this.canAdd(t, e) && (t.style[r(this.keyName)] = e, !0) }, e.prototype.remove = function (t) { t.style[r(this.keyName)] = "", t.getAttribute("style") || t.removeAttribute("style") }, e.prototype.value = function (t) { var e = t.style[r(this.keyName)]; return this.canAdd(t, e) ? e : "" }, e }(i.default); e.default = l }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(8), p = r(h), d = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.selection = n, r.textNode = document.createTextNode(e.CONTENTS), r.domNode.appendChild(r.textNode), r._length = 0, r } return l(e, t), u(e, null, [{ key: "value", value: function () { } }]), u(e, [{ key: "detach", value: function () { null != this.parent && this.parent.removeChild(this) } }, { key: "format", value: function (t, n) { if (0 !== this._length) return s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n); for (var r = this, o = 0; null != r && r.statics.scope !== f.default.Scope.BLOCK_BLOT;)o += r.offset(r.parent), r = r.parent; null != r && (this._length = e.CONTENTS.length, r.optimize(), r.formatAt(o, e.CONTENTS.length, t, n), this._length = 0) } }, { key: "index", value: function (t, n) { return t === this.textNode ? 0 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "length", value: function () { return this._length } }, { key: "position", value: function () { return [this.textNode, this.textNode.data.length] } }, { key: "remove", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this), this.parent = null } }, { key: "restore", value: function () { if (!this.selection.composing && null != this.parent) { var t = this.textNode, n = this.selection.getNativeRange(), r = void 0, o = void 0, i = void 0; if (null != n && n.start.node === t && n.end.node === t) { var l = [t, n.start.offset, n.end.offset]; r = l[0], o = l[1], i = l[2] } for (; null != this.domNode.lastChild && this.domNode.lastChild !== this.textNode;)this.domNode.parentNode.insertBefore(this.domNode.lastChild, this.domNode); if (this.textNode.data !== e.CONTENTS) { var s = this.textNode.data.split(e.CONTENTS).join(""); this.next instanceof p.default ? (r = this.next.domNode, this.next.insertAt(0, s), this.textNode.data = e.CONTENTS) : (this.textNode.data = s, this.parent.insertBefore(f.default.create(this.textNode), this), this.textNode = document.createTextNode(e.CONTENTS), this.domNode.appendChild(this.textNode)) } if (this.remove(), null != o) { var u = [o, i].map(function (t) { return Math.max(0, Math.min(r.data.length, t - 1)) }), c = a(u, 2); return o = c[0], i = c[1], { startNode: r, startOffset: o, endNode: r, endOffset: i } } } } }, { key: "update", value: function (t, e) { var n = this; if (t.some(function (t) { return "characterData" === t.type && t.target === n.textNode })) { var r = this.restore(); r && (e.range = r) } } }, { key: "value", value: function () { return "" } }]), e }(f.default.Embed); d.blotName = "cursor", d.className = "ql-cursor", d.tagName = "span", d.CONTENTS = "\ufeff", e.default = d }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { r(this, t), this.quill = e, this.options = n, this.modules = {} } return o(t, [{ key: "init", value: function () { var t = this; Object.keys(this.options.modules).forEach(function (e) { null == t.modules[e] && t.addModule(e) }) } }, { key: "addModule", value: function (t) { var e = this.quill.constructor.import("modules/" + t); return this.modules[t] = new e(this.quill, this.options.modules[t] || {}), this.modules[t] } }]), t }(); i.DEFAULTS = { modules: {} }, i.themes = { default: i }, e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(8), h = r(f), p = "\ufeff", d = function (t) { function e(t) { o(this, e); var n = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return n.contentNode = document.createElement("span"), n.contentNode.setAttribute("contenteditable", !1), [].slice.call(n.domNode.childNodes).forEach(function (t) { n.contentNode.appendChild(t) }), n.leftGuard = document.createTextNode(p), n.rightGuard = document.createTextNode(p), n.domNode.appendChild(n.leftGuard), n.domNode.appendChild(n.contentNode), n.domNode.appendChild(n.rightGuard), n } return l(e, t), a(e, [{ key: "index", value: function (t, n) { return t === this.leftGuard ? 0 : t === this.rightGuard ? 1 : s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "index", this).call(this, t, n) } }, { key: "restore", value: function (t) { var e = void 0, n = void 0, r = t.data.split(p).join(""); if (t === this.leftGuard) if (this.prev instanceof h.default) { var o = this.prev.length(); this.prev.insertAt(o, r), e = { startNode: this.prev.domNode, startOffset: o + r.length } } else n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this), e = { startNode: n, startOffset: r.length }; else t === this.rightGuard && (this.next instanceof h.default ? (this.next.insertAt(0, r), e = { startNode: this.next.domNode, startOffset: r.length }) : (n = document.createTextNode(r), this.parent.insertBefore(c.default.create(n), this.next), e = { startNode: n, startOffset: r.length })); return t.data = p, e } }, { key: "update", value: function (t, e) { var n = this; t.forEach(function (t) { if ("characterData" === t.type && (t.target === n.leftGuard || t.target === n.rightGuard)) { var r = n.restore(t.target); r && (e.range = r) } }) } }]), e }(c.default.Embed); e.default = d }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.AlignStyle = e.AlignClass = e.AlignAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["right", "center", "justify"] }, l = new o.default.Attributor.Attribute("align", "align", i), a = new o.default.Attributor.Class("align", "ql-align", i), s = new o.default.Attributor.Style("align", "text-align", i); e.AlignAttribute = l, e.AlignClass = a, e.AlignStyle = s }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.BackgroundStyle = e.BackgroundClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = n(24), l = new o.default.Attributor.Class("background", "ql-bg", { scope: o.default.Scope.INLINE }), a = new i.ColorAttributor("background", "background-color", { scope: o.default.Scope.INLINE }); e.BackgroundClass = l, e.BackgroundStyle = a }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.DirectionStyle = e.DirectionClass = e.DirectionAttribute = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = { scope: o.default.Scope.BLOCK, whitelist: ["rtl"] }, l = new o.default.Attributor.Attribute("direction", "dir", i), a = new o.default.Attributor.Class("direction", "ql-direction", i), s = new o.default.Attributor.Style("direction", "direction", i); e.DirectionAttribute = l, e.DirectionClass = a, e.DirectionStyle = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.FontClass = e.FontStyle = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = { scope: u.default.Scope.INLINE, whitelist: ["serif", "monospace"] }, f = new u.default.Attributor.Class("font", "ql-font", c), h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "value", value: function (t) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t).replace(/["']/g, "") } }]), e }(u.default.Attributor.Style), p = new h("font", "font-family", c); e.FontStyle = p, e.FontClass = f }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }), e.SizeStyle = e.SizeClass = void 0; var r = n(0), o = function (t) { return t && t.__esModule ? t : { default: t } }(r), i = new o.default.Attributor.Class("size", "ql-size", { scope: o.default.Scope.INLINE, whitelist: ["small", "large", "huge"] }), l = new o.default.Attributor.Style("size", "font-size", { scope: o.default.Scope.INLINE, whitelist: ["10px", "18px", "32px"] }); e.SizeClass = i, e.SizeStyle = l }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "optimize", value: function (t) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t), this.domNode.tagName !== this.statics.tagName[0] && this.replaceWith(this.statics.blotName) } }], [{ key: "create", value: function () { return a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this) } }, { key: "formats", value: function () { return !0 } }]), e }(u.default); c.blotName = "bold", c.tagName = ["STRONG", "B"], e.default = c }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.label.innerHTML = n, i.container.classList.add("ql-color-picker"), [].slice.call(i.container.querySelectorAll(".ql-picker-item"), 0, 7).forEach(function (t) { t.classList.add("ql-primary") }), i } return i(e, t), l(e, [{ key: "buildItem", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "buildItem", this).call(this, t); return n.style.backgroundColor = t.getAttribute("value") || "", n } }, { key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n); var r = this.label.querySelector(".ql-color-label"), o = t ? t.getAttribute("data-value") || "" : ""; r && ("line" === r.tagName ? r.style.stroke = o : r.style.fill = o) } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(16), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e(t, n) { r(this, e); var i = o(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return i.container.classList.add("ql-icon-picker"), [].forEach.call(i.container.querySelectorAll(".ql-picker-item"), function (t) { t.innerHTML = n[t.getAttribute("data-value") || ""] }), i.defaultItem = i.container.querySelector(".ql-selected"), i.selectItem(i.defaultItem), i } return i(e, t), l(e, [{ key: "selectItem", value: function (t, n) { a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "selectItem", this).call(this, t, n), t = t || this.defaultItem, this.label.innerHTML = t.innerHTML } }]), e }(u.default); e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } Object.defineProperty(e, "__esModule", { value: !0 }); var o = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), i = function () { function t(e, n) { var o = this; r(this, t), this.quill = e, this.boundsContainer = n || document.body, this.root = e.addContainer("ql-tooltip"), this.root.innerHTML = this.constructor.TEMPLATE, this.quill.root === this.quill.scrollingContainer && this.quill.root.addEventListener("scroll", function () { o.root.style.marginTop = -1 * o.quill.root.scrollTop + "px" }), this.hide() } return o(t, [{ key: "hide", value: function () { this.root.classList.add("ql-hidden") } }, { key: "position", value: function (t) { var e = t.left + t.width / 2 - this.root.offsetWidth / 2, n = t.bottom + this.quill.root.scrollTop; this.root.style.left = e + "px", this.root.style.top = n + "px", this.root.classList.remove("ql-flip"); var r = this.boundsContainer.getBoundingClientRect(), o = this.root.getBoundingClientRect(), i = 0; if (o.right > r.right && (i = r.right - o.right, this.root.style.left = e + i + "px"), o.left < r.left && (i = r.left - o.left, this.root.style.left = e + i + "px"), o.bottom > r.bottom) { var l = o.bottom - o.top, a = t.bottom - t.top + l; this.root.style.top = n - a + "px", this.root.classList.add("ql-flip") } return i } }, { key: "show", value: function () { this.root.classList.remove("ql-editing"), this.root.classList.remove("ql-hidden") } }]), t }(); e.default = i }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtube\.com\/watch.*v=([a-zA-Z0-9_-]+)/) || t.match(/^(?:(https?):\/\/)?(?:(?:www|m)\.)?youtu\.be\/([a-zA-Z0-9_-]+)/); return e ? (e[1] || "https") + "://www.youtube.com/embed/" + e[2] + "?showinfo=0" : (e = t.match(/^(?:(https?):\/\/)?(?:www\.)?vimeo\.com\/(\d+)/)) ? (e[1] || "https") + "://player.vimeo.com/video/" + e[2] + "/" : t } function s(t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; e.forEach(function (e) { var r = document.createElement("option"); e === n ? r.setAttribute("selected", "selected") : r.setAttribute("value", e), t.appendChild(r) }) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BaseTooltip = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(2), h = r(f), p = n(4), d = r(p), y = n(9), v = r(y), b = n(25), g = r(b), m = n(32), _ = r(m), O = n(41), w = r(O), x = n(42), k = r(x), E = n(16), N = r(E), j = n(43), A = r(j), q = [!1, "center", "right", "justify"], T = ["#000000", "#e60000", "#ff9900", "#ffff00", "#008a00", "#0066cc", "#9933ff", "#ffffff", "#facccc", "#ffebcc", "#ffffcc", "#cce8cc", "#cce0f5", "#ebd6ff", "#bbbbbb", "#f06666", "#ffc266", "#ffff66", "#66b966", "#66a3e0", "#c285ff", "#888888", "#a10000", "#b26b00", "#b2b200", "#006100", "#0047b2", "#6b24b2", "#444444", "#5c0000", "#663d00", "#666600", "#003700", "#002966", "#3d1466"], P = [!1, "serif", "monospace"], S = ["1", "2", "3", !1], C = ["small", !1, "large", "huge"], L = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)), l = function e(n) { if (!document.body.contains(t.root)) return document.body.removeEventListener("click", e); null == r.tooltip || r.tooltip.root.contains(n.target) || document.activeElement === r.tooltip.textbox || r.quill.hasFocus() || r.tooltip.hide(), null != r.pickers && r.pickers.forEach(function (t) { t.container.contains(n.target) || t.close() }) }; return t.emitter.listenDOM("click", document.body, l), r } return l(e, t), u(e, [{ key: "addModule", value: function (t) { var n = c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "addModule", this).call(this, t); return "toolbar" === t && this.extendToolbar(n), n } }, { key: "buildButtons", value: function (t, e) { t.forEach(function (t) { (t.getAttribute("class") || "").split(/\s+/).forEach(function (n) { if (n.startsWith("ql-") && (n = n.slice("ql-".length), null != e[n])) if ("direction" === n) t.innerHTML = e[n][""] + e[n].rtl; else if ("string" == typeof e[n]) t.innerHTML = e[n]; else { var r = t.value || ""; null != r && e[n][r] && (t.innerHTML = e[n][r]) } }) }) } }, { key: "buildPickers", value: function (t, e) { var n = this; this.pickers = t.map(function (t) { if (t.classList.contains("ql-align")) return null == t.querySelector("option") && s(t, q), new k.default(t, e.align); if (t.classList.contains("ql-background") || t.classList.contains("ql-color")) { var n = t.classList.contains("ql-background") ? "background" : "color"; return null == t.querySelector("option") && s(t, T, "background" === n ? "#ffffff" : "#000000"), new w.default(t, e[n]) } return null == t.querySelector("option") && (t.classList.contains("ql-font") ? s(t, P) : t.classList.contains("ql-header") ? s(t, S) : t.classList.contains("ql-size") && s(t, C)), new N.default(t) }); var r = function () { n.pickers.forEach(function (t) { t.update() }) }; this.quill.on(v.default.events.EDITOR_CHANGE, r) } }]), e }(_.default); L.DEFAULTS = (0, h.default)(!0, {}, _.default.DEFAULTS, { modules: { toolbar: { handlers: { formula: function () { this.quill.theme.tooltip.edit("formula") }, image: function () { var t = this, e = this.container.querySelector("input.ql-image[type=file]"); null == e && (e = document.createElement("input"), e.setAttribute("type", "file"), e.setAttribute("accept", "image/png, image/gif, image/jpeg, image/bmp, image/x-icon"), e.classList.add("ql-image"), e.addEventListener("change", function () { if (null != e.files && null != e.files[0]) { var n = new FileReader; n.onload = function (n) { var r = t.quill.getSelection(!0); t.quill.updateContents((new d.default).retain(r.index).delete(r.length).insert({ image: n.target.result }), v.default.sources.USER), t.quill.setSelection(r.index + 1, v.default.sources.SILENT), e.value = "" }, n.readAsDataURL(e.files[0]) } }), this.container.appendChild(e)), e.click() }, video: function () { this.quill.theme.tooltip.edit("video") } } } } }); var M = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.textbox = r.root.querySelector('input[type="text"]'), r.listen(), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; this.textbox.addEventListener("keydown", function (e) { g.default.match(e, "enter") ? (t.save(), e.preventDefault()) : g.default.match(e, "escape") && (t.cancel(), e.preventDefault()) }) } }, { key: "cancel", value: function () { this.hide() } }, { key: "edit", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "link", e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : null; this.root.classList.remove("ql-hidden"), this.root.classList.add("ql-editing"), null != e ? this.textbox.value = e : t !== this.root.getAttribute("data-mode") && (this.textbox.value = ""), this.position(this.quill.getBounds(this.quill.selection.savedRange)), this.textbox.select(), this.textbox.setAttribute("placeholder", this.textbox.getAttribute("data-" + t) || ""), this.root.setAttribute("data-mode", t) } }, { key: "restoreFocus", value: function () { var t = this.quill.scrollingContainer.scrollTop; this.quill.focus(), this.quill.scrollingContainer.scrollTop = t } }, { key: "save", value: function () { var t = this.textbox.value; switch (this.root.getAttribute("data-mode")) { case "link": var e = this.quill.root.scrollTop; this.linkRange ? (this.quill.formatText(this.linkRange, "link", t, v.default.sources.USER), delete this.linkRange) : (this.restoreFocus(), this.quill.format("link", t, v.default.sources.USER)), this.quill.root.scrollTop = e; break; case "video": t = a(t); case "formula": if (!t) break; var n = this.quill.getSelection(!0); if (null != n) { var r = n.index + n.length; this.quill.insertEmbed(r, this.root.getAttribute("data-mode"), t, v.default.sources.USER), "formula" === this.root.getAttribute("data-mode") && this.quill.insertText(r + 1, " ", v.default.sources.USER), this.quill.setSelection(r + 2, v.default.sources.USER) } }this.textbox.value = "", this.hide() } }]), e }(A.default); e.BaseTooltip = M, e.default = L }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(46), i = r(o), l = n(34), a = n(36), s = n(62), u = n(63), c = r(u), f = n(64), h = r(f), p = n(65), d = r(p), y = n(35), v = n(24), b = n(37), g = n(38), m = n(39), _ = r(m), O = n(66), w = r(O), x = n(15), k = r(x), E = n(67), N = r(E), j = n(68), A = r(j), q = n(69), T = r(q), P = n(70), S = r(P), C = n(71), L = r(C), M = n(13), R = r(M), I = n(72), B = r(I), D = n(73), U = r(D), F = n(74), H = r(F), K = n(26), z = r(K), V = n(16), Z = r(V), W = n(41), G = r(W), Y = n(42), X = r(Y), $ = n(43), Q = r($), J = n(107), tt = r(J), et = n(108), nt = r(et); i.default.register({ "attributors/attribute/direction": a.DirectionAttribute, "attributors/class/align": l.AlignClass, "attributors/class/background": y.BackgroundClass, "attributors/class/color": v.ColorClass, "attributors/class/direction": a.DirectionClass, "attributors/class/font": b.FontClass, "attributors/class/size": g.SizeClass, "attributors/style/align": l.AlignStyle, "attributors/style/background": y.BackgroundStyle, "attributors/style/color": v.ColorStyle, "attributors/style/direction": a.DirectionStyle, "attributors/style/font": b.FontStyle, "attributors/style/size": g.SizeStyle }, !0), i.default.register({ "formats/align": l.AlignClass, "formats/direction": a.DirectionClass, "formats/indent": s.IndentClass, "formats/background": y.BackgroundStyle, "formats/color": v.ColorStyle, "formats/font": b.FontClass, "formats/size": g.SizeClass, "formats/blockquote": c.default, "formats/code-block": R.default, "formats/header": h.default, "formats/list": d.default, "formats/bold": _.default, "formats/code": M.Code, "formats/italic": w.default, "formats/link": k.default, "formats/script": N.default, "formats/strike": A.default, "formats/underline": T.default, "formats/image": S.default, "formats/video": L.default, "formats/list/item": p.ListItem, "modules/formula": B.default, "modules/syntax": U.default, "modules/toolbar": H.default, "themes/bubble": tt.default, "themes/snow": nt.default, "ui/icons": z.default, "ui/picker": Z.default, "ui/icon-picker": X.default, "ui/color-picker": G.default, "ui/tooltip": Q.default }, !0), e.default = i.default }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(0), i = r(o), l = n(6), a = r(l), s = n(3), u = r(s), c = n(14), f = r(c), h = n(23), p = r(h), d = n(31), y = r(d), v = n(33), b = r(v), g = n(5), m = r(g), _ = n(59), O = r(_), w = n(8), x = r(w), k = n(60), E = r(k), N = n(61), j = r(N), A = n(25), q = r(A); a.default.register({ "blots/block": u.default, "blots/block/embed": s.BlockEmbed, "blots/break": f.default, "blots/container": p.default, "blots/cursor": y.default, "blots/embed": b.default, "blots/inline": m.default, "blots/scroll": O.default, "blots/text": x.default, "modules/clipboard": E.default, "modules/history": j.default, "modules/keyboard": q.default }), i.default.register(u.default, f.default, y.default, m.default, O.default, x.default), e.default = a.default }, function (t, e, n) { "use strict"; Object.defineProperty(e, "__esModule", { value: !0 }); var r = function () { function t() { this.head = this.tail = null, this.length = 0 } return t.prototype.append = function () { for (var t = [], e = 0; e < arguments.length; e++)t[e] = arguments[e]; this.insertBefore(t[0], null), t.length > 1 && this.append.apply(this, t.slice(1)) }, t.prototype.contains = function (t) { for (var e, n = this.iterator(); e = n();)if (e === t) return !0; return !1 }, t.prototype.insertBefore = function (t, e) { t && (t.next = e, null != e ? (t.prev = e.prev, null != e.prev && (e.prev.next = t), e.prev = t, e === this.head && (this.head = t)) : null != this.tail ? (this.tail.next = t, t.prev = this.tail, this.tail = t) : (t.prev = null, this.head = this.tail = t), this.length += 1) }, t.prototype.offset = function (t) { for (var e = 0, n = this.head; null != n;) { if (n === t) return e; e += n.length(), n = n.next } return -1 }, t.prototype.remove = function (t) { this.contains(t) && (null != t.prev && (t.prev.next = t.next), null != t.next && (t.next.prev = t.prev), t === this.head && (this.head = t.next), t === this.tail && (this.tail = t.prev), this.length -= 1) }, t.prototype.iterator = function (t) { return void 0 === t && (t = this.head), function () { var e = t; return null != t && (t = t.next), e } }, t.prototype.find = function (t, e) { void 0 === e && (e = !1); for (var n, r = this.iterator(); n = r();) { var o = n.length(); if (t < o || e && t === o && (null == n.next || 0 !== n.next.length())) return [n, t]; t -= o } return [null, 0] }, t.prototype.forEach = function (t) { for (var e, n = this.iterator(); e = n();)t(e) }, t.prototype.forEachAt = function (t, e, n) { if (!(e <= 0)) for (var r, o = this.find(t), i = o[0], l = o[1], a = t - l, s = this.iterator(i); (r = s()) && a < t + e;) { var u = r.length(); t > a ? n(r, t - a, Math.min(e, a + u - t)) : n(r, 0, Math.min(u, t + e - a)), a += u } }, t.prototype.map = function (t) { return this.reduce(function (e, n) { return e.push(t(n)), e }, []) }, t.prototype.reduce = function (t, e) { for (var n, r = this.iterator(); n = r();)e = t(e, n); return e }, t }(); e.default = r }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(17), i = n(1), l = { attributes: !0, characterData: !0, characterDataOldValue: !0, childList: !0, subtree: !0 }, a = function (t) { function e(e) { var n = t.call(this, e) || this; return n.scroll = n, n.observer = new MutationObserver(function (t) { n.update(t) }), n.observer.observe(n.domNode, l), n.attach(), n } return r(e, t), e.prototype.detach = function () { t.prototype.detach.call(this), this.observer.disconnect() }, e.prototype.deleteAt = function (e, n) { this.update(), 0 === e && n === this.length() ? this.children.forEach(function (t) { t.remove() }) : t.prototype.deleteAt.call(this, e, n) }, e.prototype.formatAt = function (e, n, r, o) { this.update(), t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { this.update(), t.prototype.insertAt.call(this, e, n, r) }, e.prototype.optimize = function (e, n) { var r = this; void 0 === e && (e = []), void 0 === n && (n = {}), t.prototype.optimize.call(this, n); for (var l = [].slice.call(this.observer.takeRecords()); l.length > 0;)e.push(l.pop()); for (var a = function (t, e) { void 0 === e && (e = !0), null != t && t !== r && null != t.domNode.parentNode && (null == t.domNode[i.DATA_KEY].mutations && (t.domNode[i.DATA_KEY].mutations = []), e && a(t.parent)) }, s = function (t) { null != t.domNode[i.DATA_KEY] && null != t.domNode[i.DATA_KEY].mutations && (t instanceof o.default && t.children.forEach(s), t.optimize(n)) }, u = e, c = 0; u.length > 0; c += 1) { if (c >= 100) throw new Error("[Parchment] Maximum optimize iterations reached"); for (u.forEach(function (t) { var e = i.find(t.target, !0); null != e && (e.domNode === t.target && ("childList" === t.type ? (a(i.find(t.previousSibling, !1)), [].forEach.call(t.addedNodes, function (t) { var e = i.find(t, !1); a(e, !1), e instanceof o.default && e.children.forEach(function (t) { a(t, !1) }) })) : "attributes" === t.type && a(e.prev)), a(e)) }), this.children.forEach(s), u = [].slice.call(this.observer.takeRecords()), l = u.slice(); l.length > 0;)e.push(l.pop()) } }, e.prototype.update = function (e, n) { var r = this; void 0 === n && (n = {}), e = e || this.observer.takeRecords(), e.map(function (t) { var e = i.find(t.target, !0); return null == e ? null : null == e.domNode[i.DATA_KEY].mutations ? (e.domNode[i.DATA_KEY].mutations = [t], e) : (e.domNode[i.DATA_KEY].mutations.push(t), null) }).forEach(function (t) { null != t && t !== r && null != t.domNode[i.DATA_KEY] && t.update(t.domNode[i.DATA_KEY].mutations || [], n) }), null != this.domNode[i.DATA_KEY].mutations && t.prototype.update.call(this, this.domNode[i.DATA_KEY].mutations, n), this.optimize(e, n) }, e.blotName = "scroll", e.defaultChild = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "DIV", e }(o.default); e.default = a }, function (t, e, n) { "use strict"; function r(t, e) { if (Object.keys(t).length !== Object.keys(e).length) return !1; for (var n in t) if (t[n] !== e[n]) return !1; return !0 } var o = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var i = n(18), l = n(1), a = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return o(e, t), e.formats = function (n) { if (n.tagName !== e.tagName) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { var o = this; n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : (this.children.forEach(function (t) { t instanceof i.default || (t = t.wrap(e.blotName, !0)), o.attributes.copy(t) }), this.unwrap()) }, e.prototype.formatAt = function (e, n, r, o) { if (null != this.formats()[r] || l.query(r, l.Scope.ATTRIBUTE)) { this.isolate(e, n).format(r, o) } else t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n); var o = this.formats(); if (0 === Object.keys(o).length) return this.unwrap(); var i = this.next; i instanceof e && i.prev === this && r(o, i.formats()) && (i.moveChildren(this), i.remove()) }, e.blotName = "inline", e.scope = l.Scope.INLINE_BLOT, e.tagName = "SPAN", e }(i.default); e.default = a }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(18), i = n(1), l = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (n) { var r = i.query(e.blotName).tagName; if (n.tagName !== r) return t.formats.call(this, n) }, e.prototype.format = function (n, r) { null != i.query(n, i.Scope.BLOCK) && (n !== this.statics.blotName || r ? t.prototype.format.call(this, n, r) : this.replaceWith(e.blotName)) }, e.prototype.formatAt = function (e, n, r, o) { null != i.query(r, i.Scope.BLOCK) ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.insertAt = function (e, n, r) { if (null == r || null != i.query(n, i.Scope.INLINE)) t.prototype.insertAt.call(this, e, n, r); else { var o = this.split(e), l = i.create(n, r); o.parent.insertBefore(l, o) } }, e.prototype.update = function (e, n) { navigator.userAgent.match(/Trident/) ? this.build() : t.prototype.update.call(this, e, n) }, e.blotName = "block", e.scope = i.Scope.BLOCK_BLOT, e.tagName = "P", e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = function (t) { function e() { return null !== t && t.apply(this, arguments) || this } return r(e, t), e.formats = function (t) { }, e.prototype.format = function (e, n) { t.prototype.formatAt.call(this, 0, this.length(), e, n) }, e.prototype.formatAt = function (e, n, r, o) { 0 === e && n === this.length() ? this.format(r, o) : t.prototype.formatAt.call(this, e, n, r, o) }, e.prototype.formats = function () { return this.statics.formats(this.domNode) }, e }(o.default); e.default = i }, function (t, e, n) { "use strict"; var r = this && this.__extends || function () { var t = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (t, e) { t.__proto__ = e } || function (t, e) { for (var n in e) e.hasOwnProperty(n) && (t[n] = e[n]) }; return function (e, n) { function r() { this.constructor = e } t(e, n), e.prototype = null === n ? Object.create(n) : (r.prototype = n.prototype, new r) } }(); Object.defineProperty(e, "__esModule", { value: !0 }); var o = n(19), i = n(1), l = function (t) { function e(e) { var n = t.call(this, e) || this; return n.text = n.statics.value(n.domNode), n } return r(e, t), e.create = function (t) { return document.createTextNode(t) }, e.value = function (t) { var e = t.data; return e.normalize && (e = e.normalize()), e }, e.prototype.deleteAt = function (t, e) { this.domNode.data = this.text = this.text.slice(0, t) + this.text.slice(t + e) }, e.prototype.index = function (t, e) { return this.domNode === t ? e : -1 }, e.prototype.insertAt = function (e, n, r) { null == r ? (this.text = this.text.slice(0, e) + n + this.text.slice(e), this.domNode.data = this.text) : t.prototype.insertAt.call(this, e, n, r) }, e.prototype.length = function () { return this.text.length }, e.prototype.optimize = function (n) { t.prototype.optimize.call(this, n), this.text = this.statics.value(this.domNode), 0 === this.text.length ? this.remove() : this.next instanceof e && this.next.prev === this && (this.insertAt(this.length(), this.next.value()), this.next.remove()) }, e.prototype.position = function (t, e) { return void 0 === e && (e = !1), [this.domNode, t] }, e.prototype.split = function (t, e) { if (void 0 === e && (e = !1), !e) { if (0 === t) return this; if (t === this.length()) return this.next } var n = i.create(this.domNode.splitText(t)); return this.parent.insertBefore(n, this.next), this.text = this.statics.value(this.domNode), n }, e.prototype.update = function (t, e) { var n = this; t.some(function (t) { return "characterData" === t.type && t.target === n.domNode }) && (this.text = this.statics.value(this.domNode)) }, e.prototype.value = function () { return this.text }, e.blotName = "text", e.scope = i.Scope.INLINE_BLOT, e }(o.default); e.default = l }, function (t, e, n) { "use strict"; var r = document.createElement("div"); if (r.classList.toggle("test-class", !1), r.classList.contains("test-class")) { var o = DOMTokenList.prototype.toggle; DOMTokenList.prototype.toggle = function (t, e) { return arguments.length > 1 && !this.contains(t) == !e ? e : o.call(this, t) } } String.prototype.startsWith || (String.prototype.startsWith = function (t, e) { return e = e || 0, this.substr(e, t.length) === t }), String.prototype.endsWith || (String.prototype.endsWith = function (t, e) { var n = this.toString(); ("number" != typeof e || !isFinite(e) || Math.floor(e) !== e || e > n.length) && (e = n.length), e -= t.length; var r = n.indexOf(t, e); return -1 !== r && r === e }), Array.prototype.find || Object.defineProperty(Array.prototype, "find", { value: function (t) { if (null === this) throw new TypeError("Array.prototype.find called on null or undefined"); if ("function" != typeof t) throw new TypeError("predicate must be a function"); for (var e, n = Object(this), r = n.length >>> 0, o = arguments[1], i = 0; i < r; i++)if (e = n[i], t.call(o, e, i, n)) return e } }), document.addEventListener("DOMContentLoaded", function () { document.execCommand("enableObjectResizing", !1, !1), document.execCommand("autoUrlDetect", !1, !1) }) }, function (t, e) { function n(t, e, n) { if (t == e) return t ? [[v, t]] : []; (n < 0 || t.length < n) && (n = null); var o = l(t, e), i = t.substring(0, o); t = t.substring(o), e = e.substring(o), o = a(t, e); var s = t.substring(t.length - o); t = t.substring(0, t.length - o), e = e.substring(0, e.length - o); var c = r(t, e); return i && c.unshift([v, i]), s && c.push([v, s]), u(c), null != n && (c = f(c, n)), c = h(c) } function r(t, e) { var r; if (!t) return [[y, e]]; if (!e) return [[d, t]]; var i = t.length > e.length ? t : e, l = t.length > e.length ? e : t, a = i.indexOf(l); if (-1 != a) return r = [[y, i.substring(0, a)], [v, l], [y, i.substring(a + l.length)]], t.length > e.length && (r[0][0] = r[2][0] = d), r; if (1 == l.length) return [[d, t], [y, e]]; var u = s(t, e); if (u) { var c = u[0], f = u[1], h = u[2], p = u[3], b = u[4], g = n(c, h), m = n(f, p); return g.concat([[v, b]], m) } return o(t, e) } function o(t, e) { for (var n = t.length, r = e.length, o = Math.ceil((n + r) / 2), l = o, a = 2 * o, s = new Array(a), u = new Array(a), c = 0; c < a; c++)s[c] = -1, u[c] = -1; s[l + 1] = 0, u[l + 1] = 0; for (var f = n - r, h = f % 2 != 0, p = 0, v = 0, b = 0, g = 0, m = 0; m < o; m++) { for (var _ = -m + p; _ <= m - v; _ += 2) { var O, w = l + _; O = _ == -m || _ != m && s[w - 1] < s[w + 1] ? s[w + 1] : s[w - 1] + 1; for (var x = O - _; O < n && x < r && t.charAt(O) == e.charAt(x);)O++, x++; if (s[w] = O, O > n) v += 2; else if (x > r) p += 2; else if (h) { var k = l + f - _; if (k >= 0 && k < a && -1 != u[k]) { var E = n - u[k]; if (O >= E) return i(t, e, O, x) } } } for (var N = -m + b; N <= m - g; N += 2) { var E, k = l + N; E = N == -m || N != m && u[k - 1] < u[k + 1] ? u[k + 1] : u[k - 1] + 1; for (var j = E - N; E < n && j < r && t.charAt(n - E - 1) == e.charAt(r - j - 1);)E++, j++; if (u[k] = E, E > n) g += 2; else if (j > r) b += 2; else if (!h) { var w = l + f - N; if (w >= 0 && w < a && -1 != s[w]) { var O = s[w], x = l + O - w; if (E = n - E, O >= E) return i(t, e, O, x) } } } } return [[d, t], [y, e]] } function i(t, e, r, o) { var i = t.substring(0, r), l = e.substring(0, o), a = t.substring(r), s = e.substring(o), u = n(i, l), c = n(a, s); return u.concat(c) } function l(t, e) { if (!t || !e || t.charAt(0) != e.charAt(0)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(i, o) == e.substring(i, o) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function a(t, e) { if (!t || !e || t.charAt(t.length - 1) != e.charAt(e.length - 1)) return 0; for (var n = 0, r = Math.min(t.length, e.length), o = r, i = 0; n < o;)t.substring(t.length - o, t.length - i) == e.substring(e.length - o, e.length - i) ? (n = o, i = n) : r = o, o = Math.floor((r - n) / 2 + n); return o } function s(t, e) { function n(t, e, n) { for (var r, o, i, s, u = t.substring(n, n + Math.floor(t.length / 4)), c = -1, f = ""; -1 != (c = e.indexOf(u, c + 1));) { var h = l(t.substring(n), e.substring(c)), p = a(t.substring(0, n), e.substring(0, c)); f.length < p + h && (f = e.substring(c - p, c) + e.substring(c, c + h), r = t.substring(0, n - p), o = t.substring(n + h), i = e.substring(0, c - p), s = e.substring(c + h)) } return 2 * f.length >= t.length ? [r, o, i, s, f] : null } var r = t.length > e.length ? t : e, o = t.length > e.length ? e : t; if (r.length < 4 || 2 * o.length < r.length) return null; var i, s = n(r, o, Math.ceil(r.length / 4)), u = n(r, o, Math.ceil(r.length / 2)); if (!s && !u) return null; i = u ? s && s[4].length > u[4].length ? s : u : s; var c, f, h, p; return t.length > e.length ? (c = i[0], f = i[1], h = i[2], p = i[3]) : (h = i[0], p = i[1], c = i[2], f = i[3]), [c, f, h, p, i[4]] } function u(t) { t.push([v, ""]); for (var e, n = 0, r = 0, o = 0, i = "", s = ""; n < t.length;)switch (t[n][0]) { case y: o++, s += t[n][1], n++; break; case d: r++, i += t[n][1], n++; break; case v: r + o > 1 ? (0 !== r && 0 !== o && (e = l(s, i), 0 !== e && (n - r - o > 0 && t[n - r - o - 1][0] == v ? t[n - r - o - 1][1] += s.substring(0, e) : (t.splice(0, 0, [v, s.substring(0, e)]), n++), s = s.substring(e), i = i.substring(e)), 0 !== (e = a(s, i)) && (t[n][1] = s.substring(s.length - e) + t[n][1], s = s.substring(0, s.length - e), i = i.substring(0, i.length - e))), 0 === r ? t.splice(n - o, r + o, [y, s]) : 0 === o ? t.splice(n - r, r + o, [d, i]) : t.splice(n - r - o, r + o, [d, i], [y, s]), n = n - r - o + (r ? 1 : 0) + (o ? 1 : 0) + 1) : 0 !== n && t[n - 1][0] == v ? (t[n - 1][1] += t[n][1], t.splice(n, 1)) : n++, o = 0, r = 0, i = "", s = "" }"" === t[t.length - 1][1] && t.pop(); var c = !1; for (n = 1; n < t.length - 1;)t[n - 1][0] == v && t[n + 1][0] == v && (t[n][1].substring(t[n][1].length - t[n - 1][1].length) == t[n - 1][1] ? (t[n][1] = t[n - 1][1] + t[n][1].substring(0, t[n][1].length - t[n - 1][1].length), t[n + 1][1] = t[n - 1][1] + t[n + 1][1], t.splice(n - 1, 1), c = !0) : t[n][1].substring(0, t[n + 1][1].length) == t[n + 1][1] && (t[n - 1][1] += t[n + 1][1], t[n][1] = t[n][1].substring(t[n + 1][1].length) + t[n + 1][1], t.splice(n + 1, 1), c = !0)), n++; c && u(t) } function c(t, e) { if (0 === e) return [v, t]; for (var n = 0, r = 0; r < t.length; r++) { var o = t[r]; if (o[0] === d || o[0] === v) { var i = n + o[1].length; if (e === i) return [r + 1, t]; if (e < i) { t = t.slice(); var l = e - n, a = [o[0], o[1].slice(0, l)], s = [o[0], o[1].slice(l)]; return t.splice(r, 1, a, s), [r + 1, t] } n = i } } throw new Error("cursor_pos is out of bounds!") } function f(t, e) { var n = c(t, e), r = n[1], o = n[0], i = r[o], l = r[o + 1]; if (null == i) return t; if (i[0] !== v) return t; if (null != l && i[1] + l[1] === l[1] + i[1]) return r.splice(o, 2, l, i), p(r, o, 2); if (null != l && 0 === l[1].indexOf(i[1])) { r.splice(o, 2, [l[0], i[1]], [0, i[1]]); var a = l[1].slice(i[1].length); return a.length > 0 && r.splice(o + 2, 0, [l[0], a]), p(r, o, 3) } return t } function h(t) { for (var e = !1, n = function (t) { return t.charCodeAt(0) >= 56320 && t.charCodeAt(0) <= 57343 }, r = 2; r < t.length; r += 1)t[r - 2][0] === v && function (t) { return t.charCodeAt(t.length - 1) >= 55296 && t.charCodeAt(t.length - 1) <= 56319 }(t[r - 2][1]) && t[r - 1][0] === d && n(t[r - 1][1]) && t[r][0] === y && n(t[r][1]) && (e = !0, t[r - 1][1] = t[r - 2][1].slice(-1) + t[r - 1][1], t[r][1] = t[r - 2][1].slice(-1) + t[r][1], t[r - 2][1] = t[r - 2][1].slice(0, -1)); if (!e) return t; for (var o = [], r = 0; r < t.length; r += 1)t[r][1].length > 0 && o.push(t[r]); return o } function p(t, e, n) { for (var r = e + n - 1; r >= 0 && r >= e - 1; r--)if (r + 1 < t.length) { var o = t[r], i = t[r + 1]; o[0] === i[1] && t.splice(r, 2, [o[0], o[1] + i[1]]) } return t } var d = -1, y = 1, v = 0, b = n; b.INSERT = y, b.DELETE = d, b.EQUAL = v, t.exports = b }, function (t, e) { function n(t) { var e = []; for (var n in t) e.push(n); return e } e = t.exports = "function" == typeof Object.keys ? Object.keys : n, e.shim = n }, function (t, e) { function n(t) { return "[object Arguments]" == Object.prototype.toString.call(t) } function r(t) { return t && "object" == typeof t && "number" == typeof t.length && Object.prototype.hasOwnProperty.call(t, "callee") && !Object.prototype.propertyIsEnumerable.call(t, "callee") || !1 } var o = "[object Arguments]" == function () { return Object.prototype.toString.call(arguments) }(); e = t.exports = o ? n : r, e.supported = n, e.unsupported = r }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { return Object.keys(e).reduce(function (n, r) { return null == t[r] ? n : (e[r] === t[r] ? n[r] = e[r] : Array.isArray(e[r]) ? e[r].indexOf(t[r]) < 0 && (n[r] = e[r].concat([t[r]])) : n[r] = [e[r], t[r]], n) }, {}) } function a(t) { return t.reduce(function (t, e) { if (1 === e.insert) { var n = (0, N.default)(e.attributes); return delete n.image, t.insert({ image: e.attributes.image }, n) } if (null == e.attributes || !0 !== e.attributes.list && !0 !== e.attributes.bullet || (e = (0, N.default)(e), e.attributes.list ? e.attributes.list = "ordered" : (e.attributes.list = "bullet", delete e.attributes.bullet)), "string" == typeof e.insert) { var r = e.insert.replace(/\r\n/g, "\n").replace(/\r/g, "\n"); return t.insert(r, e.attributes) } return t.push(e) }, new h.default) } Object.defineProperty(e, "__esModule", { value: !0 }); var s = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, u = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), c = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), f = n(4), h = r(f), p = n(20), d = r(p), y = n(0), v = r(y), b = n(13), g = r(b), m = n(31), _ = r(m), O = n(3), w = r(O), x = n(14), k = r(x), E = n(21), N = r(E), j = n(12), A = r(j), q = n(2), T = r(q), P = /^[ -~]*$/, S = function () { function t(e) { i(this, t), this.scroll = e, this.delta = this.getDelta() } return c(t, [{ key: "applyDelta", value: function (t) { var e = this, n = !1; this.scroll.update(); var r = this.scroll.length(); return this.scroll.batchStart(), t = a(t), t.reduce(function (t, o) { var i = o.retain || o.delete || o.insert.length || 1, l = o.attributes || {}; if (null != o.insert) { if ("string" == typeof o.insert) { var a = o.insert; a.endsWith("\n") && n && (n = !1, a = a.slice(0, -1)), t >= r && !a.endsWith("\n") && (n = !0), e.scroll.insertAt(t, a); var c = e.scroll.line(t), f = u(c, 2), h = f[0], p = f[1], y = (0, T.default)({}, (0, O.bubbleFormats)(h)); if (h instanceof w.default) { var b = h.descendant(v.default.Leaf, p), g = u(b, 1), m = g[0]; y = (0, T.default)(y, (0, O.bubbleFormats)(m)) } l = d.default.attributes.diff(y, l) || {} } else if ("object" === s(o.insert)) { var _ = Object.keys(o.insert)[0]; if (null == _) return t; e.scroll.insertAt(t, _, o.insert[_]) } r += i } return Object.keys(l).forEach(function (n) { e.scroll.formatAt(t, i, n, l[n]) }), t + i }, 0), t.reduce(function (t, n) { return "number" == typeof n.delete ? (e.scroll.deleteAt(t, n.delete), t) : t + (n.retain || n.insert.length || 1) }, 0), this.scroll.batchEnd(), this.update(t) } }, { key: "deleteText", value: function (t, e) { return this.scroll.deleteAt(t, e), this.update((new h.default).retain(t).delete(e)) } }, { key: "formatLine", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return this.scroll.update(), Object.keys(r).forEach(function (o) { if (null == n.scroll.whitelist || n.scroll.whitelist[o]) { var i = n.scroll.lines(t, Math.max(e, 1)), l = e; i.forEach(function (e) { var i = e.length(); if (e instanceof g.default) { var a = t - e.offset(n.scroll), s = e.newlineIndex(a + l) - a + 1; e.formatAt(a, s, o, r[o]) } else e.format(o, r[o]); l -= i }) } }), this.scroll.optimize(), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "formatText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e, o, r[o]) }), this.update((new h.default).retain(t).retain(e, (0, N.default)(r))) } }, { key: "getContents", value: function (t, e) { return this.delta.slice(t, t + e) } }, { key: "getDelta", value: function () { return this.scroll.lines().reduce(function (t, e) { return t.concat(e.delta()) }, new h.default) } }, { key: "getFormat", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 0, n = [], r = []; 0 === e ? this.scroll.path(t).forEach(function (t) { var e = u(t, 1), o = e[0]; o instanceof w.default ? n.push(o) : o instanceof v.default.Leaf && r.push(o) }) : (n = this.scroll.lines(t, e), r = this.scroll.descendants(v.default.Leaf, t, e)); var o = [n, r].map(function (t) { if (0 === t.length) return {}; for (var e = (0, O.bubbleFormats)(t.shift()); Object.keys(e).length > 0;) { var n = t.shift(); if (null == n) return e; e = l((0, O.bubbleFormats)(n), e) } return e }); return T.default.apply(T.default, o) } }, { key: "getText", value: function (t, e) { return this.getContents(t, e).filter(function (t) { return "string" == typeof t.insert }).map(function (t) { return t.insert }).join("") } }, { key: "insertEmbed", value: function (t, e, n) { return this.scroll.insertAt(t, e, n), this.update((new h.default).retain(t).insert(o({}, e, n))) } }, { key: "insertText", value: function (t, e) { var n = this, r = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}; return e = e.replace(/\r\n/g, "\n").replace(/\r/g, "\n"), this.scroll.insertAt(t, e), Object.keys(r).forEach(function (o) { n.scroll.formatAt(t, e.length, o, r[o]) }), this.update((new h.default).retain(t).insert(e, (0, N.default)(r))) } }, { key: "isBlank", value: function () { if (0 == this.scroll.children.length) return !0; if (this.scroll.children.length > 1) return !1; var t = this.scroll.children.head; return t.statics.blotName === w.default.blotName && (!(t.children.length > 1) && t.children.head instanceof k.default) } }, { key: "removeFormat", value: function (t, e) { var n = this.getText(t, e), r = this.scroll.line(t + e), o = u(r, 2), i = o[0], l = o[1], a = 0, s = new h.default; null != i && (a = i instanceof g.default ? i.newlineIndex(l) - l + 1 : i.length() - l, s = i.delta().slice(l, l + a - 1).insert("\n")); var c = this.getContents(t, e + a), f = c.diff((new h.default).insert(n).concat(s)), p = (new h.default).retain(t).concat(f); return this.applyDelta(p) } }, { key: "update", value: function (t) { var e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : [], n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : void 0, r = this.delta; if (1 === e.length && "characterData" === e[0].type && e[0].target.data.match(P) && v.default.find(e[0].target)) { var o = v.default.find(e[0].target), i = (0, O.bubbleFormats)(o), l = o.offset(this.scroll), a = e[0].oldValue.replace(_.default.CONTENTS, ""), s = (new h.default).insert(a), u = (new h.default).insert(o.value()); t = (new h.default).retain(l).concat(s.diff(u, n)).reduce(function (t, e) { return e.insert ? t.insert(e.insert, i) : t.push(e) }, new h.default), this.delta = r.compose(t) } else this.delta = this.getDelta(), t && (0, A.default)(r.compose(t), this.delta) || (t = r.diff(this.delta, n)); return t } }]), t }(); e.default = S }, function (t, e) { "use strict"; function n() { } function r(t, e, n) { this.fn = t, this.context = e, this.once = n || !1 } function o() { this._events = new n, this._eventsCount = 0 } var i = Object.prototype.hasOwnProperty, l = "~"; Object.create && (n.prototype = Object.create(null), (new n).__proto__ || (l = !1)), o.prototype.eventNames = function () { var t, e, n = []; if (0 === this._eventsCount) return n; for (e in t = this._events) i.call(t, e) && n.push(l ? e.slice(1) : e); return Object.getOwnPropertySymbols ? n.concat(Object.getOwnPropertySymbols(t)) : n }, o.prototype.listeners = function (t, e) { var n = l ? l + t : t, r = this._events[n]; if (e) return !!r; if (!r) return []; if (r.fn) return [r.fn]; for (var o = 0, i = r.length, a = new Array(i); o < i; o++)a[o] = r[o].fn; return a }, o.prototype.emit = function (t, e, n, r, o, i) { var a = l ? l + t : t; if (!this._events[a]) return !1; var s, u, c = this._events[a], f = arguments.length; if (c.fn) { switch (c.once && this.removeListener(t, c.fn, void 0, !0), f) { case 1: return c.fn.call(c.context), !0; case 2: return c.fn.call(c.context, e), !0; case 3: return c.fn.call(c.context, e, n), !0; case 4: return c.fn.call(c.context, e, n, r), !0; case 5: return c.fn.call(c.context, e, n, r, o), !0; case 6: return c.fn.call(c.context, e, n, r, o, i), !0 }for (u = 1, s = new Array(f - 1); u < f; u++)s[u - 1] = arguments[u]; c.fn.apply(c.context, s) } else { var h, p = c.length; for (u = 0; u < p; u++)switch (c[u].once && this.removeListener(t, c[u].fn, void 0, !0), f) { case 1: c[u].fn.call(c[u].context); break; case 2: c[u].fn.call(c[u].context, e); break; case 3: c[u].fn.call(c[u].context, e, n); break; case 4: c[u].fn.call(c[u].context, e, n, r); break; default: if (!s) for (h = 1, s = new Array(f - 1); h < f; h++)s[h - 1] = arguments[h]; c[u].fn.apply(c[u].context, s) } } return !0 }, o.prototype.on = function (t, e, n) { var o = new r(e, n || this), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.once = function (t, e, n) { var o = new r(e, n || this, !0), i = l ? l + t : t; return this._events[i] ? this._events[i].fn ? this._events[i] = [this._events[i], o] : this._events[i].push(o) : (this._events[i] = o, this._eventsCount++), this }, o.prototype.removeListener = function (t, e, r, o) { var i = l ? l + t : t; if (!this._events[i]) return this; if (!e) return 0 == --this._eventsCount ? this._events = new n : delete this._events[i], this; var a = this._events[i]; if (a.fn) a.fn !== e || o && !a.once || r && a.context !== r || (0 == --this._eventsCount ? this._events = new n : delete this._events[i]); else { for (var s = 0, u = [], c = a.length; s < c; s++)(a[s].fn !== e || o && !a[s].once || r && a[s].context !== r) && u.push(a[s]); u.length ? this._events[i] = 1 === u.length ? u[0] : u : 0 == --this._eventsCount ? this._events = new n : delete this._events[i] } return this }, o.prototype.removeAllListeners = function (t) { var e; return t ? (e = l ? l + t : t, this._events[e] && (0 == --this._eventsCount ? this._events = new n : delete this._events[e])) : (this._events = new n, this._eventsCount = 0), this }, o.prototype.off = o.prototype.removeListener, o.prototype.addListener = o.prototype.on, o.prototype.setMaxListeners = function () { return this }, o.prefixed = l, o.EventEmitter = o, void 0 !== t && (t.exports = o) }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { return t instanceof v.default || t instanceof y.BlockEmbed } Object.defineProperty(e, "__esModule", { value: !0 }); var s = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, f = n(0), h = r(f), p = n(9), d = r(p), y = n(3), v = r(y), b = n(14), g = r(b), m = n(13), _ = r(m), O = n(23), w = r(O), x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)); return r.emitter = n.emitter, Array.isArray(n.whitelist) && (r.whitelist = n.whitelist.reduce(function (t, e) { return t[e] = !0, t }, {})), r.domNode.addEventListener("DOMNodeInserted", function () { }), r.optimize(), r.enable(), r } return l(e, t), u(e, [{ key: "batchStart", value: function () { this.batch = !0 } }, { key: "batchEnd", value: function () { this.batch = !1, this.optimize() } }, { key: "deleteAt", value: function (t, n) { var r = this.line(t), o = s(r, 2), i = o[0], l = o[1], a = this.line(t + n), u = s(a, 1), f = u[0]; if (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "deleteAt", this).call(this, t, n), null != f && i !== f && l > 0) { if (i instanceof y.BlockEmbed || f instanceof y.BlockEmbed) return void this.optimize(); if (i instanceof _.default) { var h = i.newlineIndex(i.length(), !0); if (h > -1 && (i = i.split(h + 1)) === f) return void this.optimize() } else if (f instanceof _.default) { var p = f.newlineIndex(0); p > -1 && f.split(p + 1) } var d = f.children.head instanceof g.default ? null : f.children.head; i.moveChildren(f, d), i.remove() } this.optimize() } }, { key: "enable", value: function () { var t = !(arguments.length > 0 && void 0 !== arguments[0]) || arguments[0]; this.domNode.setAttribute("contenteditable", t) } }, { key: "formatAt", value: function (t, n, r, o) { (null == this.whitelist || this.whitelist[r]) && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "formatAt", this).call(this, t, n, r, o), this.optimize()) } }, { key: "insertAt", value: function (t, n, r) { if (null == r || null == this.whitelist || this.whitelist[n]) { if (t >= this.length()) if (null == r || null == h.default.query(n, h.default.Scope.BLOCK)) { var o = h.default.create(this.statics.defaultChild); this.appendChild(o), null == r && n.endsWith("\n") && (n = n.slice(0, -1)), o.insertAt(0, n, r) } else { var i = h.default.create(n, r); this.appendChild(i) } else c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertAt", this).call(this, t, n, r); this.optimize() } } }, { key: "insertBefore", value: function (t, n) { if (t.statics.scope === h.default.Scope.INLINE_BLOT) { var r = h.default.create(this.statics.defaultChild); r.appendChild(t), t = r } c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n) } }, { key: "leaf", value: function (t) { return this.path(t).pop() || [null, -1] } }, { key: "line", value: function (t) { return t === this.length() ? this.line(t - 1) : this.descendant(a, t) } }, { key: "lines", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : 0, e = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : Number.MAX_VALUE; return function t(e, n, r) { var o = [], i = r; return e.children.forEachAt(n, r, function (e, n, r) { a(e) ? o.push(e) : e instanceof h.default.Container && (o = o.concat(t(e, n, i))), i -= r }), o }(this, t, e) } }, { key: "optimize", value: function () { var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [], n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; !0 !== this.batch && (c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t, n), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_OPTIMIZE, t, n)) } }, { key: "path", value: function (t) { return c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "path", this).call(this, t).slice(1) } }, { key: "update", value: function (t) { if (!0 !== this.batch) { var n = d.default.sources.USER; "string" == typeof t && (n = t), Array.isArray(t) || (t = this.observer.takeRecords()), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_BEFORE_UPDATE, n, t), c(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "update", this).call(this, t.concat([])), t.length > 0 && this.emitter.emit(d.default.events.SCROLL_UPDATE, n, t) } } }]), e }(h.default.Scroll); x.blotName = "scroll", x.className = "ql-editor", x.tagName = "DIV", x.defaultChild = "block", x.allowedChildren = [v.default, y.BlockEmbed, w.default], e.default = x }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { return "object" === (void 0 === e ? "undefined" : x(e)) ? Object.keys(e).reduce(function (t, n) { return s(t, n, e[n]) }, t) : t.reduce(function (t, r) { return r.attributes && r.attributes[e] ? t.push(r) : t.insert(r.insert, (0, j.default)({}, o({}, e, n), r.attributes)) }, new q.default) } function u(t) { if (t.nodeType !== Node.ELEMENT_NODE) return {}; return t["__ql-computed-style"] || (t["__ql-computed-style"] = window.getComputedStyle(t)) } function c(t, e) { for (var n = "", r = t.ops.length - 1; r >= 0 && n.length < e.length; --r) { var o = t.ops[r]; if ("string" != typeof o.insert) break; n = o.insert + n } return n.slice(-1 * e.length) === e } function f(t) { return 0 !== t.childNodes.length && ["block", "list-item"].indexOf(u(t).display) > -1 } function h(t, e, n) { return t.nodeType === t.TEXT_NODE ? n.reduce(function (e, n) { return n(t, e) }, new q.default) : t.nodeType === t.ELEMENT_NODE ? [].reduce.call(t.childNodes || [], function (r, o) { var i = h(o, e, n); return o.nodeType === t.ELEMENT_NODE && (i = e.reduce(function (t, e) { return e(o, t) }, i), i = (o[W] || []).reduce(function (t, e) { return e(o, t) }, i)), r.concat(i) }, new q.default) : new q.default } function p(t, e, n) { return s(n, t, !0) } function d(t, e) { var n = P.default.Attributor.Attribute.keys(t), r = P.default.Attributor.Class.keys(t), o = P.default.Attributor.Style.keys(t), i = {}; return n.concat(r).concat(o).forEach(function (e) { var n = P.default.query(e, P.default.Scope.ATTRIBUTE); null != n && (i[n.attrName] = n.value(t), i[n.attrName]) || (n = Y[e], null == n || n.attrName !== e && n.keyName !== e || (i[n.attrName] = n.value(t) || void 0), null == (n = X[e]) || n.attrName !== e && n.keyName !== e || (n = X[e], i[n.attrName] = n.value(t) || void 0)) }), Object.keys(i).length > 0 && (e = s(e, i)), e } function y(t, e) { var n = P.default.query(t); if (null == n) return e; if (n.prototype instanceof P.default.Embed) { var r = {}, o = n.value(t); null != o && (r[n.blotName] = o, e = (new q.default).insert(r, n.formats(t))) } else "function" == typeof n.formats && (e = s(e, n.blotName, n.formats(t))); return e } function v(t, e) { return c(e, "\n") || e.insert("\n"), e } function b() { return new q.default } function g(t, e) { var n = P.default.query(t); if (null == n || "list-item" !== n.blotName || !c(e, "\n")) return e; for (var r = -1, o = t.parentNode; !o.classList.contains("ql-clipboard");)"list" === (P.default.query(o) || {}).blotName && (r += 1), o = o.parentNode; return r <= 0 ? e : e.compose((new q.default).retain(e.length() - 1).retain(1, { indent: r })) } function m(t, e) { return c(e, "\n") || (f(t) || e.length() > 0 && t.nextSibling && f(t.nextSibling)) && e.insert("\n"), e } function _(t, e) { if (f(t) && null != t.nextElementSibling && !c(e, "\n\n")) { var n = t.offsetHeight + parseFloat(u(t).marginTop) + parseFloat(u(t).marginBottom); t.nextElementSibling.offsetTop > t.offsetTop + 1.5 * n && e.insert("\n") } return e } function O(t, e) { var n = {}, r = t.style || {}; return r.fontStyle && "italic" === u(t).fontStyle && (n.italic = !0), r.fontWeight && (u(t).fontWeight.startsWith("bold") || parseInt(u(t).fontWeight) >= 700) && (n.bold = !0), Object.keys(n).length > 0 && (e = s(e, n)), parseFloat(r.textIndent || 0) > 0 && (e = (new q.default).insert("\t").concat(e)), e } function w(t, e) { var n = t.data; if ("O:P" === t.parentNode.tagName) return e.insert(n.trim()); if (0 === n.trim().length && t.parentNode.classList.contains("ql-clipboard")) return e; if (!u(t.parentNode).whiteSpace.startsWith("pre")) { var r = function (t, e) { return e = e.replace(/[^\u00a0]/g, ""), e.length < 1 && t ? " " : e }; n = n.replace(/\r\n/g, " ").replace(/\n/g, " "), n = n.replace(/\s\s+/g, r.bind(r, !0)), (null == t.previousSibling && f(t.parentNode) || null != t.previousSibling && f(t.previousSibling)) && (n = n.replace(/^\s+/, r.bind(r, !1))), (null == t.nextSibling && f(t.parentNode) || null != t.nextSibling && f(t.nextSibling)) && (n = n.replace(/\s+$/, r.bind(r, !1))) } return e.insert(n) } Object.defineProperty(e, "__esModule", { value: !0 }), e.matchText = e.matchSpacing = e.matchNewline = e.matchBlot = e.matchAttributor = e.default = void 0; var x = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (t) { return typeof t } : function (t) { return t && "function" == typeof Symbol && t.constructor === Symbol && t !== Symbol.prototype ? "symbol" : typeof t }, k = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), E = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), N = n(2), j = r(N), A = n(4), q = r(A), T = n(0), P = r(T), S = n(6), C = r(S), L = n(10), M = r(L), R = n(7), I = r(R), B = n(34), D = n(35), U = n(13), F = r(U), H = n(24), K = n(36), z = n(37), V = n(38), Z = (0, M.default)("quill:clipboard"), W = "__ql-matcher", G = [[Node.TEXT_NODE, w], [Node.TEXT_NODE, m], ["br", v], [Node.ELEMENT_NODE, m], [Node.ELEMENT_NODE, y], [Node.ELEMENT_NODE, _], [Node.ELEMENT_NODE, d], [Node.ELEMENT_NODE, O], ["li", g], ["b", p.bind(p, "bold")], ["i", p.bind(p, "italic")], ["style", b]], Y = [B.AlignAttribute, K.DirectionAttribute].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), X = [B.AlignStyle, D.BackgroundStyle, H.ColorStyle, K.DirectionStyle, z.FontStyle, V.SizeStyle].reduce(function (t, e) { return t[e.keyName] = e, t }, {}), $ = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.root.addEventListener("paste", r.onPaste.bind(r)), r.container = r.quill.addContainer("ql-clipboard"), r.container.setAttribute("contenteditable", !0), r.container.setAttribute("tabindex", -1), r.matchers = [], G.concat(r.options.matchers).forEach(function (t) { var e = k(t, 2), o = e[0], i = e[1]; (n.matchVisual || i !== _) && r.addMatcher(o, i) }), r } return a(e, t), E(e, [{ key: "addMatcher", value: function (t, e) { this.matchers.push([t, e]) } }, { key: "convert", value: function (t) { if ("string" == typeof t) return this.container.innerHTML = t.replace(/\>\r?\n +\<"), this.convert(); var e = this.quill.getFormat(this.quill.selection.savedRange.index); if (e[F.default.blotName]) { var n = this.container.innerText; return this.container.innerHTML = "", (new q.default).insert(n, o({}, F.default.blotName, e[F.default.blotName])) } var r = this.prepareMatching(), i = k(r, 2), l = i[0], a = i[1], s = h(this.container, l, a); return c(s, "\n") && null == s.ops[s.ops.length - 1].attributes && (s = s.compose((new q.default).retain(s.length() - 1).delete(1))), Z.log("convert", this.container.innerHTML, s), this.container.innerHTML = "", s } }, { key: "dangerouslyPasteHTML", value: function (t, e) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : C.default.sources.API; if ("string" == typeof t) this.quill.setContents(this.convert(t), e), this.quill.setSelection(0, C.default.sources.SILENT); else { var r = this.convert(e); this.quill.updateContents((new q.default).retain(t).concat(r), n), this.quill.setSelection(t + r.length(), C.default.sources.SILENT) } } }, { key: "onPaste", value: function (t) { var e = this; if (!t.defaultPrevented && this.quill.isEnabled()) { var n = this.quill.getSelection(), r = (new q.default).retain(n.index), o = this.quill.scrollingContainer.scrollTop; this.container.focus(), this.quill.selection.update(C.default.sources.SILENT), setTimeout(function () { r = r.concat(e.convert()).delete(n.length), e.quill.updateContents(r, C.default.sources.USER), e.quill.setSelection(r.length() - n.length, C.default.sources.SILENT), e.quill.scrollingContainer.scrollTop = o, e.quill.focus() }, 1) } } }, { key: "prepareMatching", value: function () { var t = this, e = [], n = []; return this.matchers.forEach(function (r) { var o = k(r, 2), i = o[0], l = o[1]; switch (i) { case Node.TEXT_NODE: n.push(l); break; case Node.ELEMENT_NODE: e.push(l); break; default: [].forEach.call(t.container.querySelectorAll(i), function (t) { t[W] = t[W] || [], t[W].push(l) }) } }), [e, n] } }]), e }(I.default); $.DEFAULTS = { matchers: [], matchVisual: !0 }, e.default = $, e.matchAttributor = d, e.matchBlot = y, e.matchNewline = m, e.matchSpacing = _, e.matchText = w }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function a(t) { var e = t.ops[t.ops.length - 1]; return null != e && (null != e.insert ? "string" == typeof e.insert && e.insert.endsWith("\n") : null != e.attributes && Object.keys(e.attributes).some(function (t) { return null != f.default.query(t, f.default.Scope.BLOCK) })) } function s(t) { var e = t.reduce(function (t, e) { return t += e.delete || 0 }, 0), n = t.length() - e; return a(t) && (n -= 1), n } Object.defineProperty(e, "__esModule", { value: !0 }), e.getLastChangeIndex = e.default = void 0; var u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(0), f = r(c), h = n(6), p = r(h), d = n(7), y = r(d), v = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.lastRecorded = 0, r.ignoreChange = !1, r.clear(), r.quill.on(p.default.events.EDITOR_CHANGE, function (t, e, n, o) { t !== p.default.events.TEXT_CHANGE || r.ignoreChange || (r.options.userOnly && o !== p.default.sources.USER ? r.transform(e) : r.record(e, n)) }), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0 }, r.undo.bind(r)), r.quill.keyboard.addBinding({ key: "Z", shortKey: !0, shiftKey: !0 }, r.redo.bind(r)), /Win/i.test(navigator.platform) && r.quill.keyboard.addBinding({ key: "Y", shortKey: !0 }, r.redo.bind(r)), r } return l(e, t), u(e, [{ key: "change", value: function (t, e) { if (0 !== this.stack[t].length) { var n = this.stack[t].pop(); this.stack[e].push(n), this.lastRecorded = 0, this.ignoreChange = !0, this.quill.updateContents(n[t], p.default.sources.USER), this.ignoreChange = !1; var r = s(n[t]); this.quill.setSelection(r) } } }, { key: "clear", value: function () { this.stack = { undo: [], redo: [] } } }, { key: "cutoff", value: function () { this.lastRecorded = 0 } }, { key: "record", value: function (t, e) { if (0 !== t.ops.length) { this.stack.redo = []; var n = this.quill.getContents().diff(e), r = Date.now(); if (this.lastRecorded + this.options.delay > r && this.stack.undo.length > 0) { var o = this.stack.undo.pop(); n = n.compose(o.undo), t = o.redo.compose(t) } else this.lastRecorded = r; this.stack.undo.push({ redo: t, undo: n }), this.stack.undo.length > this.options.maxStack && this.stack.undo.shift() } } }, { key: "redo", value: function () { this.change("redo", "undo") } }, { key: "transform", value: function (t) { this.stack.undo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }), this.stack.redo.forEach(function (e) { e.undo = t.transform(e.undo, !0), e.redo = t.transform(e.redo, !0) }) } }, { key: "undo", value: function () { this.change("undo", "redo") } }]), e }(y.default); v.DEFAULTS = { delay: 1e3, maxStack: 100, userOnly: !1 }, e.default = v, e.getLastChangeIndex = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.IndentClass = void 0; var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "add", value: function (t, n) { if ("+1" === n || "-1" === n) { var r = this.value(t) || 0; n = "+1" === n ? r + 1 : r - 1 } return 0 === n ? (this.remove(t), !0) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "add", this).call(this, t, n) } }, { key: "canAdd", value: function (t, n) { return a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, n) || a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "canAdd", this).call(this, t, parseInt(n)) } }, { key: "value", value: function (t) { return parseInt(a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "value", this).call(this, t)) || void 0 } }]), e }(u.default.Attributor.Class), f = new c("indent", "ql-indent", { scope: u.default.Scope.BLOCK, whitelist: [1, 2, 3, 4, 5, 6, 7, 8] }); e.IndentClass = f }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(3), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "blockquote", s.tagName = "blockquote", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = n(3), s = function (t) { return t && t.__esModule ? t : { default: t } }(a), u = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "formats", value: function (t) { return this.tagName.indexOf(t.tagName) + 1 } }]), e }(s.default); u.blotName = "header", u.tagName = ["H1", "H2", "H3", "H4", "H5", "H6"], e.default = u }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.ListItem = void 0; var s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, c = n(0), f = r(c), h = n(3), p = r(h), d = n(23), y = r(d), v = function (t) { function e() { return i(this, e), l(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return a(e, t), s(e, [{ key: "format", value: function (t, n) { t !== b.blotName || n ? u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) : this.replaceWith(f.default.create(this.statics.scope)) } }, { key: "remove", value: function () { null == this.prev && null == this.next ? this.parent.remove() : u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "remove", this).call(this) } }, { key: "replaceWith", value: function (t, n) { return this.parent.isolate(this.offset(this.parent), this.length()), t === this.parent.statics.blotName ? (this.parent.replaceWith(t, n), this) : (this.parent.unwrap(), u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t, n)) } }], [{ key: "formats", value: function (t) { return t.tagName === this.tagName ? void 0 : u(e.__proto__ || Object.getPrototypeOf(e), "formats", this).call(this, t) } }]), e }(p.default); v.blotName = "list-item", v.tagName = "LI"; var b = function (t) { function e(t) { i(this, e); var n = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t)), r = function (e) { if (e.target.parentNode === t) { var r = n.statics.formats(t), o = f.default.find(e.target); "checked" === r ? o.format("list", "unchecked") : "unchecked" === r && o.format("list", "checked") } }; return t.addEventListener("touchstart", r), t.addEventListener("mousedown", r), n } return a(e, t), s(e, null, [{ key: "create", value: function (t) { var n = "ordered" === t ? "OL" : "UL", r = u(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, n); return "checked" !== t && "unchecked" !== t || r.setAttribute("data-checked", "checked" === t), r } }, { key: "formats", value: function (t) { return "OL" === t.tagName ? "ordered" : "UL" === t.tagName ? t.hasAttribute("data-checked") ? "true" === t.getAttribute("data-checked") ? "checked" : "unchecked" : "bullet" : void 0 } }]), s(e, [{ key: "format", value: function (t, e) { this.children.length > 0 && this.children.tail.format(t, e) } }, { key: "formats", value: function () { return o({}, this.statics.blotName, this.statics.formats(this.domNode)) } }, { key: "insertBefore", value: function (t, n) { if (t instanceof v) u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "insertBefore", this).call(this, t, n); else { var r = null == n ? this.length() : n.offset(this), o = this.split(r); o.parent.insertBefore(t, o) } } }, { key: "optimize", value: function (t) { u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "optimize", this).call(this, t); var n = this.next; null != n && n.prev === this && n.statics.blotName === this.statics.blotName && n.domNode.tagName === this.domNode.tagName && n.domNode.getAttribute("data-checked") === this.domNode.getAttribute("data-checked") && (n.moveChildren(this), n.remove()) } }, { key: "replace", value: function (t) { if (t.statics.blotName !== this.statics.blotName) { var n = f.default.create(this.statics.defaultChild); t.moveChildren(n), this.appendChild(n) } u(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replace", this).call(this, t) } }]), e }(y.default); b.blotName = "list", b.scope = f.default.Scope.BLOCK_BLOT, b.tagName = ["OL", "UL"], b.defaultChild = "list-item", b.allowedChildren = [v], e.ListItem = v, e.default = b }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(39), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "italic", s.tagName = ["EM", "I"], e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(5), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, null, [{ key: "create", value: function (t) { return "super" === t ? document.createElement("sup") : "sub" === t ? document.createElement("sub") : a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t) } }, { key: "formats", value: function (t) { return "SUB" === t.tagName ? "sub" : "SUP" === t.tagName ? "super" : void 0 } }]), e }(u.default); c.blotName = "script", c.tagName = ["SUB", "SUP"], e.default = c }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "strike", s.tagName = "S", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = n(5), a = function (t) { return t && t.__esModule ? t : { default: t } }(l), s = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), e }(a.default); s.blotName = "underline", s.tagName = "U", e.default = s }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(0), u = function (t) { return t && t.__esModule ? t : { default: t } }(s), c = n(15), f = ["alt", "height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "match", value: function (t) { return /\.(jpe?g|gif|png)$/.test(t) || /^data:image\/.+;base64/.test(t) } }, { key: "sanitize", value: function (t) { return (0, c.sanitize)(t, ["http", "https", "data"]) ? t : "//:0" } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(u.default.Embed); h.blotName = "image", h.tagName = "IMG", e.default = h }, function (t, e, n) { "use strict"; function r(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function o(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function i(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var l = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = n(3), u = n(15), c = function (t) { return t && t.__esModule ? t : { default: t } }(u), f = ["height", "width"], h = function (t) { function e() { return r(this, e), o(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return i(e, t), l(e, [{ key: "format", value: function (t, n) { f.indexOf(t) > -1 ? n ? this.domNode.setAttribute(t, n) : this.domNode.removeAttribute(t) : a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "format", this).call(this, t, n) } }], [{ key: "create", value: function (t) { var n = a(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return n.setAttribute("frameborder", "0"), n.setAttribute("allowfullscreen", !0), n.setAttribute("src", this.sanitize(t)), n } }, { key: "formats", value: function (t) { return f.reduce(function (e, n) { return t.hasAttribute(n) && (e[n] = t.getAttribute(n)), e }, {}) } }, { key: "sanitize", value: function (t) { return c.default.sanitize(t) } }, { key: "value", value: function (t) { return t.getAttribute("src") } }]), e }(s.BlockEmbed); h.blotName = "video", h.className = "ql-video", h.tagName = "IFRAME", e.default = h }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.FormulaBlot = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(33), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, null, [{ key: "create", value: function (t) { var n = s(e.__proto__ || Object.getPrototypeOf(e), "create", this).call(this, t); return "string" == typeof t && (window.katex.render(t, n, { throwOnError: !1, errorColor: "#f00" }), n.setAttribute("data-value", t)), n } }, { key: "value", value: function (t) { return t.getAttribute("data-value") } }]), e }(c.default); y.blotName = "formula", y.className = "ql-formula", y.tagName = "SPAN"; var v = function (t) { function e() { o(this, e); var t = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this)); if (null == window.katex) throw new Error("Formula module requires KaTeX."); return t } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(y, !0) } }]), e }(d.default); e.FormulaBlot = y, e.default = v }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.CodeToken = e.CodeBlock = void 0; var a = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = n(0), c = r(u), f = n(6), h = r(f), p = n(7), d = r(p), y = n(13), v = r(y), b = function (t) { function e() { return o(this, e), i(this, (e.__proto__ || Object.getPrototypeOf(e)).apply(this, arguments)) } return l(e, t), a(e, [{ key: "replaceWith", value: function (t) { this.domNode.textContent = this.domNode.textContent, this.attach(), s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "replaceWith", this).call(this, t) } }, { key: "highlight", value: function (t) { var e = this.domNode.textContent; this.cachedText !== e && ((e.trim().length > 0 || null == this.cachedText) && (this.domNode.innerHTML = t(e), this.domNode.normalize(), this.attach()), this.cachedText = e) } }]), e }(v.default); b.className = "ql-syntax"; var g = new c.default.Attributor.Class("token", "hljs", { scope: c.default.Scope.INLINE }), m = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if ("function" != typeof r.options.highlight) throw new Error("Syntax module requires highlight.js. Please include the library on the page before Quill."); var l = null; return r.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { clearTimeout(l), l = setTimeout(function () { r.highlight(), l = null }, r.options.interval) }), r.highlight(), r } return l(e, t), a(e, null, [{ key: "register", value: function () { h.default.register(g, !0), h.default.register(b, !0) } }]), a(e, [{ key: "highlight", value: function () { var t = this; if (!this.quill.selection.composing) { this.quill.update(h.default.sources.USER); var e = this.quill.getSelection(); this.quill.scroll.descendants(b).forEach(function (e) { e.highlight(t.options.highlight) }), this.quill.update(h.default.sources.SILENT), null != e && this.quill.setSelection(e, h.default.sources.SILENT) } } }]), e }(d.default); m.DEFAULTS = { highlight: function () { return null == window.hljs ? null : function (t) { return window.hljs.highlightAuto(t).value } }(), interval: 1e3 }, e.CodeBlock = b, e.CodeToken = g, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e, n) { return e in t ? Object.defineProperty(t, e, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : t[e] = n, t } function i(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function l(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function a(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } function s(t, e, n) { var r = document.createElement("button"); r.setAttribute("type", "button"), r.classList.add("ql-" + e), null != n && (r.value = n), t.appendChild(r) } function u(t, e) { Array.isArray(e[0]) || (e = [e]), e.forEach(function (e) { var n = document.createElement("span"); n.classList.add("ql-formats"), e.forEach(function (t) { if ("string" == typeof t) s(n, t); else { var e = Object.keys(t)[0], r = t[e]; Array.isArray(r) ? c(n, e, r) : s(n, e, r) } }), t.appendChild(n) }) } function c(t, e, n) { var r = document.createElement("select"); r.classList.add("ql-" + e), n.forEach(function (t) { var e = document.createElement("option"); !1 !== t ? e.setAttribute("value", t) : e.setAttribute("selected", "selected"), r.appendChild(e) }), t.appendChild(r) } Object.defineProperty(e, "__esModule", { value: !0 }), e.addControls = e.default = void 0; var f = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), h = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), p = n(4), d = r(p), y = n(0), v = r(y), b = n(6), g = r(b), m = n(10), _ = r(m), O = n(7), w = r(O), x = (0, _.default)("quill:toolbar"), k = function (t) { function e(t, n) { i(this, e); var r = l(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); if (Array.isArray(r.options.container)) { var o = document.createElement("div"); u(o, r.options.container), t.container.parentNode.insertBefore(o, t.container), r.container = o } else "string" == typeof r.options.container ? r.container = document.querySelector(r.options.container) : r.container = r.options.container; if (!(r.container instanceof HTMLElement)) { var a; return a = x.error("Container required for toolbar", r.options), l(r, a) } return r.container.classList.add("ql-toolbar"), r.controls = [], r.handlers = {}, Object.keys(r.options.handlers).forEach(function (t) { r.addHandler(t, r.options.handlers[t]) }), [].forEach.call(r.container.querySelectorAll("button, select"), function (t) { r.attach(t) }), r.quill.on(g.default.events.EDITOR_CHANGE, function (t, e) { t === g.default.events.SELECTION_CHANGE && r.update(e) }), r.quill.on(g.default.events.SCROLL_OPTIMIZE, function () { var t = r.quill.selection.getRange(), e = f(t, 1), n = e[0]; r.update(n) }), r } return a(e, t), h(e, [{ key: "addHandler", value: function (t, e) { this.handlers[t] = e } }, { key: "attach", value: function (t) { var e = this, n = [].find.call(t.classList, function (t) { return 0 === t.indexOf("ql-") }); if (n) { if (n = n.slice("ql-".length), "BUTTON" === t.tagName && t.setAttribute("type", "button"), null == this.handlers[n]) { if (null != this.quill.scroll.whitelist && null == this.quill.scroll.whitelist[n]) return void x.warn("ignoring attaching to disabled format", n, t); if (null == v.default.query(n)) return void x.warn("ignoring attaching to nonexistent format", n, t) } var r = "SELECT" === t.tagName ? "change" : "click"; t.addEventListener(r, function (r) { var i = void 0; if ("SELECT" === t.tagName) { if (t.selectedIndex < 0) return; var l = t.options[t.selectedIndex]; i = !l.hasAttribute("selected") && (l.value || !1) } else i = !t.classList.contains("ql-active") && (t.value || !t.hasAttribute("value")), r.preventDefault(); e.quill.focus(); var a = e.quill.selection.getRange(), s = f(a, 1), u = s[0]; if (null != e.handlers[n]) e.handlers[n].call(e, i); else if (v.default.query(n).prototype instanceof v.default.Embed) { if (!(i = prompt("Enter " + n))) return; e.quill.updateContents((new d.default).retain(u.index).delete(u.length).insert(o({}, n, i)), g.default.sources.USER) } else e.quill.format(n, i, g.default.sources.USER); e.update(u) }), this.controls.push([n, t]) } } }, { key: "update", value: function (t) { var e = null == t ? {} : this.quill.getFormat(t); this.controls.forEach(function (n) { var r = f(n, 2), o = r[0], i = r[1]; if ("SELECT" === i.tagName) { var l = void 0; if (null == t) l = null; else if (null == e[o]) l = i.querySelector("option[selected]"); else if (!Array.isArray(e[o])) { var a = e[o]; "string" == typeof a && (a = a.replace(/\"/g, '\\"')), l = i.querySelector('option[value="' + a + '"]') } null == l ? (i.value = "", i.selectedIndex = -1) : l.selected = !0 } else if (null == t) i.classList.remove("ql-active"); else if (i.hasAttribute("value")) { var s = e[o] === i.getAttribute("value") || null != e[o] && e[o].toString() === i.getAttribute("value") || null == e[o] && !i.getAttribute("value"); i.classList.toggle("ql-active", s) } else i.classList.toggle("ql-active", null != e[o]) }) } }]), e }(w.default); k.DEFAULTS = {}, k.DEFAULTS = { container: null, handlers: { clean: function () { var t = this, e = this.quill.getSelection(); if (null != e) if (0 == e.length) { var n = this.quill.getFormat(); Object.keys(n).forEach(function (e) { null != v.default.query(e, v.default.Scope.INLINE) && t.quill.format(e, !1) }) } else this.quill.removeFormat(e, g.default.sources.USER) }, direction: function (t) { var e = this.quill.getFormat().align; "rtl" === t && null == e ? this.quill.format("align", "right", g.default.sources.USER) : t || "right" !== e || this.quill.format("align", !1, g.default.sources.USER), this.quill.format("direction", t, g.default.sources.USER) }, indent: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e), r = parseInt(n.indent || 0); if ("+1" === t || "-1" === t) { var o = "+1" === t ? 1 : -1; "rtl" === n.direction && (o *= -1), this.quill.format("indent", r + o, g.default.sources.USER) } }, link: function (t) { !0 === t && (t = prompt("Enter link URL:")), this.quill.format("link", t, g.default.sources.USER) }, list: function (t) { var e = this.quill.getSelection(), n = this.quill.getFormat(e); "check" === t ? "checked" === n.list || "unchecked" === n.list ? this.quill.format("list", !1, g.default.sources.USER) : this.quill.format("list", "unchecked", g.default.sources.USER) : this.quill.format("list", t, g.default.sources.USER) } } }, e.default = k, e.addControls = u }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e) { t.exports = ' ' }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }), e.default = e.BubbleTooltip = void 0; var a = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, s = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), u = n(2), c = r(u), f = n(9), h = r(f), p = n(44), d = r(p), y = n(22), v = n(26), b = r(v), g = [["bold", "italic", "link"], [{ header: 1 }, { header: 2 }, "blockquote"]], m = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = g); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-bubble"), r } return l(e, t), s(e, [{ key: "extendToolbar", value: function (t) { this.tooltip = new _(this.quill, this.options.bounds), this.tooltip.root.appendChild(t.container), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), b.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), b.default) } }]), e }(d.default); m.DEFAULTS = (0, c.default)(!0, {}, d.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { t ? this.quill.theme.tooltip.edit() : this.quill.format("link", !1) } } } } }); var _ = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.on(h.default.events.EDITOR_CHANGE, function (t, e, n, o) { if (t === h.default.events.SELECTION_CHANGE) if (null != e && e.length > 0 && o === h.default.sources.USER) { r.show(), r.root.style.left = "0px", r.root.style.width = "", r.root.style.width = r.root.offsetWidth + "px"; var i = r.quill.getLines(e.index, e.length); if (1 === i.length) r.position(r.quill.getBounds(e)); else { var l = i[i.length - 1], a = r.quill.getIndex(l), s = Math.min(l.length() - 1, e.index + e.length - a), u = r.quill.getBounds(new y.Range(a, s)); r.position(u) } } else document.activeElement !== r.textbox && r.quill.hasFocus() && r.hide() }), r } return l(e, t), s(e, [{ key: "listen", value: function () { var t = this; a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector(".ql-close").addEventListener("click", function () { t.root.classList.remove("ql-editing") }), this.quill.on(h.default.events.SCROLL_OPTIMIZE, function () { setTimeout(function () { if (!t.root.classList.contains("ql-hidden")) { var e = t.quill.getSelection(); null != e && t.position(t.quill.getBounds(e)) } }, 1) }) } }, { key: "cancel", value: function () { this.show() } }, { key: "position", value: function (t) { var n = a(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "position", this).call(this, t), r = this.root.querySelector(".ql-tooltip-arrow"); if (r.style.marginLeft = "", 0 === n) return n; r.style.marginLeft = -1 * n - r.offsetWidth / 2 + "px" } }]), e }(p.BaseTooltip); _.TEMPLATE = ['', '
', '', '', "
"].join(""), e.BubbleTooltip = _, e.default = m }, function (t, e, n) { "use strict"; function r(t) { return t && t.__esModule ? t : { default: t } } function o(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function i(t, e) { if (!t) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return !e || "object" != typeof e && "function" != typeof e ? t : e } function l(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function, not " + typeof e); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, enumerable: !1, writable: !0, configurable: !0 } }), e && (Object.setPrototypeOf ? Object.setPrototypeOf(t, e) : t.__proto__ = e) } Object.defineProperty(e, "__esModule", { value: !0 }); var a = function () { function t(t, e) { var n = [], r = !0, o = !1, i = void 0; try { for (var l, a = t[Symbol.iterator](); !(r = (l = a.next()).done) && (n.push(l.value), !e || n.length !== e); r = !0); } catch (t) { o = !0, i = t } finally { try { !r && a.return && a.return() } finally { if (o) throw i } } return n } return function (e, n) { if (Array.isArray(e)) return e; if (Symbol.iterator in Object(e)) return t(e, n); throw new TypeError("Invalid attempt to destructure non-iterable instance") } }(), s = function t(e, n, r) { null === e && (e = Function.prototype); var o = Object.getOwnPropertyDescriptor(e, n); if (void 0 === o) { var i = Object.getPrototypeOf(e); return null === i ? void 0 : t(i, n, r) } if ("value" in o) return o.value; var l = o.get; if (void 0 !== l) return l.call(r) }, u = function () { function t(t, e) { for (var n = 0; n < e.length; n++) { var r = e[n]; r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(t, r.key, r) } } return function (e, n, r) { return n && t(e.prototype, n), r && t(e, r), e } }(), c = n(2), f = r(c), h = n(9), p = r(h), d = n(44), y = r(d), v = n(15), b = r(v), g = n(22), m = n(26), _ = r(m), O = [[{ header: ["1", "2", "3", !1] }], ["bold", "italic", "underline", "link"], [{ list: "ordered" }, { list: "bullet" }], ["clean"]], w = function (t) { function e(t, n) { o(this, e), null != n.modules.toolbar && null == n.modules.toolbar.container && (n.modules.toolbar.container = O); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.quill.container.classList.add("ql-snow"), r } return l(e, t), u(e, [{ key: "extendToolbar", value: function (t) { t.container.classList.add("ql-snow"), this.buildButtons([].slice.call(t.container.querySelectorAll("button")), _.default), this.buildPickers([].slice.call(t.container.querySelectorAll("select")), _.default), this.tooltip = new x(this.quill, this.options.bounds), t.container.querySelector(".ql-link") && this.quill.keyboard.addBinding({ key: "K", shortKey: !0 }, function (e, n) { t.handlers.link.call(t, !n.format.link) }) } }]), e }(y.default); w.DEFAULTS = (0, f.default)(!0, {}, y.default.DEFAULTS, { modules: { toolbar: { handlers: { link: function (t) { if (t) { var e = this.quill.getSelection(); if (null == e || 0 == e.length) return; var n = this.quill.getText(e); /^\S+@\S+\.\S+$/.test(n) && 0 !== n.indexOf("mailto:") && (n = "mailto:" + n); this.quill.theme.tooltip.edit("link", n) } else this.quill.format("link", !1) } } } } }); var x = function (t) { function e(t, n) { o(this, e); var r = i(this, (e.__proto__ || Object.getPrototypeOf(e)).call(this, t, n)); return r.preview = r.root.querySelector("a.ql-preview"), r } return l(e, t), u(e, [{ key: "listen", value: function () { var t = this; s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "listen", this).call(this), this.root.querySelector("a.ql-action").addEventListener("click", function (e) { t.root.classList.contains("ql-editing") ? t.save() : t.edit("link", t.preview.textContent), e.preventDefault() }), this.root.querySelector("a.ql-remove").addEventListener("click", function (e) { if (null != t.linkRange) { var n = t.linkRange; t.restoreFocus(), t.quill.formatText(n, "link", !1, p.default.sources.USER), delete t.linkRange } e.preventDefault(), t.hide() }), this.quill.on(p.default.events.SELECTION_CHANGE, function (e, n, r) { if (null != e) { if (0 === e.length && r === p.default.sources.USER) { var o = t.quill.scroll.descendant(b.default, e.index), i = a(o, 2), l = i[0], s = i[1]; if (null != l) { t.linkRange = new g.Range(e.index - s, l.length()); var u = b.default.formats(l.domNode); return t.preview.textContent = u, t.preview.setAttribute("href", u), t.show(), void t.position(t.quill.getBounds(t.linkRange)) } } else delete t.linkRange; t.hide() } }) } }, { key: "show", value: function () { s(e.prototype.__proto__ || Object.getPrototypeOf(e.prototype), "show", this).call(this), this.root.removeAttribute("data-mode") } }]), e }(d.BaseTooltip); x.TEMPLATE = ['', '', '', ''].join(""), e.default = w }]).default }); +//# sourceMappingURL=quill.min.js.map \ No newline at end of file From a216e2b92e7986284b56bb0a2e0fba43825dc93c Mon Sep 17 00:00:00 2001 From: Shaun Walker Date: Thu, 2 Dec 2021 16:33:16 -0500 Subject: [PATCH 18/33] Additional properties added to Route model to improve abstraction, modified Site Settings to support settings moved to the server. --- Oqtane.Client/Modules/Admin/Site/Index.razor | 438 ++++++++++--------- Oqtane.Server/Pages/_Host.cshtml.cs | 6 +- Oqtane.Shared/Models/Route.cs | 30 +- 3 files changed, 253 insertions(+), 221 deletions(-) diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index f6263f33..b5db984a 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -240,243 +240,249 @@ } @code { - private ElementReference form; - private bool validated = false; - private bool _initialized = false; - private List _themeList; - private List _themes = new List(); - private List _containers = new List(); - private string _name = string.Empty; - private List _aliasList; - private string _urls = string.Empty; - private string _runtime = ""; - private string _prerender = ""; - private int _logofileid = -1; - private FileManager _logofilemanager; - private int _faviconfileid = -1; - private FileManager _faviconfilemanager; - private string _themetype = "-"; - private string _containertype = "-"; - private string _admincontainertype = "-"; - private string _allowregistration; - private string _smtphost = string.Empty; - private string _smtpport = string.Empty; - private string _smtpssl = "False"; - private string _smtpusername = string.Empty; - private string _smtppassword = string.Empty; - private string _smtpsender = string.Empty; - private string _pwaisenabled; - private int _pwaappiconfileid = -1; - private FileManager _pwaappiconfilemanager; - private int _pwasplashiconfileid = -1; - private FileManager _pwasplashiconfilemanager; - private string _tenant = string.Empty; - private string _database = string.Empty; - private string _connectionstring = string.Empty; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; - private string _deletedby; - private DateTime? _deletedon; - private string _isdeleted; + private ElementReference form; + private bool validated = false; + private bool _initialized = false; + private List _themeList; + private List _themes = new List(); + private List _containers = new List(); + private string _name = string.Empty; + private List _aliasList; + private string _urls = string.Empty; + private string _runtime = ""; + private string _prerender = ""; + private int _logofileid = -1; + private FileManager _logofilemanager; + private int _faviconfileid = -1; + private FileManager _faviconfilemanager; + private string _themetype = "-"; + private string _containertype = "-"; + private string _admincontainertype = "-"; + private string _allowregistration; + private string _smtphost = string.Empty; + private string _smtpport = string.Empty; + private string _smtpssl = "False"; + private string _smtpusername = string.Empty; + private string _smtppassword = string.Empty; + private string _smtpsender = string.Empty; + private string _pwaisenabled; + private int _pwaappiconfileid = -1; + private FileManager _pwaappiconfilemanager; + private int _pwasplashiconfileid = -1; + private FileManager _pwasplashiconfilemanager; + private string _tenant = string.Empty; + private string _database = string.Empty; + private string _connectionstring = string.Empty; + private string _createdby; + private DateTime _createdon; + private string _modifiedby; + private DateTime _modifiedon; + private string _deletedby; + private DateTime? _deletedon; + private string _isdeleted; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnInitializedAsync() - { - try - { - _themeList = await ThemeService.GetThemesAsync(); - Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); - if (site != null) - { - _name = site.Name; - _runtime = site.Runtime; - _prerender = site.RenderMode.Replace(_runtime, ""); - _allowregistration = site.AllowRegistration.ToString(); - _isdeleted = site.IsDeleted.ToString(); + protected override async Task OnInitializedAsync() + { + try + { + _themeList = await ThemeService.GetThemesAsync(); + Site site = await SiteService.GetSiteAsync(PageState.Site.SiteId); + if (site != null) + { + _name = site.Name; + _runtime = site.Runtime; + _prerender = site.RenderMode.Replace(_runtime, ""); + _allowregistration = site.AllowRegistration.ToString(); + _isdeleted = site.IsDeleted.ToString(); - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - _aliasList = await AliasService.GetAliasesAsync(); - foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) - { - _urls += alias.Name + ","; - } - _urls = _urls.Substring(0, _urls.Length - 1); + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + _aliasList = await AliasService.GetAliasesAsync(); + foreach (Alias alias in _aliasList.Where(item => item.SiteId == site.SiteId && item.TenantId == site.TenantId).ToList()) + { + _urls += alias.Name + ","; + } + _urls = _urls.Substring(0, _urls.Length - 1); - } + } - if (site.LogoFileId != null) - { - _logofileid = site.LogoFileId.Value; - } + if (site.LogoFileId != null) + { + _logofileid = site.LogoFileId.Value; + } - if (site.FaviconFileId != null) - { - _faviconfileid = site.FaviconFileId.Value; - } + if (site.FaviconFileId != null) + { + _faviconfileid = site.FaviconFileId.Value; + } - _themes = ThemeService.GetThemeControls(_themeList); - _themetype = (!string.IsNullOrEmpty(site.DefaultThemeType)) ? site.DefaultThemeType : Constants.DefaultTheme; - _containers = ThemeService.GetContainerControls(_themeList, _themetype); - _containertype = (!string.IsNullOrEmpty(site.DefaultContainerType)) ? site.DefaultContainerType : Constants.DefaultContainer; - _admincontainertype = (!string.IsNullOrEmpty(site.AdminContainerType)) ? site.AdminContainerType : Constants.DefaultAdminContainer; + _themes = ThemeService.GetThemeControls(_themeList); + _themetype = (!string.IsNullOrEmpty(site.DefaultThemeType)) ? site.DefaultThemeType : Constants.DefaultTheme; + _containers = ThemeService.GetContainerControls(_themeList, _themetype); + _containertype = (!string.IsNullOrEmpty(site.DefaultContainerType)) ? site.DefaultContainerType : Constants.DefaultContainer; + _admincontainertype = (!string.IsNullOrEmpty(site.AdminContainerType)) ? site.AdminContainerType : Constants.DefaultAdminContainer; - var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); - _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); - _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); - _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); - _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); - _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); - _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); + _pwaisenabled = site.PwaIsEnabled.ToString(); + if (site.PwaAppIconFileId != null) + { + _pwaappiconfileid = site.PwaAppIconFileId.Value; + } + if (site.PwaSplashIconFileId != null) + { + _pwasplashiconfileid = site.PwaSplashIconFileId.Value; + } + + var settings = await SettingService.GetSiteSettingsAsync(site.SiteId); + _smtphost = SettingService.GetSetting(settings, "SMTPHost", string.Empty); + _smtpport = SettingService.GetSetting(settings, "SMTPPort", string.Empty); + _smtpssl = SettingService.GetSetting(settings, "SMTPSSL", "False"); + _smtpusername = SettingService.GetSetting(settings, "SMTPUsername", string.Empty); + _smtppassword = SettingService.GetSetting(settings, "SMTPPassword", string.Empty); + _smtpsender = SettingService.GetSetting(settings, "SMTPSender", string.Empty); - _pwaisenabled = site.PwaIsEnabled.ToString(); + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + var tenants = await TenantService.GetTenantsAsync(); + var _databases = await DatabaseService.GetDatabasesAsync(); + var tenant = tenants.Find(item => item.TenantId == site.TenantId); + if (tenant != null) + { + _tenant = tenant.Name; + _database = _databases.Find(item => item.DBType == tenant.DBType)?.Name; + _connectionstring = tenant.DBConnectionString; + } + } - if (site.PwaAppIconFileId != null) - { - _pwaappiconfileid = site.PwaAppIconFileId.Value; - } + _createdby = site.CreatedBy; + _createdon = site.CreatedOn; + _modifiedby = site.ModifiedBy; + _modifiedon = site.ModifiedOn; + _deletedby = site.DeletedBy; + _deletedon = site.DeletedOn; - if (site.PwaSplashIconFileId != null) - { - _pwasplashiconfileid = site.PwaSplashIconFileId.Value; - } + _initialized = true; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Site {SiteId} {Error}", PageState.Site.SiteId, ex.Message); + AddModuleMessage(ex.Message, MessageType.Error); + } + } - _pwaisenabled = site.PwaIsEnabled.ToString(); - if (site.PwaAppIconFileId != null) - { - _pwaappiconfileid = site.PwaAppIconFileId.Value; - } - if (site.PwaSplashIconFileId != null) - { - _pwasplashiconfileid = site.PwaSplashIconFileId.Value; - } + private async void ThemeChanged(ChangeEventArgs e) + { + try + { + _themetype = (string)e.Value; + if (_themetype != "-") + { + _containers = ThemeService.GetContainerControls(_themeList, _themetype); + } + else + { + _containers = new List(); + } + _containertype = "-"; + _admincontainertype = Constants.DefaultAdminContainer; + StateHasChanged(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message); + AddModuleMessage(Localizer["Error.Theme.LoadPane"], MessageType.Error); + } + } - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - var tenants = await TenantService.GetTenantsAsync(); - var _databases = await DatabaseService.GetDatabasesAsync(); - var tenant = tenants.Find(item => item.TenantId == site.TenantId); - if (tenant != null) - { - _tenant = tenant.Name; - _database = _databases.Find(item => item.DBType == tenant.DBType)?.Name; - _connectionstring = tenant.DBConnectionString; - } - } + private async Task SaveSite() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + try + { + if (_name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-") + { + var unique = true; + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + if (_aliasList.Exists(item => item.Name == name && item.SiteId != PageState.Alias.SiteId && item.TenantId != PageState.Alias.TenantId)) + { + unique = false; + } + } + } - _createdby = site.CreatedBy; - _createdon = site.CreatedOn; - _modifiedby = site.ModifiedBy; - _modifiedon = site.ModifiedOn; - _deletedby = site.DeletedBy; - _deletedon = site.DeletedOn; + if (unique) + { + var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); + if (site != null) + { + bool refresh = false; + bool reload = false; - _initialized = true; - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Site {SiteId} {Error}", PageState.Site.SiteId, ex.Message); - AddModuleMessage(ex.Message, MessageType.Error); - } - } + site.Name = _name; + if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender) + { + site.Runtime = _runtime; + site.RenderMode = _runtime + _prerender; + refresh = true; + reload = true; // needs to be reloaded on server + } + } + site.AllowRegistration = (_allowregistration == null ? true : Boolean.Parse(_allowregistration)); + site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); - private async void ThemeChanged(ChangeEventArgs e) - { - try - { - _themetype = (string)e.Value; - if (_themetype != "-") - { - _containers = ThemeService.GetContainerControls(_themeList, _themetype); - } - else - { - _containers = new List(); - } - _containertype = "-"; - _admincontainertype = Constants.DefaultAdminContainer; - StateHasChanged(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage(Localizer["Error.Theme.LoadPane"], MessageType.Error); - } - } + site.LogoFileId = null; + var logofileid = _logofilemanager.GetFileId(); + if (logofileid != -1) + { + site.LogoFileId = logofileid; + } + int? faviconFieldId = _faviconfilemanager.GetFileId(); + if (faviconFieldId == -1) faviconFieldId = null; + if (site.FaviconFileId != faviconFieldId) + { + site.FaviconFileId = faviconFieldId; + reload = true; // needs to be reloaded on server + } + if (site.DefaultThemeType != _themetype) + { + site.DefaultThemeType = _themetype; + refresh = true; // needs to be refreshed on client + } + if (site.DefaultContainerType != _containertype) + { + site.DefaultContainerType = _containertype; + refresh = true; // needs to be refreshed on client + } + site.AdminContainerType = _admincontainertype; - private async Task SaveSite() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - try - { - if (_name != string.Empty && _urls != string.Empty && _themetype != "-" && _containertype != "-") - { - var unique = true; - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - foreach (string name in _urls.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) - { - if (_aliasList.Exists(item => item.Name == name && item.SiteId != PageState.Alias.SiteId && item.TenantId != PageState.Alias.TenantId)) - { - unique = false; - } - } - } - - if (unique) - { - var site = await SiteService.GetSiteAsync(PageState.Site.SiteId); - if (site != null) - { - bool reload = false; - bool refresh = (site.DefaultThemeType != _themetype || site.DefaultContainerType != _containertype); - - site.Name = _name; - if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) - { - if (site.Runtime != _runtime || site.RenderMode != _runtime + _prerender) - { - site.Runtime = _runtime; - site.RenderMode = _runtime + _prerender; - refresh = true; - reload = true; - } - } - site.AllowRegistration = (_allowregistration == null ? true : Boolean.Parse(_allowregistration)); - site.IsDeleted = (_isdeleted == null ? true : Boolean.Parse(_isdeleted)); - - site.LogoFileId = null; - var logofileid = _logofilemanager.GetFileId(); - if (logofileid != -1) - { - site.LogoFileId = logofileid; - } - var faviconFieldId = _faviconfilemanager.GetFileId(); - if (faviconFieldId != -1) - { - site.FaviconFileId = faviconFieldId; - } - site.DefaultThemeType = _themetype; - site.DefaultContainerType = _containertype; - site.AdminContainerType = _admincontainertype; - - site.PwaIsEnabled = (_pwaisenabled == null ? true : Boolean.Parse(_pwaisenabled)); - var pwaappiconfileid = _pwaappiconfilemanager.GetFileId(); - if (pwaappiconfileid != -1) + if (site.PwaIsEnabled.ToString() != _pwaisenabled) + { + site.PwaIsEnabled = Boolean.Parse(_pwaisenabled); + reload = true; // needs to be reloaded on server + } + int? pwaappiconfileid = _pwaappiconfilemanager.GetFileId(); + if (pwaappiconfileid == -1) pwaappiconfileid = null; + if (site.PwaAppIconFileId != pwaappiconfileid) { site.PwaAppIconFileId = pwaappiconfileid; + reload = true; // needs to be reloaded on server } - var pwasplashiconfileid = _pwasplashiconfilemanager.GetFileId(); - if (pwasplashiconfileid != -1) + int? pwasplashiconfileid = _pwasplashiconfilemanager.GetFileId(); + if (pwasplashiconfileid == -1) pwasplashiconfileid = null; + if (site.PwaSplashIconFileId != pwasplashiconfileid) { site.PwaSplashIconFileId = pwasplashiconfileid; + reload = true; // needs to be reloaded on server } site = await SiteService.UpdateSiteAsync(site); @@ -518,7 +524,7 @@ if (refresh) { - NavigationManager.NavigateTo(NavigateUrl(), reload); // refresh to show new theme or container + NavigationManager.NavigateTo(NavigateUrl(true), reload); // refresh/reload } else { diff --git a/Oqtane.Server/Pages/_Host.cshtml.cs b/Oqtane.Server/Pages/_Host.cshtml.cs index cb878e2e..e03ef2bd 100644 --- a/Oqtane.Server/Pages/_Host.cshtml.cs +++ b/Oqtane.Server/Pages/_Host.cshtml.cs @@ -149,16 +149,16 @@ namespace Oqtane.Pages "var manifest = { " + "\"name\": \"" + site.Name + "\", " + "\"short_name\": \"" + site.Name + "\", " + - "\"start_url\": \"" + route.Scheme + "://" + route.Authority + "/\", " + + "\"start_url\": \"" + route.SiteUrl + "/\", " + "\"display\": \"standalone\", " + "\"background_color\": \"#fff\", " + "\"description\": \"" + site.Name + "\", " + "\"icons\": [{ " + - "\"src\": \"" + route.Scheme + "://" + route.Authority + Utilities.ContentUrl(alias, site.PwaAppIconFileId.Value) + "\", " + + "\"src\": \"" + route.RootUrl + Utilities.ContentUrl(alias, site.PwaAppIconFileId.Value) + "\", " + "\"sizes\": \"192x192\", " + "\"type\": \"image/png\" " + "}, { " + - "\"src\": \"" + route.Scheme + "://" + route.Authority + Utilities.ContentUrl(alias, site.PwaSplashIconFileId.Value) + "\", " + + "\"src\": \"" + route.RootUrl + Utilities.ContentUrl(alias, site.PwaSplashIconFileId.Value) + "\", " + "\"sizes\": \"512x512\", " + "\"type\": \"image/png\" " + "}] " + diff --git a/Oqtane.Shared/Models/Route.cs b/Oqtane.Shared/Models/Route.cs index 6f02538a..a41d4f46 100644 --- a/Oqtane.Shared/Models/Route.cs +++ b/Oqtane.Shared/Models/Route.cs @@ -4,12 +4,16 @@ using Oqtane.Shared; namespace Oqtane.Models { /// - /// A route is comprised of multiple components: + /// A route is comprised of multiple components ( some optional depending on context ) /// {scheme}://{hostname}/{aliaspath}/{pagepath}/*/{moduleid}/{action}/!/{urlparameters}?{query}#{fragment} /// public class Route { - // default constructor accepts an absolute route url and alias + /// + /// default constructor + /// the route parameter can be obtained from NavigationManager.Uri on client or HttpContext.Request.GetEncodedUrl() on server + /// the aliaspath parameter can be obtained from PageState.Alias.Path on client or TenantManager.GetAlias().Path on server + /// public Route(string route, string aliaspath) { Uri uri = new Uri(route); @@ -120,5 +124,27 @@ namespace Oqtane.Models /// A route may contain a fragment located after the # delimiter /// public string Fragment { get; set; } + + /// + /// The root url contains the resource identifier for the root of an Oqtane installation ( including scheme ) + /// + public string RootUrl + { + get + { + return Scheme + "://" + Authority; + } + } + + /// + /// The site url contains the resource identifier for the home page of a specific Oqtane site ( including scheme and possibly an alias path ) + /// + public string SiteUrl + { + get + { + return Scheme + "://" + Authority + ((!string.IsNullOrEmpty(AliasPath)) ? "/" + AliasPath : ""); + } + } } } From 65d468be33cf89921fd4f6e8529cbc78f860abfd Mon Sep 17 00:00:00 2001 From: Leigh Date: Fri, 3 Dec 2021 06:31:45 +0100 Subject: [PATCH 19/33] Fix #1837 RichTextEditor Content not re-Rendering Change to the OnAfterRenderAsync method and changed OnInitialized to OnParametersSet --- .../Modules/Controls/RichTextEditor.razor | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/RichTextEditor.razor b/Oqtane.Client/Modules/Controls/RichTextEditor.razor index b924807c..82afff0c 100644 --- a/Oqtane.Client/Modules/Controls/RichTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/RichTextEditor.razor @@ -120,19 +120,19 @@ new Resource { ResourceType = ResourceType.Script, Bundle = "Quill", Url = "js/quill-interop.js" } }; - protected override void OnInitialized() + protected override void OnParametersSet() { _content = Content; // raw HTML } protected override async Task OnAfterRenderAsync(bool firstRender) { - if (firstRender) + var interop = new RichTextEditorInterop(JSRuntime); + + if (firstRender) { await base.OnAfterRenderAsync(firstRender); - var interop = new RichTextEditorInterop(JSRuntime); - await interop.CreateEditor( _editorElement, _toolBar, @@ -140,14 +140,15 @@ Placeholder, Theme, DebugLevel); - - await interop.LoadEditorContent(_editorElement, Content); - - _content = Content; // raw HTML - - // 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); } + + await interop.LoadEditorContent(_editorElement, Content); + + _content = Content; // raw HTML + + // 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() From 811ddb9b445d369ce80d240c32867c1954b6ad4f Mon Sep 17 00:00:00 2001 From: Leigh Date: Mon, 6 Dec 2021 19:18:07 +0100 Subject: [PATCH 20/33] Update the ToolBar position on the Pager Component Add the option "Both" to display the toolbar at the top and bottom of the pager. Nice if the Pager is displaying large sets of data. --- Oqtane.Client/Modules/Controls/Pager.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Oqtane.Client/Modules/Controls/Pager.razor b/Oqtane.Client/Modules/Controls/Pager.razor index fec95246..40dc54ca 100644 --- a/Oqtane.Client/Modules/Controls/Pager.razor +++ b/Oqtane.Client/Modules/Controls/Pager.razor @@ -4,7 +4,7 @@ @if (ItemList != null) { - @if (Toolbar == "Top" && _pages > 0 && Items.Count() > _maxItems) + @if ((Toolbar == "Top" || Toolbar == "Both") && _pages > 0 && Items.Count() > _maxItems) {