diff --git a/.editorconfig b/.editorconfig index cb0d588..131921a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -349,4 +349,14 @@ csharp_style_prefer_method_group_conversion = true:silent csharp_style_prefer_top_level_statements = true:silent dotnet_style_prefer_collection_expression = true:suggestion -dotnet_style_namespace_match_folder = true:suggestion \ No newline at end of file +dotnet_style_namespace_match_folder = true:suggestion +csharp_style_prefer_primary_constructors = true:suggestion +[*.{cs,vb}] +dotnet_style_coalesce_expression = true:error +dotnet_style_null_propagation = true:error +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:error +dotnet_style_prefer_auto_properties = true:warning +dotnet_style_operator_placement_when_wrapping = beginning_of_line +tab_width = 4 +indent_size = 4 +end_of_line = crlf \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..974c308 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text eol=crlf +*.png binary +*.jpg binary \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index 84f63b8..a80a6f3 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,12 +6,12 @@ true - - - - - - + + + + + + diff --git a/docs/Custom-index-strategy.md b/docs/Custom-index-strategy.md index a49adca..c902d9e 100644 --- a/docs/Custom-index-strategy.md +++ b/docs/Custom-index-strategy.md @@ -42,7 +42,7 @@ public class ExampleSearchIndexingStrategy : DefaultAlgoliaIndexingStrategy { var result = new List(); - string title = ""; + string title = string.Empty; // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields @@ -95,11 +95,12 @@ Some properties of the `IIndexEventItemModel` are added to the JObjects by defau public class AlgoliaSearchResultModel { - public string Url { get; set; } = ""; - public string ContentTypeName { get; set; } = ""; - public string LanguageName { get; set; } = ""; + // This field is defaultly only added to the document if the indexed item is a web page. + public string Url { get; set; } = string.Empty; + public string ContentTypeName { get; set; } = string.Empty; + public string LanguageName { get; set; } = string.Empty; public Guid ItemGuid { get; set; } - public string ObjectID { get; set; } = ""; + public string ObjectID { get; set; } = string.Empty; } ``` diff --git a/docs/Managing-Indexes.md b/docs/Managing-Indexes.md index 3e32f19..0088d0d 100644 --- a/docs/Managing-Indexes.md +++ b/docs/Managing-Indexes.md @@ -12,16 +12,24 @@ Fill out the search index form, populating the fields with your custom values. ![Administration search edit form](/images/xperience-administration-search-index-edit-form.jpg) -- Rebuild Hook - for validating a request rebuild of the search index from an external source (ex: API request) -- Indexed Languages - the index will only include content in the selected languages -- Channel Name - the index will only be triggered by web page item creation or modication in the selected website channel +- Index Name - the name of the displayed index. + +- Included Reusable Content Types - these are the reusable content types that will be processed by your custom indexing strategy. +If no option is selected, no items will be processed. + +- Indexed Languages - the index will only include content in the selected languages. + +- Channel Name - the index will only be triggered by web page item creation or modification in the selected website channel. + - Indexing Strategy - the indexing strategy specified in code during dependency registration of a custom indexing strategies. - - If you want the default strategy to appear here, register it explicitly in `IServiceCollection.AddKenticoAlgolia()` method + - If you want the default strategy to appear here, register it explicitly in `IServiceCollection.AddKenticoAlgolia()` method. + +- Rebuild Hook - for validating a request rebuild of the search index from an external source (ex: API request). Now, configure the web page paths and content types that the search index depends on by clicking the Add New Path button or clicking an existing path in the table at the top of the index configuration form. -![Administration search index list](/images/xperience-administration-search-index-edit-form-paths-edit.jpg) +![Administration search edit paths form](/images/xperience-administration-search-index-edit-form-paths-edit.jpg) - Included Path - can be an exact relative path of a web page item, (ex: `/path/to/my/page`), or a wildcard path (ex: `/parent-path/%`) - To determine a web page path, select the web page in the website channel page tree, then view the "Current URL" in the Content tab of the web page. The path will be the relative path excluding the domain diff --git a/docs/Scraping-web-page-content.md b/docs/Scraping-web-page-content.md index 43fccab..87858d2 100644 --- a/docs/Scraping-web-page-content.md +++ b/docs/Scraping-web-page-content.md @@ -47,7 +47,7 @@ public class WebCrawlerService ex, $"Tree Path: {page.SystemFields.WebPageItemTreePath}"); } - return ""; + return string.Empty; } public async Task CrawlPage(string url) @@ -65,7 +65,7 @@ public class WebCrawlerService ex, $"Url: {url}"); } - return ""; + return string.Empty; } } ``` @@ -126,8 +126,8 @@ public class WebScraperHtmlSanitizer textContent = HTMLHelper.RegexHtmlToTextWhiteSpace.Replace(textContent, " "); textContent = textContent.Trim(); - string title = doc.Head?.QuerySelector("title")?.TextContent ?? ""; - string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? ""; + string title = doc.Head?.QuerySelector("title")?.TextContent ?? string.Empty; + string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? string.Empty; return string.Join( " ", @@ -179,7 +179,7 @@ public override async Task> MapToAlgoliaJObjectsOrNull(IInd { // ... - string content = ""; + string content = string.Empty; if (item is IndexEventWebPageItemModel webpageItem && string.Equals(indexedModel.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnorecase)) diff --git a/examples/DancingGoat/$CDRepository/repository.config b/examples/DancingGoat/$CDRepository/repository.config deleted file mode 100644 index cb364e2..0000000 --- a/examples/DancingGoat/$CDRepository/repository.config +++ /dev/null @@ -1,86 +0,0 @@ - - - - - CreateUpdate - - - - - - - - cms.consent - cms.contenttype - cms.contentlanguage - cms.scheduledtask - cms.settingscategory - cms.settingskey - cms.user - cms.role - cms.channel - cms.websitechannel - cms.websitecaptchasettings - cms.contentitem - cms.pagetemplateconfiguration - - cms.headlesschannel - cms.headlessitem - - media.library - media.file - - om.activitytype - om.recipientlist - om.contactgroup - cms.formclass - cms.formfeaturedfield - - emaillibrary.emailchannel - emaillibrary.emailchannelsender - emaillibrary.emailconfiguration - emaillibrary.emailtemplatecontenttype - emaillibrary.recipientlistsettings - emaillibrary.sendconfiguration - emaillibrary.emailtemplate - - ma.automationprocess - ma.automationstep - ma.automationaction - ma.automationtemplate - cms.objectworkflowtrigger - cms.workflowtransition - - cms.webpageitem - cms.webpageurlpath - cms.webpageformerurlpath - om.trackedwebsite - cms.form - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/examples/DancingGoat/.config/dotnet-tools.json b/examples/DancingGoat/.config/dotnet-tools.json index 8e4b8ea..13e33d4 100644 --- a/examples/DancingGoat/.config/dotnet-tools.json +++ b/examples/DancingGoat/.config/dotnet-tools.json @@ -3,7 +3,7 @@ "isRoot": true, "tools": { "kentico.xperience.dbmanager": { - "version": "28.1.2", + "version": "29.5.0", "commands": [ "kentico-xperience-dbmanager" ] diff --git a/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs b/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs index 1e0251e..92a0588 100644 --- a/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs +++ b/examples/DancingGoat/AdminComponents/Apps/SampleDataGenerator/SampleDataGeneratorApplication.cs @@ -43,7 +43,7 @@ public class SampleDataGeneratorApplication : OverviewPageBase private readonly IInfoProvider consentInfoProvider; private readonly IInfoProvider bizFormInfoProvider; private readonly IInfoProvider contactGroupInfoProvider; - private readonly ISettingsKeyInfoProvider settingsKeyInfoProvider; + private readonly IInfoProvider settingsKeyInfoProvider; private readonly IInfoProvider websiteChannelInfoProvider; @@ -63,7 +63,7 @@ public SampleDataGeneratorApplication( IInfoProvider consentInfoProvider, IInfoProvider bizFormInfoProvider, IInfoProvider contactGroupInfoProvider, - ISettingsKeyInfoProvider settingsKeyInfoProvider, + IInfoProvider settingsKeyInfoProvider, IInfoProvider websiteChannelInfoProvider) { this.formBuilderConfigurationSerializer = formBuilderConfigurationSerializer; diff --git a/examples/DancingGoat/App_Data/CMSModules/WebFarm/webfarm.sync b/examples/DancingGoat/App_Data/CMSModules/WebFarm/webfarm.sync deleted file mode 100644 index 4791ed5..0000000 --- a/examples/DancingGoat/App_Data/CMSModules/WebFarm/webfarm.sync +++ /dev/null @@ -1 +0,0 @@ -True \ No newline at end of file diff --git a/examples/DancingGoat/Components/ComponentIdentifiers.cs b/examples/DancingGoat/Components/ComponentIdentifiers.cs index a14c0d8..4001b07 100644 --- a/examples/DancingGoat/Components/ComponentIdentifiers.cs +++ b/examples/DancingGoat/Components/ComponentIdentifiers.cs @@ -21,4 +21,4 @@ public static class ComponentIdentifiers public const string ARTICLE_TEMPLATE = "DancingGoat.Article"; public const string ARTICLE_WITH_SIDEBAR_TEMPLATE = "DancingGoat.ArticleWithSidebar"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/FormBuilderComponentRegister.cs b/examples/DancingGoat/Components/FormBuilderComponentRegister.cs index 24f4781..a8afe79 100644 --- a/examples/DancingGoat/Components/FormBuilderComponentRegister.cs +++ b/examples/DancingGoat/Components/FormBuilderComponentRegister.cs @@ -2,4 +2,4 @@ using Kentico.Forms.Web.Mvc; -[assembly: RegisterFormSection("DancingGoat.TitledSection", "Section with title", "~/Components/FormSections/TitledSection/_TitledSection.cshtml", Description = "Single-column section with one zone and an editable title", IconClass = "icon-rectangle-a", PropertiesType = typeof(TitledSectionProperties))] \ No newline at end of file +[assembly: RegisterFormSection("DancingGoat.TitledSection", "Section with title", "~/Components/FormSections/TitledSection/_TitledSection.cshtml", Description = "Single-column section with one zone and an editable title", IconClass = "icon-rectangle-a", PropertiesType = typeof(TitledSectionProperties))] diff --git a/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs index 8293a82..9c68348 100644 --- a/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/ColorPickerEditor/ColorPickerEditorViewModel.cs @@ -10,4 +10,4 @@ public sealed class ColorPickerEditorViewModel : InlineEditorViewModel /// public string ColorCssClass { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs index e12fe37..916b8b7 100644 --- a/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/InlineEditorViewModel.cs @@ -10,4 +10,4 @@ public abstract class InlineEditorViewModel /// public string PropertyName { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs b/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs index bafe5d9..b122df9 100644 --- a/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs +++ b/examples/DancingGoat/Components/InlineEditors/TextEditor/TextEditorViewModel.cs @@ -16,4 +16,4 @@ public sealed class TextEditorViewModel : InlineEditorViewModel /// public string PlaceholderText { get; set; } = "Type your text"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/PageBuilderComponentRegister.cs b/examples/DancingGoat/Components/PageBuilderComponentRegister.cs index 1db2b0f..b904930 100644 --- a/examples/DancingGoat/Components/PageBuilderComponentRegister.cs +++ b/examples/DancingGoat/Components/PageBuilderComponentRegister.cs @@ -1,4 +1,4 @@ -using DancingGoat; +using DancingGoat; using DancingGoat.Models; using DancingGoat.PageTemplates; using DancingGoat.Sections; diff --git a/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs b/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs index 23a616e..6e2a3f9 100644 --- a/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs +++ b/examples/DancingGoat/Components/Personalization/ConditionTypes/IsInContactGroupConditionType.cs @@ -46,4 +46,4 @@ public override bool Evaluate() return contact.IsInAnyContactGroup(SelectedContactGroups.Select(c => c.ObjectCodeName).ToArray()); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs b/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs index 2fa7bb6..1d57989 100644 --- a/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs +++ b/examples/DancingGoat/Components/Sections/ThemeSectionProperties.cs @@ -14,4 +14,4 @@ public class ThemeSectionProperties : ISectionProperties [DropDownComponent(Label = "Color scheme", Order = 1, Options = ";None\nsection-white;Flat white\nsection-cappuccino;Cappuccino")] public string Theme { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs b/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs index 99dc9b6..aa491a1 100644 --- a/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs +++ b/examples/DancingGoat/Components/Sections/ThreeColumnSection/ThreeColumnSectionProperties.cs @@ -13,4 +13,4 @@ public class ThreeColumnSectionProperties : ThemeSectionProperties [TextInputComponent(Label = "Title", Order = 1)] public string Title { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs b/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs index ab62de6..c28d28d 100644 --- a/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs +++ b/examples/DancingGoat/Components/Sections/ZoneRestrictions.cs @@ -58,4 +58,4 @@ private static IEnumerable GetWidgetsIdentifiers() .Select(definition => definition.Identifier); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs index 1ac19fa..757ced9 100644 --- a/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Articles/ArticlesViewComponent.cs @@ -46,7 +46,7 @@ public async Task InvokeAsync(WebPageRelatedItem articl var articlesSection = await articlesSectionRepository.GetArticlesSection(articlesSectionItem.WebPageGuid, languageName); if (articlesSection == null) { - return View("~/Components/ViewComponents/Articles/Default.cshtml", ArticlesSectionViewModel.GetViewModel(Enumerable.Empty(), string.Empty)); + return View("~/Components/ViewComponents/Articles/Default.cshtml", ArticlesSectionViewModel.GetViewModel(null, Enumerable.Empty(), string.Empty)); } var articlePages = await articlePageRepository.GetArticles(articlesSection.SystemFields.WebPageItemTreePath, @@ -61,9 +61,9 @@ public async Task InvokeAsync(WebPageRelatedItem articl var url = (await urlRetriever.Retrieve(articlesSection, languageName)).RelativePath; - var viewModel = ArticlesSectionViewModel.GetViewModel(models, url); + var viewModel = ArticlesSectionViewModel.GetViewModel(articlesSection, models, url); return View("~/Components/ViewComponents/Articles/Default.cshtml", viewModel); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs index 85a197e..30214c7 100644 --- a/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Banner/BannerViewComponent.cs @@ -15,4 +15,4 @@ public ViewViewComponentResult Invoke(BannerViewModel banner) return View("~/Components/ViewComponents/Banner/Default.cshtml", banner); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs index 5cc5e21..aea0596 100644 --- a/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/Cafe/CafeViewComponent.cs @@ -15,4 +15,4 @@ public ViewViewComponentResult Invoke(CafeViewModel cafe) return View("~/Components/ViewComponents/Cafe/Default.cshtml", cafe); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs index 32a3b46..2babe51 100644 --- a/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/CafeCardSection/CafeCardSectionViewComponent.cs @@ -11,7 +11,7 @@ namespace DancingGoat.ViewComponents /// /// Cafe card section view component. /// - public class CafeCardSectionViewComponent: ViewComponent + public class CafeCardSectionViewComponent : ViewComponent { public ViewViewComponentResult Invoke(IEnumerable cafes) { diff --git a/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs b/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs index b7e0fbe..0dbdf25 100644 --- a/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs +++ b/examples/DancingGoat/Components/ViewComponents/NavigationMenu/NavigationMenuViewComponent.cs @@ -27,4 +27,4 @@ public async Task InvokeAsync() return View($"~/Components/ViewComponents/NavigationMenu/Default.cshtml", navigationViewModels); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs index e4666ff..7d2ea2e 100644 --- a/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/CTAButton/CTAButtonWidgetViewModel.cs @@ -22,4 +22,4 @@ public class CTAButtonWidgetViewModel /// public bool OpenInNewTab { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs index cd47e46..c432008 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetProperties.cs @@ -23,4 +23,4 @@ public class CardWidgetProperties : IWidgetProperties /// public string Text { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs index d532287..e008489 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewComponent.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Threading.Tasks; using DancingGoat.Models; @@ -66,4 +66,4 @@ private async Task GetImage(CardWidgetProperties properties, string langu return await imageRepository.GetImage(image.Identifier, languageName); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs index 4c36108..7e27780 100644 --- a/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/CardWidget/CardWidgetViewModel.cs @@ -16,4 +16,4 @@ public class CardWidgetViewModel /// public string Text { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs index cf92a29..ad72474 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetProperties.cs @@ -46,4 +46,4 @@ public class HeroImageWidgetProperties : IWidgetProperties [DropDownComponent(Label = "Color scheme", Order = 3, Options = "light;Light\ndark;Dark")] public string Theme { get; set; } = "dark"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs index 9fc24f3..4e74f23 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewComponent.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Threading.Tasks; using DancingGoat.Models; @@ -68,4 +68,4 @@ private async Task GetImage(HeroImageWidgetProperties properties, string return await imageRepository.GetImage(image.Identifier, languageName); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs index 84f095a..6c50c57 100644 --- a/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/HeroImageWidget/HeroImageWidgetViewModel.cs @@ -34,4 +34,4 @@ public class HeroImageWidgetViewModel /// public string Theme { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs index 26c15fc..7c37d68 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardListViewModel.cs @@ -21,10 +21,10 @@ public class ProductCardListViewModel /// /// Collection of products. /// Hydrated ViewModel. - public static ProductCardListViewModel GetViewModel(IEnumerable products) + public static ProductCardListViewModel GetViewModel(IEnumerable products) { var productModels = new List(); - + foreach (var product in products.Where(product => product != null)) { var productModel = ProductCardViewModel.GetViewModel(product); @@ -37,4 +37,4 @@ public static ProductCardListViewModel GetViewModel(IEnumerable products }; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs index 478674a..cf4a8d3 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardProperties.cs @@ -2,8 +2,6 @@ using CMS.ContentEngine; -using DancingGoat.Models; - using Kentico.PageBuilder.Web.Mvc; using Kentico.Xperience.Admin.Base.FormAnnotations; @@ -17,7 +15,7 @@ public class ProductCardProperties : IWidgetProperties /// /// Selected products. /// - [ContentItemSelectorComponent(Coffee.CONTENT_TYPE_NAME, Label = "Selected products", Order = 1)] + [ContentItemSelectorComponent(typeof(ProductCardSchemaFilter), Label = "Selected products", Order = 1)] public IEnumerable SelectedProducts { get; set; } = new List(); } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs new file mode 100644 index 0000000..9f36e5f --- /dev/null +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardSchemaFilter.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +using DancingGoat.Models; + +using Kentico.Xperience.Admin.Base.FormAnnotations; + +namespace DancingGoat.Widgets +{ + /// + /// Product card widget filter for content item selector. + /// + public class ProductCardSchemaFilter : IReusableFieldSchemasFilter + { + /// + IEnumerable IReusableFieldSchemasFilter.AllowedSchemaNames => new List { IProductFields.REUSABLE_FIELD_SCHEMA_NAME }; + } +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs index 6b5b86d..19936a5 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardViewModel.cs @@ -32,7 +32,7 @@ public class ProductCardViewModel /// /// Product. /// Hydrated ViewModel. - public static ProductCardViewModel GetViewModel(Coffee product) + public static ProductCardViewModel GetViewModel(IProductFields product) { if (product == null) { @@ -40,11 +40,11 @@ public static ProductCardViewModel GetViewModel(Coffee product) } return new ProductCardViewModel - { - Heading = product.CoffeeName, - ImagePath = (product.CoffeeImage.FirstOrDefault())?.ImageFile.Url, - Text = product.CoffeeShortDescription - }; + { + Heading = product.ProductFieldsName, + ImagePath = product.ProductFieldsImage.FirstOrDefault()?.ImageFile.Url, + Text = product.ProductFieldsShortDescription + }; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs index c127307..04a3e77 100644 --- a/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs +++ b/examples/DancingGoat/Components/Widgets/ProductCardWidget/ProductCardWidgetViewComponent.cs @@ -1,7 +1,8 @@ -using System.Collections.Generic; -using System.Linq; +using System.Linq; using System.Threading.Tasks; +using CMS.ContentEngine; + using DancingGoat.Models; using DancingGoat.Widgets; @@ -26,7 +27,7 @@ public class ProductCardWidgetViewComponent : ViewComponent public const string IDENTIFIER = "DancingGoat.LandingPage.ProductCardWidget"; - private readonly CoffeeRepository repository; + private readonly ProductRepository repository; private readonly IPreferredLanguageRetriever currentLanguageRetriever; @@ -35,7 +36,7 @@ public class ProductCardWidgetViewComponent : ViewComponent /// /// Repository for retrieving products. /// Retrieves preferred language name for the current request. Takes language fallback into account. - public ProductCardWidgetViewComponent(CoffeeRepository repository, IPreferredLanguageRetriever currentLanguageRetriever) + public ProductCardWidgetViewComponent(ProductRepository repository, IPreferredLanguageRetriever currentLanguageRetriever) { this.repository = repository; this.currentLanguageRetriever = currentLanguageRetriever; @@ -46,11 +47,11 @@ public async Task InvokeAsync(ProductCardProperties pro { var languageName = currentLanguageRetriever.Get(); var selectedProductGuids = properties.SelectedProducts.Select(i => i.Identifier).ToList(); - IEnumerable products = (await repository.GetCoffees(selectedProductGuids, languageName)) - .OrderBy(p => selectedProductGuids.IndexOf(p.SystemFields.ContentItemGUID)); + var products = (await repository.GetProducts(selectedProductGuids, languageName)) + .OrderBy(p => selectedProductGuids.IndexOf(((IContentItemFieldsSource)p).SystemFields.ContentItemGUID)); var model = ProductCardListViewModel.GetViewModel(products); return View("~/Components/Widgets/ProductCardWidget/_ProductCardWidget.cshtml", model); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs b/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs index 3decca3..57c31e9 100644 --- a/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs +++ b/examples/DancingGoat/Components/Widgets/TestimonialWidget/TestimonialWidgetProperties.cs @@ -12,7 +12,7 @@ public class TestimonialWidgetProperties : IWidgetProperties /// public string QuotationText { get; set; } - + /// /// Author text. /// @@ -24,4 +24,4 @@ public class TestimonialWidgetProperties : IWidgetProperties /// public string ColorCssClass { get; set; } = "first-color"; } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/AccountController.cs b/examples/DancingGoat/Controllers/AccountController.cs index 704a8f4..f43a9c6 100644 --- a/examples/DancingGoat/Controllers/AccountController.cs +++ b/examples/DancingGoat/Controllers/AccountController.cs @@ -180,10 +180,10 @@ private async Task GetHomeWebPageUrl(CancellationToken cancellationToken } var homePageUrl = await webPageUrlRetriever.Retrieve( - websiteChannel.WebsiteChannelHomePage, - websiteChannelContext.WebsiteChannelName, - currentLanguageRetriever.Get(), - websiteChannelContext.IsPreview, + websiteChannel.WebsiteChannelHomePage, + websiteChannelContext.WebsiteChannelName, + currentLanguageRetriever.Get(), + websiteChannelContext.IsPreview, cancellationToken ); @@ -196,4 +196,4 @@ private async Task GetHomeWebPageUrl(CancellationToken cancellationToken } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatArticleController.cs b/examples/DancingGoat/Controllers/DancingGoatArticleController.cs index cf03528..260fd39 100644 --- a/examples/DancingGoat/Controllers/DancingGoatArticleController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatArticleController.cs @@ -27,22 +27,22 @@ public class DancingGoatArticleController : Controller private readonly IPreferredLanguageRetriever currentLanguageRetriever; - public DancingGoatArticleController( - ArticlePageRepository articlePageRepository, - ArticlesSectionRepository articlesSectionRepository, - IWebPageUrlRetriever urlRetriever, - IWebPageDataContextRetriever webPageDataContextRetriever, - IPreferredLanguageRetriever currentLanguageRetriever) - { - this.articlePageRepository = articlePageRepository; - this.articlesSectionRepository = articlesSectionRepository; - this.urlRetriever = urlRetriever; - this.webPageDataContextRetriever = webPageDataContextRetriever; - this.currentLanguageRetriever = currentLanguageRetriever; - } - - - public async Task Index() + public DancingGoatArticleController( + ArticlePageRepository articlePageRepository, + ArticlesSectionRepository articlesSectionRepository, + IWebPageUrlRetriever urlRetriever, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever) + { + this.articlePageRepository = articlePageRepository; + this.articlesSectionRepository = articlesSectionRepository; + this.urlRetriever = urlRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + } + + + public async Task Index() { var languageName = currentLanguageRetriever.Get(); @@ -55,11 +55,15 @@ public async Task Index() var models = new List(); foreach (var article in articles) { - var model = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName); - models.Add(model); + var articleModel = await ArticleViewModel.GetViewModel(article, urlRetriever, languageName); + models.Add(articleModel); } - return View(models); + var url = (await urlRetriever.Retrieve(articlesSection, languageName)).RelativePath; + + var model = ArticlesSectionViewModel.GetViewModel(articlesSection, models, url); + + return View(model); } diff --git a/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs b/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs new file mode 100644 index 0000000..75421af --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatCoffeeController.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using CMS.ContentEngine; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +[assembly: RegisterWebPageRoute(CoffeePage.CONTENT_TYPE_NAME, typeof(DancingGoatCoffeeController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME }, ActionName = nameof(DancingGoatCoffeeController.Detail))] + +namespace DancingGoat.Controllers +{ + public class DancingGoatCoffeeController : Controller + { + private readonly ProductPageRepository productPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly ITaxonomyRetriever taxonomyRetriever; + + + public DancingGoatCoffeeController(ProductPageRepository productPageRepository, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productPageRepository = productPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Detail() + { + var languageName = currentLanguageRetriever.Get(); + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + + var coffee = await productPageRepository.GetProduct(CoffeePage.CONTENT_TYPE_NAME, webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return View(await CoffeeDetailViewModel.GetViewModel(coffee, languageName, taxonomyRetriever)); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs b/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs index f213f4a..2a4d559 100644 --- a/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatConfirmationController.cs @@ -37,4 +37,4 @@ public async Task Index() return View(ConfirmationPageViewModel.GetViewModel(confirmationPage)); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatContactsController.cs b/examples/DancingGoat/Controllers/DancingGoatContactsController.cs index 1642f8b..24e2191 100644 --- a/examples/DancingGoat/Controllers/DancingGoatContactsController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatContactsController.cs @@ -6,6 +6,8 @@ using DancingGoat; using DancingGoat.Controllers; using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; using Kentico.Content.Web.Mvc.Routing; using Microsoft.AspNetCore.Mvc; @@ -16,29 +18,37 @@ namespace DancingGoat.Controllers { public class DancingGoatContactsController : Controller { + private readonly ContactsPageRepository contactsPageRepository; private readonly ContactRepository contactRepository; private readonly CafeRepository cafeRepository; private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; - public DancingGoatContactsController(ContactRepository contactRepository, - CafeRepository cafeRepository, IPreferredLanguageRetriever currentLanguageRetriever) + public DancingGoatContactsController(ContactsPageRepository contactsPageRepository, ContactRepository contactRepository, + CafeRepository cafeRepository, IPreferredLanguageRetriever currentLanguageRetriever, IWebPageDataContextRetriever webPageDataContextRetriever) { + this.contactsPageRepository = contactsPageRepository; this.contactRepository = contactRepository; this.cafeRepository = cafeRepository; this.currentLanguageRetriever = currentLanguageRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; } public async Task Index(CancellationToken cancellationToken) { - var model = await GetIndexViewModel(cancellationToken); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + + var contactsPage = await contactsPageRepository.GetContactsPage(webPage.WebPageItemID, webPage.LanguageName, HttpContext.RequestAborted); + + var model = await GetIndexViewModel(contactsPage, cancellationToken); return View(model); } - private async Task GetIndexViewModel(CancellationToken cancellationToken) + private async Task GetIndexViewModel(ContactsPage contactsPage, CancellationToken cancellationToken) { var languageName = currentLanguageRetriever.Get(); var cafes = await cafeRepository.GetCompanyCafes(4, languageName, cancellationToken); @@ -47,7 +57,8 @@ private async Task GetIndexViewModel(CancellationToken c return new ContactsIndexViewModel { CompanyContact = ContactViewModel.GetViewModel(contact), - CompanyCafes = GetCompanyCafesModel(cafes) + CompanyCafes = GetCompanyCafesModel(cafes), + WebPage = contactsPage }; } @@ -57,4 +68,4 @@ private List GetCompanyCafesModel(IEnumerable cafes) return cafes.Select(cafe => CafeViewModel.GetViewModel(cafe)).ToList(); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs b/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs new file mode 100644 index 0000000..be3f1a4 --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatGrinderController.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; + +using Microsoft.AspNetCore.Mvc; + +using CMS.ContentEngine; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +[assembly: RegisterWebPageRoute(GrinderPage.CONTENT_TYPE_NAME, typeof(DancingGoatGrinderController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME }, ActionName = nameof(DancingGoatGrinderController.Detail))] + +namespace DancingGoat.Controllers +{ + public class DancingGoatGrinderController : Controller + { + private readonly ProductPageRepository productPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly ITaxonomyRetriever taxonomyRetriever; + + + public DancingGoatGrinderController(ProductPageRepository productPageRepository, + IWebPageDataContextRetriever webPageDataContextRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productPageRepository = productPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Detail() + { + var languageName = currentLanguageRetriever.Get(); + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + + var grinder = await productPageRepository.GetProduct(GrinderPage.CONTENT_TYPE_NAME, webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return View(await GrinderDetailViewModel.GetViewModel(grinder, languageName, taxonomyRetriever)); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatHomeController.cs b/examples/DancingGoat/Controllers/DancingGoatHomeController.cs index 38d5823..68ee611 100644 --- a/examples/DancingGoat/Controllers/DancingGoatHomeController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatHomeController.cs @@ -34,4 +34,4 @@ public async Task Index() return View(HomePageViewModel.GetViewModel(homePage)); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs b/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs new file mode 100644 index 0000000..5dd7951 --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatLandingPageController.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; +using Kentico.PageBuilder.Web.Mvc.PageTemplates; + +using Microsoft.AspNetCore.Mvc; + +[assembly: RegisterWebPageRoute(LandingPage.CONTENT_TYPE_NAME, typeof(DancingGoatLandingPageController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME })] + +namespace DancingGoat.Controllers +{ + public class DancingGoatLandingPageController : Controller + { + private readonly LandingPageRepository landingPageRepository; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + + + public DancingGoatLandingPageController(LandingPageRepository landingPageRepository, IWebPageDataContextRetriever webPageDataContextRetriever, IPreferredLanguageRetriever currentLanguageRetriever) + { + this.landingPageRepository = landingPageRepository; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + } + + + public async Task Index() + { + var webPageItemId = webPageDataContextRetriever.Retrieve().WebPage.WebPageItemID; + var languageName = currentLanguageRetriever.Get(); + + var landingPage = await landingPageRepository.GetLandingPage(webPageItemId, languageName, cancellationToken: HttpContext.RequestAborted); + + return new TemplateResult(landingPage); + } + } +} diff --git a/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs b/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs index 8c1fa4f..992fd9c 100644 --- a/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs +++ b/examples/DancingGoat/Controllers/DancingGoatPrivacyController.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using CMS.ContactManagement; using CMS.DataEngine; @@ -27,6 +28,8 @@ public class DancingGoatPrivacyController : Controller private readonly IConsentAgreementService consentAgreementService; private readonly IInfoProvider consentInfoProvider; private readonly IPreferredLanguageRetriever currentLanguageRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly PrivacyPageRepository privacyPageRepository; private ContactInfo currentContact; @@ -44,17 +47,23 @@ private ContactInfo CurrentContact } - public DancingGoatPrivacyController(IConsentAgreementService consentAgreementService, IInfoProvider consentInfoProvider, IPreferredLanguageRetriever currentLanguageRetriever) + public DancingGoatPrivacyController(PrivacyPageRepository privacyPageRepository, IConsentAgreementService consentAgreementService, IInfoProvider consentInfoProvider, IPreferredLanguageRetriever currentLanguageRetriever, IWebPageDataContextRetriever webPageDataContextRetriever) { + this.privacyPageRepository = privacyPageRepository; this.consentAgreementService = consentAgreementService; this.consentInfoProvider = consentInfoProvider; this.currentLanguageRetriever = currentLanguageRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; } - public ActionResult Index() + public async Task Index() { - var model = new PrivacyViewModel(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + + var privacyPage = await privacyPageRepository.GetPrivacyPage(webPage.WebPageItemID, webPage.LanguageName, HttpContext.RequestAborted); + + var model = new PrivacyViewModel { WebPage = privacyPage }; if (!IsDemoEnabled()) { diff --git a/examples/DancingGoat/Controllers/DancingGoatProductController.cs b/examples/DancingGoat/Controllers/DancingGoatProductController.cs new file mode 100644 index 0000000..511c03d --- /dev/null +++ b/examples/DancingGoat/Controllers/DancingGoatProductController.cs @@ -0,0 +1,97 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Websites; + +using DancingGoat; +using DancingGoat.Controllers; +using DancingGoat.Models; + +using Kentico.Content.Web.Mvc; +using Kentico.Content.Web.Mvc.Routing; + +using Microsoft.AspNetCore.Mvc; + +[assembly: RegisterWebPageRoute(ProductsSection.CONTENT_TYPE_NAME, typeof(DancingGoatProductController), WebsiteChannelNames = new[] { DancingGoatConstants.WEBSITE_CHANNEL_NAME })] + +namespace DancingGoat.Controllers +{ + public class DancingGoatProductController : Controller + { + private readonly ProductSectionRepository productSectionRepository; + private readonly ProductPageRepository productPageRepository; + private readonly ProductRepository productRepository; + private readonly ITaxonomyRetriever taxonomyRetriever; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly IWebPageDataContextRetriever webPageDataContextRetriever; + private readonly IPreferredLanguageRetriever currentLanguageRetriever; + + + public DancingGoatProductController( + ProductSectionRepository productSectionRepository, + ProductPageRepository productPageRepository, + ProductRepository productRepository, + IWebPageUrlRetriever urlRetriever, + IPreferredLanguageRetriever currentLanguageRetriever, + IWebPageDataContextRetriever webPageDataContextRetriever, + ITaxonomyRetriever taxonomyRetriever) + { + this.productSectionRepository = productSectionRepository; + this.productPageRepository = productPageRepository; + this.productRepository = productRepository; + this.urlRetriever = urlRetriever; + this.webPageDataContextRetriever = webPageDataContextRetriever; + this.currentLanguageRetriever = currentLanguageRetriever; + this.taxonomyRetriever = taxonomyRetriever; + } + + + public async Task Index() + { + var languageName = currentLanguageRetriever.Get(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + var productsSection = await productSectionRepository.GetProductsSection(webPage.WebPageItemID, languageName, HttpContext.RequestAborted); + + var products = await GetProducts(languageName, productsSection); + + var taxonomies = new Dictionary(); + var taxonomyNames = new List { "CoffeeProcessing", "CoffeeTastes", "GrinderManufacturer", "GrinderType" }; + foreach (var taxonomyName in taxonomyNames) + { + var taxonomy = await taxonomyRetriever.RetrieveTaxonomy(taxonomyName, languageName); + if (taxonomy.Tags.Any()) + { + taxonomies.Add(taxonomyName, TaxonomyViewModel.GetViewModel(taxonomy)); + } + } + + var listModel = new ProductListViewModel(products, taxonomies); + + return View(listModel); + } + + + [HttpPost($"{{{WebPageRoutingOptions.LANGUAGE_ROUTE_VALUE_KEY}}}/{{controller}}/{{action}}")] + [ValidateAntiForgeryToken] + public async Task Filter(IDictionary filter) + { + var languageName = currentLanguageRetriever.Get(); + var webPage = webPageDataContextRetriever.Retrieve().WebPage; + var productsSection = await productSectionRepository.GetProductsSection(webPage.WebPageItemID, languageName, HttpContext.RequestAborted); + + var products = await GetProducts(languageName, productsSection, filter); + return PartialView("ProductsList", products); + } + + + private async Task> GetProducts(string languageName, ProductsSection productsSection, IDictionary filter = null) + { + var products = await productRepository.GetProducts(languageName, filter ?? new Dictionary(), cancellationToken: HttpContext.RequestAborted); + var productPages = await productPageRepository.GetProducts(productsSection.SystemFields.WebPageItemTreePath, languageName, products, cancellationToken: HttpContext.RequestAborted); + + return productPages.Select(productPage => ProductListItemViewModel.GetViewModel(productPage, urlRetriever, languageName).Result); + } + } +} diff --git a/examples/DancingGoat/Controllers/HttpErrorsController.cs b/examples/DancingGoat/Controllers/HttpErrorsController.cs index 06b2b2c..7057f60 100644 --- a/examples/DancingGoat/Controllers/HttpErrorsController.cs +++ b/examples/DancingGoat/Controllers/HttpErrorsController.cs @@ -14,4 +14,4 @@ public IActionResult Error(int code) return StatusCode(code); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Controllers/SiteMapController.cs b/examples/DancingGoat/Controllers/SiteMapController.cs new file mode 100644 index 0000000..28d5fdc --- /dev/null +++ b/examples/DancingGoat/Controllers/SiteMapController.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Xml; + +using CMS.ContentEngine; +using CMS.DataEngine; +using CMS.Websites; + +using DancingGoat.Models; + +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Mvc; + +namespace DancingGoat.Controllers +{ + /// + /// Controller for generating a sitemap. + /// + public class SiteMapController : Controller + { + private const string XML_TYPE = "application/xml"; + + private readonly IContentQueryExecutor contentQueryExecutor; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly IInfoProvider contentLanguageProvider; + + + /// + /// Initializes a new instance of the class. + /// + public SiteMapController(IContentQueryExecutor contentQueryExecutor, IWebPageUrlRetriever urlRetriever, IInfoProvider contentLanguageProvider) + { + this.contentQueryExecutor = contentQueryExecutor; + this.urlRetriever = urlRetriever; + this.contentLanguageProvider = contentLanguageProvider; + } + + + [HttpGet] + [Route("/sitemap.xml")] + public async Task Index() + { + var options = new ContentQueryExecutionOptions + { + ForPreview = false, + IncludeSecuredItems = false + }; + + var relativeUrls = new List(); + + foreach (var language in contentLanguageProvider.Get().OrderByDescending(i => i.ContentLanguageIsDefault)) + { + var builder = new ContentItemQueryBuilder().ForContentTypes(p => p.OfReusableSchema("SEOFields").ForWebsite()) + .InLanguage(language.ContentLanguageName, false) + .Parameters(p => p.Columns(nameof(IWebPageContentQueryDataContainer.WebPageItemID)) + .Where(w => w.WhereTrue(nameof(ISEOFields.SEOFieldsAllowSearchIndexing)))); + + var pageIdentifiers = await contentQueryExecutor.GetWebPageResult(builder, i => i.WebPageItemID, options, HttpContext.RequestAborted); + var languageUrls = await GetWebPageRelativeUrls(pageIdentifiers, language.ContentLanguageName); + + relativeUrls.AddRange(languageUrls); + } + + var absoluteUrls = GetAbsoluteUrls(relativeUrls); + var document = GetSitemap(absoluteUrls); + + return Content(document.OuterXml, XML_TYPE); + } + + + private async Task> GetWebPageRelativeUrls(IEnumerable pageIdentifiers, string languageName) + { + var relativeUrls = new List(); + + foreach (var pageIdentifier in pageIdentifiers) + { + var webPageUrl = await urlRetriever.Retrieve(pageIdentifier, languageName, false, HttpContext.RequestAborted); + relativeUrls.Add(webPageUrl.RelativePath.TrimStart('~')); + } + + return relativeUrls; + } + + + private IEnumerable GetAbsoluteUrls(IEnumerable relativeUrls) + { + var request = HttpContext.Request; + + return relativeUrls.Select(i => UriHelper.BuildAbsolute(request.Scheme, request.Host, path: i)).OrderBy(i => i); + } + + + private static XmlDocument GetSitemap(IEnumerable urls) + { + var document = new XmlDocument(); + + var urlSet = document.CreateElement("urlset"); + urlSet.SetAttribute("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9"); + + foreach (var url in urls) + { + var element = document.CreateElement("url"); + var location = document.CreateElement("loc"); + location.InnerText = url; + + element.AppendChild(location); + urlSet.AppendChild(element); + } + + document.AppendChild(urlSet); + + return document; + } + } +} diff --git a/examples/DancingGoat/DancingGoat.csproj b/examples/DancingGoat/DancingGoat.csproj index dd6367e..ce3c191 100644 --- a/examples/DancingGoat/DancingGoat.csproj +++ b/examples/DancingGoat/DancingGoat.csproj @@ -1,32 +1,38 @@ - - - DancingGoat - 7e8a56d7-ac0a-4d47-af57-fc423c65gafb - false - annotations - false - - - - - - - - - - - - - $(DefineConstants);SEPARATED_ADMIN - - - - - - - - - - - + + + net6.0 + DancingGoat + 79c858af-5444-4954-8d0a-6592a961e82a + false + annotations + false + + + + + + + PreserveNewest + + + + + + + + $(DefineConstants);SEPARATED_ADMIN + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/DancingGoat/DancingGoatConstants.cs b/examples/DancingGoat/DancingGoatConstants.cs index ad53549..774b6b1 100644 --- a/examples/DancingGoat/DancingGoatConstants.cs +++ b/examples/DancingGoat/DancingGoatConstants.cs @@ -8,7 +8,7 @@ internal static class DancingGoatConstants /// The constraint ensures that broken URLs lead to a "404 page not found" page and are not handled by a controller dedicated to the component or /// to a page handled by the content tree-based router (which would lead to an exception). /// - public const string CONSTRAINT_FOR_NON_ROUTER_PAGE_CONTROLLERS = "Account|Consent"; + public const string CONSTRAINT_FOR_NON_ROUTER_PAGE_CONTROLLERS = "Account|Consent|SiteMap"; public const string DEFAULT_ROUTE_NAME = "default"; diff --git a/examples/DancingGoat/Data/Template.zip b/examples/DancingGoat/Data/Template.zip deleted file mode 100644 index 4ed70d7..0000000 Binary files a/examples/DancingGoat/Data/Template.zip and /dev/null differ diff --git a/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs b/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs index ce69a66..12959b4 100644 --- a/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs +++ b/examples/DancingGoat/DataProtectionSamples/DancingGoatSamplesModule.cs @@ -78,7 +78,7 @@ protected override void OnInit() /// private void InitializeSamples() { - var dataProtectionSamplesEnabledSettingsKey = settingsKeyInfoProvider.Get().WhereEquals(nameof(SettingsKeyInfo.KeyName), DATA_PROTECTION_SAMPLES_ENABLED_SETTINGS_KEY_NAME).FirstOrDefault(); + var dataProtectionSamplesEnabledSettingsKey = settingsKeyInfoProvider.Get(DATA_PROTECTION_SAMPLES_ENABLED_SETTINGS_KEY_NAME); if (dataProtectionSamplesEnabledSettingsKey?.KeyValue.ToBoolean(false) ?? false) { RegisterSamples(); diff --git a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs b/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs index ad4afe7..6e78567 100644 --- a/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs +++ b/examples/DancingGoat/DataProtectionSamples/PersonalDataCollectors/SampleContactDataCollectorCore.cs @@ -401,11 +401,11 @@ private void WriteContacts(IEnumerable contacts) var stateID = contactInfo.ContactStateID; if (countryID != 0) { - writer.WriteBaseInfo(countryInfoProvider.Get().WithID(countryID).FirstOrDefault(), countryInfoColumns); + writer.WriteBaseInfo(countryInfoProvider.Get(countryID), countryInfoColumns); } if (stateID != 0) { - writer.WriteBaseInfo(stateInfoProvider.Get().WithID(stateID).FirstOrDefault(), stateInfoColumns); + writer.WriteBaseInfo(stateInfoProvider.Get(stateID), stateInfoColumns); } writer.WriteEndSection(); diff --git a/examples/DancingGoat/Export-DeploymentPackage.ps1 b/examples/DancingGoat/Export-DeploymentPackage.ps1 deleted file mode 100644 index 2120347..0000000 --- a/examples/DancingGoat/Export-DeploymentPackage.ps1 +++ /dev/null @@ -1,104 +0,0 @@ -<# -.Synopsis - Creates a deployment package for uploading to the Xperience Cloud environment. -#> -[CmdletBinding()] -param ( - # Output path for exported deployment package. - [Parameter(Mandatory = $false)] - [string]$OutputPackagePath = "./DeploymentPackage.zip", - - # The name of the main web application assembly used as the starting point by the Xperience Cloud. - [Parameter(Mandatory = $true)] - [string]$AssemblyName, - - # If present, the custom build number won't be used as a "Product version" suffix in the format yyyyMMddHHmm. - [switch]$KeepProductVersion, - - # Mode in which the storage assets are deployed, if present. - [ValidateSet("Create", "CreateUpdate")] - [String]$StorageAssetsDeploymentMode = "Create" -) -$ErrorActionPreference = "Stop" - -$OutputFolderPath = "./bin/CloudDeployment/" -$MetadataFilePath = Join-Path $OutputFolderPath "cloud-metadata.json" -$CDRepositoryFolderPath = "./`$CDRepository" -$StorageAssetsFolderName = "`$StorageAssets" -$BuildNumber = (Get-Date).ToUniversalTime().ToString("yyyyMMddHHmm") - -# Remove previously published website -Remove-Item -Recurse -Force $OutputFolderPath -ErrorAction SilentlyContinue - -# Publish the application in the 'Release' mode -$PublishCommand = "dotnet publish --nologo -c Release -o $OutputFolderPath" - -if (!$KeepProductVersion) { - $PublishCommand += " --version-suffix $BuildNumber" -} - -Invoke-Expression $PublishCommand - -if ($LASTEXITCODE -ne 0) { - throw "Publishing the website failed." -} - -# Get CD repositories paths -$LocalCDRepositoryPath = Join-Path (Resolve-Path .) $CDRepositoryFolderPath -$OutputCDRepositoryPath = Join-Path $OutputFolderPath $CDRepositoryFolderPath - -# Check for non-existing or empty CD repository which could corrupt the database -if (-not (Test-Path $LocalCDRepositoryPath) -or (@(Get-ChildItem -Path $LocalCDRepositoryPath -Directory).Count -le 0)) { - throw "Cannot detect CD repository on path '$LocalCDRepositoryPath'. Make sure to run 'dotnet run --kxp-cd-store --repository-path ""```$CDRepository""' before 'Export-DeploymentPackage.ps1'." -} - -# Copy content of the CD repository to the output folder -Copy-Item -Force -Recurse "$LocalCDRepositoryPath/*" -Destination $OutputCDRepositoryPath - -# Get storage assets paths -$LocalStorageAssetsPath = Join-Path (Resolve-Path .) $StorageAssetsFolderName -$OutputStorageAssetsPath = Join-Path $OutputFolderPath $StorageAssetsFolderName - -if (Test-Path $LocalStorageAssetsPath) { - # Check if storage asset top-level directories have valid names - Get-ChildItem -Path $LocalStorageAssetsPath | % { - if ($_.Name -cnotmatch "^[a-z0-9](?!.*--)[a-z0-9-]{1,61}[a-z0-9]$") { - throw "Storage asset directory '$($_.FullName)' does not have a valid name. Top level storage asset directories must have names that are 3-63 characters long and contain only lowercase letters, numbers or dashes (-). Every dash symbol must be surrounded by letters or numbers." - } - } - - # Copy storage assets to the output folder - New-Item -Force -ItemType Directory $OutputStorageAssetsPath | Out-Null - Copy-Item -Force -Recurse "$LocalStorageAssetsPath/*" -Destination $OutputStorageAssetsPath - - # Deployed assets need to have lowercase names - Get-ChildItem -Path $OutputStorageAssetsPath -Recurse | % { - $lowercasedAssetName = $_.Name.ToLowerInvariant() - - if ($_.Name -cne $lowercasedAssetName) { - Rename-Item -Force $_.FullName "$($_.Name).tmp" - Rename-Item -Force "$($_.FullName).tmp" $lowercasedAssetName - } - } -} - -$AssemblyPath = Join-Path $OutputFolderPath "$AssemblyName.dll" -Resolve -$PackageMetadata = @{ - AssemblyName = $AssemblyName - Version = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($AssemblyPath).ProductVersion -} - -# Add necessary metadata if storage assets folder has been exported as well -if (Test-Path $OutputStorageAssetsPath) { - $PackageMetadata.Add("StorageAssetsDirectory", $StorageAssetsFolderName) - $PackageMetadata.Add("StorageAssetsDeploymentMode", $StorageAssetsDeploymentMode) -} - -# Create all necessary metadata for cloud-based package deployment -$PackageMetadata | ConvertTo-Json -Depth 2 | Set-Content $MetadataFilePath -Encoding utf8 - -# Create a deployment package -if (Test-Path -Path $OutputPackagePath -PathType Container) { - $OutputPackagePath = Join-Path -Path $OutputPackagePath -ChildPath "./DeploymentPackage.zip" -} -Compress-Archive -Force -Path "$OutputFolderPath/*" -DestinationPath $OutputPackagePath \ No newline at end of file diff --git a/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs b/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs index 10404ff..6bc5878 100644 --- a/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs +++ b/examples/DancingGoat/Helpers/AreaRestrictionHelper.cs @@ -31,4 +31,4 @@ private static IEnumerable GetWidgetsIdentifiers() .Select(definition => definition.Identifier); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Account/LoginViewModel.cs b/examples/DancingGoat/Models/Account/LoginViewModel.cs index 2127246..c865cc2 100644 --- a/examples/DancingGoat/Models/Account/LoginViewModel.cs +++ b/examples/DancingGoat/Models/Account/LoginViewModel.cs @@ -20,4 +20,4 @@ public class LoginViewModel [DisplayName("Stay signed in")] public bool StaySignedIn { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Account/RegisterViewModel.cs b/examples/DancingGoat/Models/Account/RegisterViewModel.cs index ada5add..386b39f 100644 --- a/examples/DancingGoat/Models/Account/RegisterViewModel.cs +++ b/examples/DancingGoat/Models/Account/RegisterViewModel.cs @@ -35,4 +35,4 @@ public class RegisterViewModel [Compare("Password", ErrorMessage = "Password does not match the confirmation password")] public string PasswordConfirmation { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/ContentRepositoryBase.cs b/examples/DancingGoat/Models/ContentRepositoryBase.cs index ca7409d..f18e177 100644 --- a/examples/DancingGoat/Models/ContentRepositoryBase.cs +++ b/examples/DancingGoat/Models/ContentRepositoryBase.cs @@ -6,11 +6,13 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models { + /// + /// Shared implementation for content type repositories. + /// public abstract class ContentRepositoryBase { /// @@ -20,58 +22,20 @@ public abstract class ContentRepositoryBase private readonly IContentQueryExecutor executor; - private readonly IWebPageQueryResultMapper mapper; private readonly IProgressiveCache cache; - public ContentRepositoryBase(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - { - WebsiteChannelContext = websiteChannelContext; - this.executor = executor; - this.mapper = mapper; - this.cache = cache; - } - /// - /// Returns cached query result. + /// Initializes a new instance of the class. /// - /// Model to which the query results will be mapped. - /// Prepared query builder to be executed by the injected . - /// Optional . Default values are used if not specified. - /// Object with values to set up cache. See for more information. - /// Function that will create cache dependencies for the query. - /// Cancellation instruction. - /// Thrown when any of the , or parameters is null. - /// Request is not cached if the request is for preview. - public Task> GetCachedQueryResult( - ContentItemQueryBuilder queryBuilder, - ContentQueryExecutionOptions queryOptions, - CacheSettings cacheSettings, - Func, CancellationToken, Task>> cacheDependenciesFunc, - CancellationToken cancellationToken) - where T : new() + /// Website channel context. + /// Content query executor. + /// Cache. + public ContentRepositoryBase(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) { - if (queryBuilder is null) - { - throw new ArgumentNullException(nameof(queryBuilder)); - } - - if (cacheSettings is null) - { - throw new ArgumentNullException(nameof(cacheSettings)); - } - - if (cacheDependenciesFunc is null) - { - throw new ArgumentNullException(nameof(cacheDependenciesFunc)); - } - - if (queryOptions == null) - { - queryOptions = new ContentQueryExecutionOptions(); - } - - return GetCachedQueryResultInternal(queryBuilder, queryOptions, container => mapper.Map(container), cacheSettings, cacheDependenciesFunc, cancellationToken); + WebsiteChannelContext = websiteChannelContext; + this.executor = executor; + this.cache = cache; } @@ -81,7 +45,6 @@ public Task> GetCachedQueryResult( /// Model to which the query results will be mapped. /// Prepared query builder to be executed by the injected . /// Optional . Default values are used if not specified. - /// Function converting a web page content query data record container to the resulting instance. /// Object with values to set up cache. See for more information. /// Function that will create cache dependencies for the query. /// Cancellation instruction. @@ -90,11 +53,9 @@ public Task> GetCachedQueryResult( public Task> GetCachedQueryResult( ContentItemQueryBuilder queryBuilder, ContentQueryExecutionOptions queryOptions, - Func resultSelector, CacheSettings cacheSettings, Func, CancellationToken, Task>> cacheDependenciesFunc, CancellationToken cancellationToken) - where T : new() { if (queryBuilder is null) { @@ -116,31 +77,29 @@ public Task> GetCachedQueryResult( queryOptions = new ContentQueryExecutionOptions(); } - return GetCachedQueryResultInternal(queryBuilder, queryOptions, resultSelector, cacheSettings, cacheDependenciesFunc, cancellationToken); + return GetCachedQueryResultInternal(queryBuilder, queryOptions, cacheSettings, cacheDependenciesFunc, cancellationToken); } private async Task> GetCachedQueryResultInternal(ContentItemQueryBuilder queryBuilder, ContentQueryExecutionOptions queryOptions, - Func resultSelector, CacheSettings cacheSettings, Func, CancellationToken, Task>> cacheDependenciesFunc, CancellationToken cancellationToken) - where T : new() { queryOptions.ForPreview = WebsiteChannelContext.IsPreview; queryOptions.IncludeSecuredItems = queryOptions.IncludeSecuredItems || WebsiteChannelContext.IsPreview; if (WebsiteChannelContext.IsPreview) { - return await executor.GetWebPageResult(queryBuilder, resultSelector, options: queryOptions, cancellationToken: cancellationToken); + return await executor.GetMappedResult(queryBuilder, queryOptions, cancellationToken); } return await cache.LoadAsync(async (cacheSettings) => { - var result = await executor.GetWebPageResult(queryBuilder, resultSelector, options: queryOptions, cancellationToken: cancellationToken); + var result = await executor.GetMappedResult(queryBuilder, queryOptions, cancellationToken); - if (cacheSettings.Cached = (result != null && result.Any())) + if (cacheSettings.Cached = result != null && result.Any()) { cacheSettings.CacheDependency = CacheHelper.GetCacheDependency(await cacheDependenciesFunc(result, cancellationToken)); } diff --git a/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs b/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs index 2bffb4a..381fb0f 100644 --- a/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Banner/Banner.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Banner : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Banner : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs b/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs index 2940e5c..46ba1ef 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/Cafe.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Cafe : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Cafe : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs b/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs index 8a8546a..c08bc3a 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/CafeRepository.cs @@ -22,10 +22,9 @@ public partial class CafeRepository : ContentRepositoryBase public CafeRepository( IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, - IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + : base(websiteChannelContext, executor, cache) { this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; } @@ -65,4 +64,4 @@ private async Task> GetDependencyCacheKeys(IEnumerable cafes, return dependencyCacheKeys; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs b/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs index 2eda178..9a26bb0 100644 --- a/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Cafe/CafeViewModel.cs @@ -4,6 +4,9 @@ namespace DancingGoat.Models { public record CafeViewModel(string Name, string PhotoPath, string PhotoShortDescription, string Street, string City, string Country, string ZipCode, string Phone) { + /// + /// Maps to a . + /// public static CafeViewModel GetViewModel(Cafe cafe) { var cafePhoto = cafe.CafePhoto?.FirstOrDefault(); diff --git a/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs b/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs index 75b1b01..4271000 100644 --- a/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Coffee/Coffee.generated.cs @@ -18,7 +18,8 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// - public partial class Coffee : IContentItemFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class Coffee : IContentItemFieldsSource, IProductFields { /// /// Code name of the content type. @@ -29,30 +30,43 @@ public partial class Coffee : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } /// - /// CoffeeName. + /// CoffeeProcessing. /// - public string CoffeeName { get; set; } + public IEnumerable CoffeeProcessing { get; set; } /// - /// CoffeeShortDescription. + /// CoffeeTastes. /// - public string CoffeeShortDescription { get; set; } + public IEnumerable CoffeeTastes { get; set; } /// - /// CoffeeDescription. + /// ProductFieldsName. /// - public string CoffeeDescription { get; set; } + public string ProductFieldsName { get; set; } /// - /// CoffeeImage. + /// ProductFieldsDescription. /// - public IEnumerable CoffeeImage { get; set; } + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs b/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs deleted file mode 100644 index adface8..0000000 --- a/examples/DancingGoat/Models/Reusable/Coffee/CoffeeRepository.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -using CMS.ContentEngine; -using CMS.Helpers; -using CMS.Websites; -using CMS.Websites.Routing; - -namespace DancingGoat.Models -{ - /// - /// Represents a collection of coffees. - /// - public partial class CoffeeRepository : ContentRepositoryBase - { - private readonly ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever; - - /// - /// Initializes a new instance of the class that returns coffees. - /// - public CoffeeRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) - { - this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; - } - - - /// - /// Returns an enumerable collection of based on a given collection of content item guids. - /// - public async Task> GetCoffees(ICollection coffeeGuids, string languageName, CancellationToken cancellationToken = default) - { - var queryBuilder = GetQueryBuilder(coffeeGuids, languageName); - - var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(CoffeeRepository), nameof(GetCoffees), languageName, coffeeGuids.Select(guid => guid.ToString()).Join("|")); - - return await GetCachedQueryResult(queryBuilder, null, cacheSettings, (coffees, cancellationToken) => GetDependencyCacheKeys(coffees, coffeeGuids), cancellationToken); - } - - - private static ContentItemQueryBuilder GetQueryBuilder(ICollection coffeeGuids, string languageName) - { - return new ContentItemQueryBuilder() - .ForContentType(Coffee.CONTENT_TYPE_NAME, - config => config - .WithLinkedItems(1) - .Where(where => where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), coffeeGuids))) - .InLanguage(languageName); - } - - - private Task> GetDependencyCacheKeys(IEnumerable coffees, IEnumerable coffeeGuids) - { - var dependencyCacheKeys = linkedItemsDependencyRetriever.Get(coffees.Select(coffee => coffee.SystemFields.ContentItemID), 1).ToHashSet(StringComparer.InvariantCultureIgnoreCase); - - foreach (var guid in coffeeGuids) - { - dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "contentitem", "byguid", guid.ToString() }, false)); - } - - return Task.FromResult>(dependencyCacheKeys); - } - } -} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs b/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs index 6c7e3e1..541e1d6 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/Contact.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Contact : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Contact : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs b/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs index 770c357..96f9025 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/ContactRepository.cs @@ -5,7 +5,6 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models @@ -15,8 +14,8 @@ namespace DancingGoat.Models /// public class ContactRepository : ContentRepositoryBase { - public ContactRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ContactRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } @@ -58,4 +57,4 @@ private static Task> GetDependencyCacheKeys(IEnumerable co return Task.FromResult>(dependencyCacheKeys); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs b/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs index a007d16..3e01f8f 100644 --- a/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Contact/ContactViewModel.cs @@ -13,14 +13,14 @@ public static ContactViewModel GetViewModel(Contact contact) } return new ContactViewModel( - contact.ContactName, - contact.ContactStreet, - contact.ContactCity, - contact.ContactCountry, - contact.ContactZipCode, - contact.ContactPhone, + contact.ContactName, + contact.ContactStreet, + contact.ContactCity, + contact.ContactCountry, + contact.ContactZipCode, + contact.ContactPhone, contact.ContactEmail ); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs b/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs index dcc7131..221b331 100644 --- a/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Event/Event.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Event : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Event : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs b/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs index 3cc4233..fb7ce36 100644 --- a/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Event/EventViewModel.cs @@ -20,13 +20,13 @@ public static EventViewModel GetViewModel(Event eventContentItem) var cafe = eventContentItem.EventCafe?.FirstOrDefault(); return new EventViewModel( - eventContentItem.EventTitle, - bannerImage?.ImageFile.Url, - bannerImage?.ImageShortDescription, + eventContentItem.EventTitle, + bannerImage?.ImageFile.Url, + bannerImage?.ImageShortDescription, eventContentItem.EventPromoText, eventContentItem.EventDate, cafe?.CafeName, - cafe?.CafeCuppingOffer.Select(coffee => coffee.CoffeeName) + cafe?.CafeCuppingOffer.Select(coffee => coffee.ProductFieldsName) ); } } diff --git a/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs b/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs new file mode 100644 index 0000000..32cc100 --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Grinder/Grinder.generated.cs @@ -0,0 +1,72 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; + +namespace DancingGoat.Models +{ + /// + /// Represents a content item of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class Grinder : IContentItemFieldsSource, IProductFields + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.Grinder"; + + + /// + /// Represents system properties for a content item. + /// + [SystemField] + public ContentItemFields SystemFields { get; set; } + + + /// + /// GrinderManufacturer. + /// + public IEnumerable GrinderManufacturer { get; set; } + + + /// + /// GrinderType. + /// + public IEnumerable GrinderType { get; set; } + + + /// + /// ProductFieldsName. + /// + public string ProductFieldsName { get; set; } + + + /// + /// ProductFieldsDescription. + /// + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs b/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs index d334b91..4c98e04 100644 --- a/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Image/Image.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Image : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Image : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs b/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs index 31e6e1f..2852d46 100644 --- a/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs +++ b/examples/DancingGoat/Models/Reusable/Image/ImageRepository.cs @@ -6,15 +6,14 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models { public class ImageRepository : ContentRepositoryBase { - public ImageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ImageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs b/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs new file mode 100644 index 0000000..ff114df --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Product/ProductRepository.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.DataEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of product pages. + /// + public class ProductRepository : ContentRepositoryBase + { + private const string COFFEE_PROCESSING = "CoffeeProcessing"; + private const string COFFEE_TASTES = "CoffeeTastes"; + private const string GRINDER_MANUFACTURER = "GrinderManufacturer"; + private const string GRINDER_TYPE = "GrinderType"; + + + private readonly ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever; + private readonly IInfoProvider taxonomyInfoProvider; + + + /// + /// Initializes new instance of . + /// + public ProductRepository( + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, + IProgressiveCache cache, + ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever, + IInfoProvider taxonomyInfoProvider) + : base(websiteChannelContext, executor, cache) + { + this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; + this.taxonomyInfoProvider = taxonomyInfoProvider; + } + + + /// + /// Returns list of content items. + /// + public async Task> GetProducts(string languageName, IDictionary filter, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + { + var queryBuilder = await GetQueryBuilder(languageName, filter: filter); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var filterCacheItemNameParts = filter.Values.Where(value => value != null && value.Tags != null).SelectMany(value => value.Tags.Where(tag => tag.IsChecked)).Select(id => id.Value.ToString()).Join("|"); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, includeSecuredItems, nameof(IProductFields), filterCacheItemNameParts); + + return await GetCachedQueryResult(queryBuilder, options, cacheSettings, (_, _) => GetDependencyCacheKeys(languageName), cancellationToken); + } + + + /// + /// Returns list of content items. + /// + public async Task> GetProducts(ICollection productGuids, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = await GetQueryBuilder(languageName, productGuids); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, nameof(IProductFields), productGuids.Select(guid => guid.ToString()).Join("|")); + + return await GetCachedQueryResult(queryBuilder, new ContentQueryExecutionOptions(), cacheSettings, (_, _) => GetDependencyCacheKeys(languageName, productGuids), cancellationToken); + } + + + private static async Task GetQueryBuilder(string languageName, IEnumerable productGuids = null, IDictionary filter = null) + { + var baseBuilder = new ContentItemQueryBuilder().ForContentTypes(ct => + { + ct.OfReusableSchema(IProductFields.REUSABLE_FIELD_SCHEMA_NAME) + .WithContentTypeFields() + .WithLinkedItems(1); + }).InLanguage(languageName); + + if (productGuids != null) + { + baseBuilder.Parameters(query => query.Where(where => where.WhereIn(nameof(IContentQueryDataContainer.ContentItemGUID), productGuids))); + } + + if (filter == null || !filter.Any()) + { + return baseBuilder; + } + + var coffeeProcessingTags = await GetSelectedTags(filter, COFFEE_PROCESSING); + var coffeeTastesTags = await GetSelectedTags(filter, COFFEE_TASTES); + var grinderManufacturerTags = await GetSelectedTags(filter, GRINDER_MANUFACTURER); + var grinderTypeTags = await GetSelectedTags(filter, GRINDER_TYPE); + + return baseBuilder + .Parameters(query => query.Where(where => where + .Where(coffeeWhere => coffeeWhere + .WhereContainsTags(nameof(Coffee.CoffeeProcessing), coffeeProcessingTags) + .WhereContainsTags(nameof(Coffee.CoffeeTastes), coffeeTastesTags)) + .Where(grinderWhere => grinderWhere + .WhereContainsTags(nameof(Grinder.GrinderManufacturer), grinderManufacturerTags) + .WhereContainsTags(nameof(Grinder.GrinderType), grinderTypeTags)) + )); + } + + + private static async Task GetSelectedTags(IDictionary filter, string taxonomyName) + { + if (filter.TryGetValue(taxonomyName, out var taxonomy)) + { + return await taxonomy.GetSelectedTags(); + } + + return null; + } + + + private async Task> GetDependencyCacheKeys(string languageName, ICollection productGuids = null) + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase) + { + CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID), + CacheHelper.GetCacheItemName(null, "contentitem", "bycontenttype", Coffee.CONTENT_TYPE_NAME, languageName), + CacheHelper.GetCacheItemName(null, "contentitem", "bycontenttype", Grinder.CONTENT_TYPE_NAME, languageName), + await GetTaxonomyTagsCacheDependencyKey(COFFEE_PROCESSING), + await GetTaxonomyTagsCacheDependencyKey(COFFEE_TASTES), + await GetTaxonomyTagsCacheDependencyKey(GRINDER_MANUFACTURER), + await GetTaxonomyTagsCacheDependencyKey(GRINDER_TYPE) + }; + GetProductPageDependencies(productGuids, dependencyCacheKeys); + + return dependencyCacheKeys; + } + + + private static void GetProductPageDependencies(ICollection productGuids, HashSet dependencyCacheKeys) + { + if (productGuids == null || !productGuids.Any()) + { + return; + } + + foreach (var guid in productGuids) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "contentitem", "byguid", guid.ToString() }, false)); + } + } + + + private async Task GetTaxonomyTagsCacheDependencyKey(string taxonomyName) + { + var taxonomyID = (await taxonomyInfoProvider.GetAsync(taxonomyName)).TaxonomyID; + return CacheHelper.GetCacheItemName(null, TaxonomyInfo.OBJECT_TYPE, "byid", taxonomyID, "children"); + } + } +} diff --git a/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs b/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs index 0b60d2c..c1aaa25 100644 --- a/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs +++ b/examples/DancingGoat/Models/Reusable/Reference/Reference.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class Reference : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class Reference : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs b/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs index b5a060d..af4dc68 100644 --- a/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/Reference/ReferenceViewModel.cs @@ -15,10 +15,10 @@ public static ReferenceViewModel GetViewModel(Reference reference) } return new ReferenceViewModel( - reference.ReferenceName, - reference.ReferenceDescription, - reference.ReferenceText, - reference.ReferenceImage.FirstOrDefault()?.ImageFile.Url, + reference.ReferenceName, + reference.ReferenceDescription, + reference.ReferenceText, + reference.ReferenceImage.FirstOrDefault()?.ImageFile.Url, reference.ReferenceImage.FirstOrDefault()?.ImageShortDescription ); } diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs index 64dab81..1bef5b5 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLink.generated.cs @@ -18,6 +18,7 @@ namespace DancingGoat.Models /// /// Represents a content item of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class SocialLink : IContentItemFieldsSource { /// @@ -29,6 +30,7 @@ public partial class SocialLink : IContentItemFieldsSource /// /// Represents system properties for a content item. /// + [SystemField] public ContentItemFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs index dc8d632..08d8b07 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkRepository.cs @@ -6,7 +6,6 @@ using CMS.ContentEngine; using CMS.Helpers; -using CMS.Websites; using CMS.Websites.Routing; namespace DancingGoat.Models @@ -19,8 +18,8 @@ public class SocialLinkRepository : ContentRepositoryBase private readonly ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever; - public SocialLinkRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + public SocialLinkRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, ILinkedItemsDependencyRetriever linkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) { this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; } @@ -66,4 +65,4 @@ private static IEnumerable GetCacheByIdKeys(IEnumerable itemIds) } } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs index bd6e518..757033d 100644 --- a/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs +++ b/examples/DancingGoat/Models/Reusable/SocialLink/SocialLinkViewModel.cs @@ -14,4 +14,4 @@ public static SocialLinkViewModel GetViewModel(SocialLink socialLink) return new SocialLinkViewModel(socialLink.SocialLinkTitle, socialLinkUrl, socialLink.SocialLinkIcon.FirstOrDefault()?.ImageFile?.Url); } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs b/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs new file mode 100644 index 0000000..a7dcaaa --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Tag/TagViewModel.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record TagViewModel(string Name, int Level, Guid Value, bool IsChecked = false) + { + private const int ROOT_TAG_ID = 0; + + public static TagViewModel GetViewModel(Tag tag, int level = 0) + { + return new TagViewModel(tag.Title, level, tag.Identifier); + } + + + public static List GetViewModels(IEnumerable tags) + { + var result = new List(); + var tagsByParentId = tags.GroupBy(tag => tag.ParentID).ToDictionary(group => group.Key, group => group.ToList()); + + if (tagsByParentId.TryGetValue(ROOT_TAG_ID, out var firstLevelTags)) + { + GetTagsWithTagViewModels(firstLevelTags, ROOT_TAG_ID); + } + + return result; + + + void GetTagsWithTagViewModels(IEnumerable currentLevelTags, int level) + { + foreach (var tag in currentLevelTags.OrderBy(tag => tag.Order)) + { + var children = tagsByParentId.TryGetValue(tag.ID, out var childrenTags) ? childrenTags : Enumerable.Empty(); + result.Add(GetViewModel(tag, level)); + GetTagsWithTagViewModels(children, level + 1); + } + } + } + } +} diff --git a/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs b/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs new file mode 100644 index 0000000..d4128ef --- /dev/null +++ b/examples/DancingGoat/Models/Reusable/Taxonomy/TaxonomyViewModel.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +namespace DancingGoat.Models +{ + public record TaxonomyViewModel(string Name, string CodeName, List Tags) + { + /// + /// Maps to a . + /// + public static TaxonomyViewModel GetViewModel(TaxonomyData taxonomy) + { + return new TaxonomyViewModel(taxonomy.Taxonomy.Title, taxonomy.Taxonomy.Name, TagViewModel.GetViewModels(taxonomy.Tags)); + } + + + /// + /// Gets selected tags. + /// + public async Task GetSelectedTags() + { + if (Tags == null) + { + return null; + } + + return await TagCollection.Create(Tags.Where(tag => tag.IsChecked).Select(tag => tag.Value)); + } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Schema/IProductFields.generated.cs b/examples/DancingGoat/Models/Schema/IProductFields.generated.cs new file mode 100644 index 0000000..d5dda02 --- /dev/null +++ b/examples/DancingGoat/Models/Schema/IProductFields.generated.cs @@ -0,0 +1,51 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Defines a contract for content types with the reusable schema assigned. + /// + public interface IProductFields + { + /// + /// Code name of the reusable field schema. + /// + public const string REUSABLE_FIELD_SCHEMA_NAME = "ProductFields"; + + + /// + /// ProductFieldsName. + /// + public string ProductFieldsName { get; set; } + + + /// + /// ProductFieldsDescription. + /// + public string ProductFieldsDescription { get; set; } + + + /// + /// ProductFieldsShortDescription. + /// + public string ProductFieldsShortDescription { get; set; } + + + /// + /// ProductFieldsImage. + /// + public IEnumerable ProductFieldsImage { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs b/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs new file mode 100644 index 0000000..3146ad8 --- /dev/null +++ b/examples/DancingGoat/Models/Schema/ISEOFields.generated.cs @@ -0,0 +1,45 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Defines a contract for content types with the reusable schema assigned. + /// + public interface ISEOFields + { + /// + /// Code name of the reusable field schema. + /// + public const string REUSABLE_FIELD_SCHEMA_NAME = "SEOFields"; + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs index 3016d6b..63a2117 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticleDetailViewModel.cs @@ -8,7 +8,12 @@ namespace DancingGoat.Models { public record ArticleDetailViewModel(string Title, string TeaserUrl, string Summary, string Text, DateTime PublicationDate, Guid Guid, bool IsSecured, string Url, IEnumerable RelatedArticles) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -37,8 +42,10 @@ public static async Task GetViewModel(ArticlePage articl articlePage.SystemFields.ContentItemGUID, articlePage.SystemFields.ContentItemIsSecured, url.RelativePath, - relatedArticlesViewModels - ); + relatedArticlesViewModels) + { + WebPage = articlePage + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs index f872fbb..e3b46a9 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ArticlePage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ArticlePage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class ArticlePage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -66,5 +69,23 @@ public partial class ArticlePage : IWebPageFieldsSource /// ArticleRelatedArticles. /// public IEnumerable ArticleRelatedArticles { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs index 0999459..c9b6325 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlePage/ArticlePageRepository.cs @@ -24,12 +24,11 @@ public class ArticlePageRepository : ContentRepositoryBase /// Initializes new instance of . /// public ArticlePageRepository( - IWebsiteChannelContext websiteChannelContext, - IContentQueryExecutor executor, - IWebPageQueryResultMapper mapper, + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + : base(websiteChannelContext, executor, cache) { this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; } @@ -60,10 +59,7 @@ public async Task> GetArticles(ICollection guids, { var queryBuilder = GetQueryBuilder(guids, languageName); - var options = new ContentQueryExecutionOptions - { - IncludeSecuredItems = true - }; + var options = new ContentQueryExecutionOptions { IncludeSecuredItems = true }; var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, languageName, guids.GetHashCode()); @@ -106,13 +102,14 @@ private ContentItemQueryBuilder GetQueryBuilder(int topN, string treePath, strin private ContentItemQueryBuilder GetQueryBuilder(ICollection guids, string languageName) { - return GetQueryBuilder( - languageName, - config => config - .WithLinkedItems(1) - .OrderBy(OrderByColumn.Desc(nameof(ArticlePage.ArticlePagePublishDate))) - .ForWebsite(WebsiteChannelContext.WebsiteChannelName) - .Where(where => where.WhereIn(nameof(IWebPageContentQueryDataContainer.WebPageItemGUID), guids))); + return new ContentItemQueryBuilder().ForContentTypes(q => + { + q.ForWebsite(guids) + .WithContentTypeFields() + .WithLinkedItems(1); + }).InLanguage(languageName) + .Parameters(q => + q.OrderBy(OrderByColumn.Desc(nameof(ArticlePage.ArticlePagePublishDate)))); } diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs index aaf4ca9..c51466d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSection.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ArticlesSection : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ArticlesSection : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class ArticlesSection : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs index a4abc11..390f96d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionRepository.cs @@ -16,8 +16,8 @@ public class ArticlesSectionRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public ArticlesSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ArticlesSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs index d4e324e..72ca09d 100644 --- a/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ArticlesSection/ArticlesSectionViewModel.cs @@ -1,12 +1,25 @@ using System.Collections.Generic; +using CMS.Websites; + namespace DancingGoat.Models { public record ArticlesSectionViewModel(IEnumerable Articles, string ArticlesPath) + : IWebPageBasedViewModel { - public static ArticlesSectionViewModel GetViewModel(IEnumerable Articles, string ArticlesPath) + /// + public IWebPageFieldsSource WebPage { get; init; } + + + /// + /// Maps to a . + /// + public static ArticlesSectionViewModel GetViewModel(ArticlesSection articlesSection, IEnumerable Articles, string ArticlesPath) { - return new ArticlesSectionViewModel(Articles, ArticlesPath); + return new ArticlesSectionViewModel(Articles, ArticlesPath) + { + WebPage = articlesSection + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs new file mode 100644 index 0000000..ae380f3 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeeDetailViewModel.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record CoffeeDetailViewModel(string Name, string Description, string ImageUrl, IEnumerable Tastes, IEnumerable Processing) + { + /// + /// Maps to a . + /// + public async static Task GetViewModel(CoffeePage coffeePage, string languageName, ITaxonomyRetriever taxonomyRetriever) + { + var coffee = coffeePage.RelatedItem.FirstOrDefault(); + var image = coffee.ProductFieldsImage.FirstOrDefault(); + + return new CoffeeDetailViewModel( + coffee.ProductFieldsName, + coffee.ProductFieldsDescription, + image?.ImageFile.Url, + await taxonomyRetriever.RetrieveTags(coffee.CoffeeTastes.Select(taste => taste.Identifier), languageName), + await taxonomyRetriever.RetrieveTags(coffee.CoffeeProcessing.Select(processing => processing.Identifier), languageName) + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs new file mode 100644 index 0000000..57542c5 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Custom code for page of type . + /// + public partial class CoffeePage : IProductPage + { + /// + IEnumerable IProductPage.RelatedItem { get => RelatedItem; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs new file mode 100644 index 0000000..5045100 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/CoffeePage/CoffeePage.generated.cs @@ -0,0 +1,43 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class CoffeePage : IWebPageFieldsSource + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.CoffeePage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// RelatedItem. + /// + public IEnumerable RelatedItem { get; set; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs index 4b7fe29..5c0fcd1 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ConfirmationPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ConfirmationPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class ConfirmationPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -54,5 +57,23 @@ public partial class ConfirmationPage : IWebPageFieldsSource /// ConfirmationPageArticlesSection. /// public IEnumerable ConfirmationPageArticlesSection { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs index d81fb45..6a9179c 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageRepository.cs @@ -15,8 +15,8 @@ namespace DancingGoat.Models /// public class ConfirmationPageRepository : ContentRepositoryBase { - public ConfirmationPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public ConfirmationPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs index 766dec2..83430e5 100644 --- a/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ConfirmationPage/ConfirmationPageViewModel.cs @@ -5,7 +5,12 @@ namespace DancingGoat.Models { public record ConfirmationPageViewModel(string Title, string Header, string Content, WebPageRelatedItem ArticlesSection) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -20,8 +25,10 @@ public static ConfirmationPageViewModel GetViewModel(ConfirmationPage confirmati confirmationPage.ConfirmationPageTitle, confirmationPage.ConfirmationPageHeader, confirmationPage.ConfirmationPageContent, - confirmationPage.ConfirmationPageArticlesSection.FirstOrDefault() - ); + confirmationPage.ConfirmationPageArticlesSection.FirstOrDefault()) + { + WebPage = confirmationPage + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs index 131d1ec..30a5f1d 100644 --- a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsIndexViewModel.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; +using CMS.Websites; + namespace DancingGoat.Models { - public class ContactsIndexViewModel + public class ContactsIndexViewModel : IWebPageBasedViewModel { /// /// The company contact data. @@ -14,5 +16,9 @@ public class ContactsIndexViewModel /// The company cafes data. /// public List CompanyCafes { get; set; } + + + /// + public IWebPageFieldsSource WebPage { get; init; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs index bb2b633..965fbb5 100644 --- a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class ContactsPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ContactsPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class ContactsPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs new file mode 100644 index 0000000..8252a96 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ContactsPage/ContactsPageRepository.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class ContactsPageRepository : ContentRepositoryBase + { + /// + /// Initializes new instance of . + /// + public ContactsPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + + /// + /// Returns web page by ID and language name. + /// + public async Task GetContactsPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(webPageItemId, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ContactsPage), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int webPageItemId, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(ContactsPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, includeUrlPath: false) + .Where(where => where + .WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId)) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable contactsPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var contactsPage = contactsPages.FirstOrDefault(); + if (contactsPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", contactsPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs new file mode 100644 index 0000000..5079460 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderDetailViewModel.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using CMS.ContentEngine; + +using Tag = CMS.ContentEngine.Tag; + +namespace DancingGoat.Models +{ + public record GrinderDetailViewModel(string Name, string Description, string ImageUrl, IEnumerable Manufacturers, IEnumerable Type) + { + /// + /// Maps to a . + /// + public async static Task GetViewModel(GrinderPage grinderPage, string languageName, ITaxonomyRetriever taxonomyRetriever) + { + var grinder = grinderPage.RelatedItem.FirstOrDefault(); + var image = grinder.ProductFieldsImage.FirstOrDefault(); + + return new GrinderDetailViewModel( + grinder.ProductFieldsName, + grinder.ProductFieldsDescription, + image?.ImageFile.Url, + await taxonomyRetriever.RetrieveTags(grinder.GrinderManufacturer.Select(manufacturer => manufacturer.Identifier), languageName), + await taxonomyRetriever.RetrieveTags(grinder.GrinderType.Select(type => type.Identifier), languageName) + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs new file mode 100644 index 0000000..ded6ed2 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + /// + /// Custom code for page of type . + /// + public partial class GrinderPage : IProductPage + { + /// + IEnumerable IProductPage.RelatedItem { get => RelatedItem; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs new file mode 100644 index 0000000..d79dda1 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/GrinderPage/GrinderPage.generated.cs @@ -0,0 +1,43 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class GrinderPage : IWebPageFieldsSource + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.GrinderPage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// RelatedItem. + /// + public IEnumerable RelatedItem { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs index a13cc52..4585e10 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class HomePage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class HomePage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,7 @@ public partial class HomePage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } @@ -66,5 +69,23 @@ public partial class HomePage : IWebPageFieldsSource /// HomePageArticlesSection. /// public IEnumerable HomePageArticlesSection { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs index 9f8c8a5..c9614e3 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePageRepository.cs @@ -22,8 +22,8 @@ public class HomePageRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public HomePageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) - : base(websiteChannelContext, executor, mapper, cache) + public HomePageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) { this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; } diff --git a/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs b/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs index ceb728e..5fde574 100644 --- a/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/HomePage/HomePageViewModel.cs @@ -7,7 +7,12 @@ namespace DancingGoat.Models { public record HomePageViewModel(BannerViewModel Banner, EventViewModel Event, string OurStoryText, ReferenceViewModel Reference, IEnumerable Cafes, WebPageRelatedItem ArticlesSection) + : IWebPageBasedViewModel { + /// + public IWebPageFieldsSource WebPage { get; init; } + + /// /// Validates and maps to a . /// @@ -24,7 +29,10 @@ public static HomePageViewModel GetViewModel(HomePage home) home.HomePageOurStory, ReferenceViewModel.GetViewModel(home.HomePageReference.FirstOrDefault()), home.HomePageCafes.Select(CafeViewModel.GetViewModel), - home.HomePageArticlesSection.FirstOrDefault()); + home.HomePageArticlesSection.FirstOrDefault()) + { + WebPage = home + }; } } } diff --git a/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs b/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs new file mode 100644 index 0000000..4fa8179 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/IWebPageBasedViewModel.cs @@ -0,0 +1,15 @@ +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Interface for view model instances based on web page items. + /// + public interface IWebPageBasedViewModel + { + /// + /// Web page which the view model is based on. + /// + IWebPageFieldsSource WebPage { get; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs index 32a55a8..fcfb146 100644 --- a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPage.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,7 +19,8 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// - public partial class LandingPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class LandingPage : IWebPageFieldsSource, ISEOFields { /// /// Code name of the content type. @@ -29,6 +31,25 @@ public partial class LandingPage : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs new file mode 100644 index 0000000..7b4c717 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/LandingPage/LandingPageRepository.cs @@ -0,0 +1,67 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of landing pages. + /// + public class LandingPageRepository : ContentRepositoryBase + { + public LandingPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + /// + /// Returns content item. + /// + /// Web page item ID. + /// Language name. + /// Cancellation token. + public async Task GetLandingPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(webPageItemId, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(LandingPage), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int webPageItemId, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(LandingPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, includeUrlPath: false) + .Where(where => where + .WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId)) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable confirmationPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var confirmationPage = confirmationPages.FirstOrDefault(); + + if (confirmationPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", confirmationPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs index 179c2c3..a338f4e 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItem.generated.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models @@ -18,6 +19,7 @@ namespace DancingGoat.Models /// /// Represents a page of type . /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] public partial class NavigationItem : IWebPageFieldsSource { /// @@ -29,6 +31,7 @@ public partial class NavigationItem : IWebPageFieldsSource /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs index c9615c9..2d6a49e 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemRepository.cs @@ -19,8 +19,8 @@ public class NavigationItemRepository : ContentRepositoryBase /// /// Initializes new instance of . /// - public NavigationItemRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IWebPageQueryResultMapper mapper, IProgressiveCache cache) - : base(websiteChannelContext, executor, mapper, cache) + public NavigationItemRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) { } diff --git a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs index 57973e7..4e8345a 100644 --- a/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/NavigationItem/NavigationItemViewModel.cs @@ -3,4 +3,4 @@ public record NavigationItemViewModel(string Caption, string RelativeUrl) { } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs similarity index 99% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs index 2dc4a98..523d9e5 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyConsentViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyConsentViewModel.cs @@ -10,4 +10,4 @@ public class PrivacyConsentViewModel public string Text { get; set; } } -} \ No newline at end of file +} diff --git a/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs new file mode 100644 index 0000000..976108f --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPage.generated.cs @@ -0,0 +1,55 @@ +//-------------------------------------------------------------------------------------------------- +// +// +// This code was generated by code generator tool. +// +// To customize the code use your own partial class. For more info about how to use and customize +// the generated code see the documentation at https://docs.xperience.io/. +// +// +//-------------------------------------------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using CMS.ContentEngine; +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a page of type . + /// + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class PrivacyPage : IWebPageFieldsSource, ISEOFields + { + /// + /// Code name of the content type. + /// + public const string CONTENT_TYPE_NAME = "DancingGoat.PrivacyPage"; + + + /// + /// Represents system properties for a web page item. + /// + [SystemField] + public WebPageFields SystemFields { get; set; } + + + /// + /// SEOFieldsTitle. + /// + public string SEOFieldsTitle { get; set; } + + + /// + /// SEOFieldsDescription. + /// + public string SEOFieldsDescription { get; set; } + + + /// + /// SEOFieldsAllowSearchIndexing. + /// + public bool SEOFieldsAllowSearchIndexing { get; set; } + } +} \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPageConstants.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageConstants.cs similarity index 100% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyPageConstants.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageConstants.cs diff --git a/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs new file mode 100644 index 0000000..dfcc233 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyPageRepository.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class PrivacyPageRepository : ContentRepositoryBase + { + /// + /// Initializes new instance of . + /// + public PrivacyPageRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache) + : base(websiteChannelContext, executor, cache) + { + } + + + /// + /// Returns web page by ID and language name. + /// + public async Task GetPrivacyPage(int webPageItemId, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(webPageItemId, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(PrivacyPage), webPageItemId, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int webPageItemId, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(PrivacyPage.CONTENT_TYPE_NAME, config => config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, includeUrlPath: false) + .Where(where => where + .WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), webPageItemId)) + .TopN(1)) + .InLanguage(languageName); + } + + + private static Task> GetDependencyCacheKeys(IEnumerable privacyPages, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(); + + var privacyPage = privacyPages.FirstOrDefault(); + if (privacyPage != null) + { + dependencyCacheKeys.Add(CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", privacyPage.SystemFields.WebPageItemID.ToString() }, false)); + } + + return Task.FromResult>(dependencyCacheKeys); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs similarity index 75% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs rename to examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs index 5d1d48e..8be3a5b 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyViewModel.cs +++ b/examples/DancingGoat/Models/WebPage/PrivacyPage/PrivacyViewModel.cs @@ -1,9 +1,11 @@ using System.Collections.Generic; using System.Linq; +using CMS.Websites; + namespace DancingGoat.Models { - public class PrivacyViewModel + public class PrivacyViewModel : IWebPageBasedViewModel { public bool DemoDisabled { get; set; } @@ -18,5 +20,8 @@ public class PrivacyViewModel public string PrivacyPageUrl { get; set; } + + + public IWebPageFieldsSource WebPage { get; init; } } } diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs b/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs new file mode 100644 index 0000000..82e308f --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/IProductPage.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +using CMS.Websites; + +namespace DancingGoat.Models +{ + /// + /// Represents a common product page model. + /// + public interface IProductPage : IWebPageFieldsSource + { + /// + /// Get product related item. + /// + public IEnumerable RelatedItem { get; } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs new file mode 100644 index 0000000..35d8c22 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListItemViewModel.cs @@ -0,0 +1,24 @@ +using System.Linq; +using System.Threading.Tasks; + +using CMS.Websites; + +namespace DancingGoat.Models +{ + public record ProductListItemViewModel(string Name, string ImagePath, string Url) + { + public static async Task GetViewModel(IProductPage productPage, IWebPageUrlRetriever urlRetriever, string languageName) + { + var product = productPage.RelatedItem.FirstOrDefault(); + var image = product.ProductFieldsImage.FirstOrDefault(); + + var path = (await urlRetriever.Retrieve(productPage, languageName)).RelativePath; + + return new ProductListItemViewModel( + product.ProductFieldsName, + image?.ImageFile.Url, + path + ); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs new file mode 100644 index 0000000..3c71a88 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductListViewModel.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace DancingGoat.Models +{ + public record ProductListViewModel(IEnumerable Items, Dictionary Filter) + { + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs b/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs new file mode 100644 index 0000000..f2f12e5 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductPage/ProductPageRepository.cs @@ -0,0 +1,151 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + /// + /// Represents a collection of product pages. + /// + public class ProductPageRepository : ContentRepositoryBase + { + private readonly IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever; + + + /// + /// Initializes new instance of . + /// + public ProductPageRepository( + IWebsiteChannelContext websiteChannelContext, + IContentQueryExecutor executor, + IProgressiveCache cache, + IWebPageLinkedItemsDependencyAsyncRetriever webPageLinkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) + { + this.webPageLinkedItemsDependencyRetriever = webPageLinkedItemsDependencyRetriever; + } + + + /// + /// Returns list of web pages. + /// + public async Task> GetProducts(string treePath, string languageName, IEnumerable linkedProducts, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + { + if (!linkedProducts.Any()) + { + return Enumerable.Empty(); + } + + var queryBuilder = GetQueryBuilder(treePath, languageName, linkedProducts); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var linkedProductCacheParts = linkedProducts.Select(product => product.ProductFieldsName).Join("|"); + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, treePath, languageName, includeSecuredItems, nameof(IProductPage), linkedProductCacheParts); + + return await GetCachedQueryResult(queryBuilder, options, cacheSettings, GetDependencyCacheKeys, cancellationToken); + } + + + public async Task GetProduct(string contentTypeName, int id, string languageName, bool includeSecuredItems = true, CancellationToken cancellationToken = default) + where ProductPageType : IWebPageFieldsSource, new() + { + var queryBuilder = GetQueryBuilder(id, languageName, contentTypeName); + + var options = new ContentQueryExecutionOptions + { + IncludeSecuredItems = includeSecuredItems + }; + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ProductPageType), id, languageName); + + var result = await GetCachedQueryResult(queryBuilder, options, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private ContentItemQueryBuilder GetQueryBuilder(string treePath, string languageName, IEnumerable linkedProducts) + { + return GetQueryBuilder( + languageName, + config => config + .Linking(nameof(IProductPage.RelatedItem), linkedProducts.Select(linkedProduct => ((IContentItemFieldsSource)linkedProduct).SystemFields.ContentItemID)) + .WithLinkedItems(2) + .ForWebsite(WebsiteChannelContext.WebsiteChannelName, PathMatch.Children(treePath))); + } + + + private static ContentItemQueryBuilder GetQueryBuilder(string languageName, Action configure = null) + { + return new ContentItemQueryBuilder() + .ForContentType(CoffeePage.CONTENT_TYPE_NAME, configure) + .ForContentType(GrinderPage.CONTENT_TYPE_NAME, configure) + .InLanguage(languageName); + } + + + private ContentItemQueryBuilder GetQueryBuilder(int id, string languageName, string contentTypeName) + { + return GetQueryBuilder( + languageName, + contentTypeName, + config => config + .WithLinkedItems(2) + .ForWebsite(WebsiteChannelContext.WebsiteChannelName) + .Where(where => where.WhereEquals(nameof(IWebPageContentQueryDataContainer.WebPageItemID), id))); + } + + + private static ContentItemQueryBuilder GetQueryBuilder(string languageName, string contentTypeName, Action configureQuery = null) + { + return new ContentItemQueryBuilder() + .ForContentType(contentTypeName, configureQuery) + .InLanguage(languageName); + } + + + private async Task> GetDependencyCacheKeys(IEnumerable products, CancellationToken cancellationToken) + where ProductPageType : IWebPageFieldsSource + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase); + + foreach (var product in products) + { + dependencyCacheKeys.UnionWith(GetDependencyCacheKeys(product)); + } + + dependencyCacheKeys.UnionWith(await webPageLinkedItemsDependencyRetriever.Get(products.Select(productPage => productPage.SystemFields.WebPageItemID), 1, cancellationToken)); + dependencyCacheKeys.Add(CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID)); + + return dependencyCacheKeys; + } + + + private IEnumerable GetDependencyCacheKeys(IWebPageFieldsSource product) + { + if (product == null) + { + return Enumerable.Empty(); + } + + return new List() + { + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", product.SystemFields.WebPageItemID.ToString() }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "bychannel", WebsiteChannelContext.WebsiteChannelName, "bypath", product.SystemFields.WebPageItemTreePath }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "bychannel", WebsiteChannelContext.WebsiteChannelName, "childrenofpath", DataHelper.GetParentPath(product.SystemFields.WebPageItemTreePath) }, false), + CacheHelper.GetCacheItemName(null, ContentLanguageInfo.OBJECT_TYPE, "all") + }; + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs new file mode 100644 index 0000000..f58f027 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductSectionRepository.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using CMS.ContentEngine; +using CMS.Helpers; +using CMS.Websites; +using CMS.Websites.Routing; + +namespace DancingGoat.Models +{ + public class ProductSectionRepository : ContentRepositoryBase + { + private readonly ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever; + + + public ProductSectionRepository(IWebsiteChannelContext websiteChannelContext, IContentQueryExecutor executor, IProgressiveCache cache, ILinkedItemsDependencyAsyncRetriever linkedItemsDependencyRetriever) + : base(websiteChannelContext, executor, cache) + { + this.linkedItemsDependencyRetriever = linkedItemsDependencyRetriever; + } + + + public async Task GetProductsSection(int id, string languageName, CancellationToken cancellationToken = default) + { + var queryBuilder = GetQueryBuilder(id, languageName); + + var cacheSettings = new CacheSettings(5, WebsiteChannelContext.WebsiteChannelName, nameof(ProductsSection), id, languageName); + + var result = await GetCachedQueryResult(queryBuilder, null, cacheSettings, GetDependencyCacheKeys, cancellationToken); + + return result.FirstOrDefault(); + } + + + private Task> GetDependencyCacheKeys(IEnumerable productsSection, CancellationToken cancellationToken) + { + var dependencyCacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase); + + foreach (var productSection in productsSection) + { + dependencyCacheKeys.UnionWith(GetDependencyCacheKeys(productSection)); + } + + dependencyCacheKeys.Add(CacheHelper.GetCacheItemName(null, WebsiteChannelInfo.OBJECT_TYPE, "byid", WebsiteChannelContext.WebsiteChannelID)); + + return Task.FromResult>(dependencyCacheKeys); + } + + + private static IEnumerable GetDependencyCacheKeys(ProductsSection productsSection) + { + if (productsSection == null) + { + return Enumerable.Empty(); + } + + var cacheKeys = new HashSet(StringComparer.InvariantCultureIgnoreCase) + { + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byid", productsSection.SystemFields.WebPageItemID.ToString() }, false), + CacheHelper.BuildCacheItemName(new[] { "webpageitem", "byguid", productsSection.SystemFields.WebPageItemGUID.ToString() }, false), + }; + + return cacheKeys; + } + + + private ContentItemQueryBuilder GetQueryBuilder(int id, string languageName) + { + return new ContentItemQueryBuilder() + .ForContentType(ProductsSection.CONTENT_TYPE_NAME, + config => + config + .ForWebsite(WebsiteChannelContext.WebsiteChannelName) + .Where(where => where.WhereEquals(nameof(WebPageFields.WebPageItemID), id)) + .TopN(1)) + .InLanguage(languageName); + } + } +} diff --git a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs similarity index 74% rename from examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs rename to examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs index 2e5891f..2948028 100644 --- a/examples/DancingGoat/Models/WebPage/Privacy/PrivacyPage.generated.cs +++ b/examples/DancingGoat/Models/WebPage/ProductsSection/ProductsSection.generated.cs @@ -11,24 +11,27 @@ using System; using System.Collections.Generic; +using CMS.ContentEngine; using CMS.Websites; namespace DancingGoat.Models { /// - /// Represents a page of type . + /// Represents a page of type . /// - public partial class PrivacyPage : IWebPageFieldsSource + [RegisterContentTypeMapping(CONTENT_TYPE_NAME)] + public partial class ProductsSection : IWebPageFieldsSource { /// /// Code name of the content type. /// - public const string CONTENT_TYPE_NAME = "DancingGoat.PrivacyPage"; + public const string CONTENT_TYPE_NAME = "DancingGoat.ProductsSection"; /// /// Represents system properties for a web page item. /// + [SystemField] public WebPageFields SystemFields { get; set; } } } \ No newline at end of file diff --git a/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs b/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs new file mode 100644 index 0000000..29ae013 --- /dev/null +++ b/examples/DancingGoat/Models/WebPage/SEOSchemaDataRetriever.cs @@ -0,0 +1,120 @@ +using Kentico.Content.Web.Mvc.PageBuilder; + +namespace DancingGoat.Models +{ + /// + /// Helper class for retrieving values from web page based view models which include reusable schema fields "SEO Fields". + /// + public static class SEOSchemaModelDataRetriever + { + /// + /// Returns value of title field from the given model. + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns null. + ///
+ /// View model. + public static string GetTitleValue(object model) + { + string title = null; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + title = webPageWithSEO.SEOFieldsTitle; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + title = basePageWithSEO.SEOFieldsTitle; + } + } + + return title; + } + + + /// + /// Returns value of description field from the given model. + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns null. + ///
+ /// Model + public static string GetDescriptionValue(object model) + { + string description = null; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + description = webPageWithSEO.SEOFieldsDescription; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + description = basePageWithSEO.SEOFieldsDescription; + } + } + + return description; + } + + + /// + /// Returns value of field from the given model."/> + /// + /// + /// View model must satisfy following requirements:
+ /// - is a page builder page based on class
+ /// - implements
+ /// - implements and its base page implements
+ /// In other cases the method returns false. + ///
+ /// Model + public static bool GetSearchIndexing(object model) + { + bool allowSearchIndexing = false; + + var viewModel = model; + if (viewModel is TemplateViewModel templateViewModel) + { + viewModel = templateViewModel.GetTemplateModel(); + } + + if (viewModel is ISEOFields webPageWithSEO) + { + allowSearchIndexing = webPageWithSEO.SEOFieldsAllowSearchIndexing; + } + else if (viewModel is IWebPageBasedViewModel webPageBasedViewModel) + { + if (webPageBasedViewModel.WebPage is ISEOFields basePageWithSEO) + { + allowSearchIndexing = basePageWithSEO.SEOFieldsAllowSearchIndexing; + } + } + + return allowSearchIndexing; + } + } +} diff --git a/examples/DancingGoat/PageTemplates/Article/_Article.cshtml b/examples/DancingGoat/PageTemplates/Article/_Article.cshtml index aa237cb..f95d123 100644 --- a/examples/DancingGoat/PageTemplates/Article/_Article.cshtml +++ b/examples/DancingGoat/PageTemplates/Article/_Article.cshtml @@ -1,6 +1,4 @@ -@using Kentico.Content.Web.Mvc.PageBuilder - -@using DancingGoat.PageTemplates +@using DancingGoat.PageTemplates @using DancingGoat.Models @model TemplateViewModel @@ -9,8 +7,6 @@ Layout = "~/Views/Shared/_DancingGoatLayout.cshtml"; var viewModel = Model.GetTemplateModel(); - ViewBag.Title = viewModel.Title; - var hasRelatedArticles = viewModel.RelatedArticles.Any(); } diff --git a/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml b/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml index 90d24c1..61441d9 100644 --- a/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml +++ b/examples/DancingGoat/PageTemplates/Article/_ArticleWithSidebar.cshtml @@ -1,6 +1,4 @@ -@using Kentico.Content.Web.Mvc.PageBuilder - -@using DancingGoat.PageTemplates +@using DancingGoat.PageTemplates @using DancingGoat.Widgets @using DancingGoat.Models @@ -13,8 +11,6 @@ // The page's content takes 12 points of width which are divided between the sidebar and the article var articleWidth = 9; var sidebardBootstrapWidth = 12 - articleWidth; - - ViewBag.Title = templateModel.Title; }
diff --git a/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml b/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml index 2e4ea7a..04e2820 100644 --- a/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml +++ b/examples/DancingGoat/PageTemplates/LandingPage/_DancingGoat_LandingPageSingleColumn.cshtml @@ -1,11 +1,10 @@ @using DancingGoat.PageTemplates @using DancingGoat.Helpers -@model ComponentViewModel +@model TemplateViewModel @{ Layout = "~/Views/Shared/_LandingPageLayout.cshtml"; - ViewBag.Title = HtmlLocalizer["Landing page"].Value; }
diff --git a/examples/DancingGoat/PageTemplates/_ViewImports.cshtml b/examples/DancingGoat/PageTemplates/_ViewImports.cshtml index d0f38c6..477580f 100644 --- a/examples/DancingGoat/PageTemplates/_ViewImports.cshtml +++ b/examples/DancingGoat/PageTemplates/_ViewImports.cshtml @@ -4,7 +4,7 @@ @using Kentico.Web.Mvc @using Kentico.Content.Web.Mvc -@using Kentico.PageBuilder.Web.Mvc +@using Kentico.Content.Web.Mvc.PageBuilder @using Microsoft.AspNetCore.Mvc.Localization diff --git a/examples/DancingGoat/Program.cs b/examples/DancingGoat/Program.cs index 6d85630..df487f1 100644 --- a/examples/DancingGoat/Program.cs +++ b/examples/DancingGoat/Program.cs @@ -1,3 +1,6 @@ +using System; +using System.Threading.Tasks; + using DancingGoat; using DancingGoat.Models; @@ -8,24 +11,21 @@ using Kentico.PageBuilder.Web.Mvc; using Kentico.Web.Mvc; -using Kentico.Xperience.Cloud; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.DependencyInjection; using DancingGoat.Search; -var builder = WebApplication.CreateBuilder(args); -builder.Services.AddXperienceCloudApplicationInsights(builder.Configuration); +var builder = WebApplication.CreateBuilder(args); -if (builder.Environment.IsQa() || builder.Environment.IsUat() || builder.Environment.IsProduction()) -{ - builder.Services.AddKenticoCloud(builder.Configuration); - builder.Services.AddXperienceCloudSendGrid(builder.Configuration); -} builder.Services.AddKentico(features => { @@ -73,10 +73,6 @@ app.UseAuthentication(); -if (builder.Environment.IsQa() || builder.Environment.IsUat() || builder.Environment.IsProduction()) -{ - app.UseKenticoCloud(); -} app.UseKentico(); @@ -110,8 +106,6 @@ } ); -app.MapControllers(); - app.Run(); diff --git a/examples/DancingGoat/Properties/launchSettings.json b/examples/DancingGoat/Properties/launchSettings.json index 0cb5bc0..1809696 100644 --- a/examples/DancingGoat/Properties/launchSettings.json +++ b/examples/DancingGoat/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:63328", + "applicationUrl": "http://localhost:15037", "sslPort": 0 } }, @@ -18,7 +18,7 @@ "DancingGoat": { "commandName": "Project", "launchBrowser": true, - "applicationUrl": "http://localhost:63328", + "applicationUrl": "http://localhost:15037", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/examples/DancingGoat/README.md b/examples/DancingGoat/README.md index 13de7bd..4428c25 100644 --- a/examples/DancingGoat/README.md +++ b/examples/DancingGoat/README.md @@ -1,7 +1,6 @@ # Xperience by Kentico: Dancing Goat Sample Project -This project implements a company website of a fictional coffee shop franchise with the aim of demonstrating -the content management and digital marketing features of the Xperience solution. +This project implements a company website of a fictional coffee shop franchise to demonstrate the Xperience solution's content management and digital marketing features. ## Installation and setup @@ -10,13 +9,25 @@ to troubleshoot any installation or configuration issues. ## Project notes -### Content type code files +### Content type and reusable field schema code files -[Content type](https://docs.xperience.io/x/gYHWCQ) code files under `./Models/Reusable` and `./Models/WebPage` are -generated using [code generators](https://docs.xperience.io/x/5IbWCQ) provided by Xperience. +[Content type](https://docs.xperience.io/x/gYHWCQ) and [reusable field schema](https://docs.xperience.io/x/D4_OD) code files under -If you add new content types or make changes to existing ones (e.g., add or remove fields), you can -run the following commands from the root of the Dancing Goat project: +- `./Models/Reusable` +- `./Models/WebPage` +- `./Models/Schema` + +are generated using Xperience's [code generators](https://docs.xperience.io/x/5IbWCQ). + +If you change the site's content model (add or remove fields, define new content types or schemas, etc.), you can run the following commands from the root of the Dancing Goat project to regenerate the files. + +For _reusable field schemas_: + +```powershell +dotnet run --no-build -- --kxp-codegen --location "./Models/Schema/" --type ReusableFieldSchemas --namespace "DancingGoat.Models" +``` + +This command regenerates the interfaces for all reusable field schemas in the project. Note that the specified `--namespace` must match the namespace where content type code files that reference the schemas are generated. You will get uncompilable code otherwise. For _reusable_ content types: @@ -26,7 +37,7 @@ dotnet run --no-build -- --kxp-codegen --location "./Models/Reusable/{name}/" -- This command generates code files for content types with the `DancingGoat` namespace under the `./Models/Reusable` directory. -You can use a similar approach for _page_ content types: +For _page_ content types: ```powershell dotnet run --no-build -- --kxp-codegen --location "./Models/WebPage/{name}/" --type PageContentTypes --include "DancingGoat.*" --namespace "DancingGoat.Models" @@ -34,4 +45,4 @@ dotnet run --no-build -- --kxp-codegen --location "./Models/WebPage/{name}/" --t This command generates code files for content types with the `DancingGoat` namespace under the `./Models/WebPage` directory. -You can of course adapt these example for use in projects with a different folder structure by modifying the `location` parameter accordingly. +You can adapt these examples for use in projects with a different folder structure by modifying the `location` parameter accordingly. diff --git a/examples/DancingGoat/Readme.txt b/examples/DancingGoat/Readme.txt deleted file mode 100644 index 2f558d0..0000000 --- a/examples/DancingGoat/Readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -This project provides a starting point for developing an Xperience by Kentico website, along with tools and configuration for deploying the site to the SaaS environment. - -For more information visit: -https://docs.xperience.io/x/IgKQC \ No newline at end of file diff --git a/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs b/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs index 61f7747..2b60a05 100644 --- a/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs +++ b/examples/DancingGoat/Search/AdvancedSearchIndexingStrategy.cs @@ -47,57 +47,54 @@ WebCrawlerService webCrawler } }; - public override async Task> MapToAlgoliaJObjectsOrNull(IIndexEventItemModel algoliaPageItem) + public override async Task?> MapToAlgoliaJObjectsOrNull(IIndexEventItemModel algoliaPageItem) { var resultProperties = new DancingGoatSearchResultModel(); // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields - if (algoliaPageItem is IndexEventWebPageItemModel indexedPage) + if (algoliaPageItem is not IndexEventWebPageItemModel indexedPage) { - if (string.Equals(algoliaPageItem.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + return null; + } + if (string.Equals(algoliaPageItem.ContentTypeName, ArticlePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + // The implementation of GetPage() is below + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + ArticlePage.CONTENT_TYPE_NAME); + + if (page is null) { - // The implementation of GetPage() is below - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - ArticlePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - resultProperties.SortableTitle = resultProperties.Title = page?.ArticleTitle ?? ""; - - string rawContent = await webCrawler.CrawlWebPage(page!); - resultProperties.Content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + return null; } - else if (string.Equals(algoliaPageItem.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + + resultProperties.SortableTitle = resultProperties.Title = page?.ArticleTitle ?? string.Empty; + + string rawContent = await webCrawler.CrawlWebPage(page!); + resultProperties.Content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + } + else if (string.Equals(algoliaPageItem.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + HomePage.CONTENT_TYPE_NAME); + + if (page is null) { - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - HomePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - if (page.HomePageBanner.IsNullOrEmpty()) - { - return null; - } - - resultProperties.Title = page!.HomePageBanner.First().BannerHeaderText; + return null; } - else + + if (page.HomePageBanner.IsNullOrEmpty()) { return null; } + + resultProperties.Title = page!.HomePageBanner.First().BannerHeaderText; } else { diff --git a/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs b/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs index 59306ca..dca5211 100644 --- a/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs +++ b/examples/DancingGoat/Search/DancingGoatSearchStartupExtensions.cs @@ -10,6 +10,7 @@ public static IServiceCollection AddKenticoAlgoliaServices(this IServiceCollecti services.AddKenticoAlgolia(builder => { builder.RegisterStrategy("DancingGoatAdvancedExampleStrategy"); builder.RegisterStrategy("DancingGoatMinimalExampleStrategy"); + builder.RegisterStrategy(nameof(ReusableContentItemsIndexingStrategy)); }, configuration); services.AddHttpClient(); diff --git a/examples/DancingGoat/Search/Models/DancingGoatSearchResultModel.cs b/examples/DancingGoat/Search/Models/DancingGoatSearchResultModel.cs index 9a8d4b9..192efd3 100644 --- a/examples/DancingGoat/Search/Models/DancingGoatSearchResultModel.cs +++ b/examples/DancingGoat/Search/Models/DancingGoatSearchResultModel.cs @@ -4,7 +4,7 @@ namespace DancingGoat.Search.Models; public class DancingGoatSearchResultModel : AlgoliaSearchResultModel { - public string Title { get; set; } - public string SortableTitle { get; set; } - public string Content { get; set; } + public string Title { get; set; } = string.Empty; + public string SortableTitle { get; set; } = string.Empty; + public string Content { get; set; } = string.Empty; } diff --git a/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs b/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs new file mode 100644 index 0000000..c7d2f5e --- /dev/null +++ b/examples/DancingGoat/Search/ReusableContentItemsIndexingStrategy.cs @@ -0,0 +1,141 @@ +using Algolia.Search.Models.Settings; + +using CMS.ContentEngine; +using CMS.Websites; + +using DancingGoat.Models; +using DancingGoat.Search.Models; +using DancingGoat.Search.Services; + +using Kentico.Xperience.Algolia.Indexing; +using Kentico.Xperience.Algolia.Search; + +using Newtonsoft.Json.Linq; + +namespace DancingGoat.Search; + +public class ReusableContentItemsIndexingStrategy : DefaultAlgoliaIndexingStrategy +{ + public const string SORTABLE_TITLE_FIELD_NAME = "SortableTitle"; + + private readonly IWebPageQueryResultMapper webPageMapper; + private readonly IContentQueryExecutor queryExecutor; + private readonly IWebPageUrlRetriever urlRetriever; + private readonly WebScraperHtmlSanitizer htmlSanitizer; + private readonly WebCrawlerService webCrawler; + + public const string FACET_DIMENSION = "ContentType"; + public const string INDEXED_WEBSITECHANNEL_NAME = "DancingGoatPages"; + public const string CRAWLER_CONTENT_FIELD_NAME = "Content"; + + public ReusableContentItemsIndexingStrategy( + IWebPageQueryResultMapper webPageMapper, + IContentQueryExecutor queryExecutor, + IWebPageUrlRetriever urlRetriever, + WebScraperHtmlSanitizer htmlSanitizer, + WebCrawlerService webCrawler + ) + { + this.urlRetriever = urlRetriever; + this.webPageMapper = webPageMapper; + this.queryExecutor = queryExecutor; + this.htmlSanitizer = htmlSanitizer; + this.webCrawler = webCrawler; + } + + public override IndexSettings GetAlgoliaIndexSettings() => new() + { + AttributesToRetrieve = new List + { + nameof(DancingGoatSearchResultModel.Title), + nameof(DancingGoatSearchResultModel.SortableTitle), + nameof(DancingGoatSearchResultModel.Content) + }, + AttributesForFaceting = new List + { + nameof(DancingGoatSearchResultModel.ContentTypeName) + } + }; + + public override async Task?> MapToAlgoliaJObjectsOrNull(IIndexEventItemModel algoliaPageItem) + { + var resultProperties = new DancingGoatSearchResultModel(); + + // IIndexEventItemModel could be a reusable content item or a web page item, so we use + // pattern matching to get access to the web page item specific type and fields + if (algoliaPageItem is not IndexEventReusableItemModel indexedItem) + { + return null; + } + if (string.Equals(algoliaPageItem.ContentTypeName, Banner.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + var query = new ContentItemQueryBuilder() + .ForContentType(HomePage.CONTENT_TYPE_NAME, + config => + config + .WithLinkedItems(4) + // Because the changedItem is a reusable content item, we don't have a website channel name to use here + // so we use a hardcoded channel name. + .ForWebsite(INDEXED_WEBSITECHANNEL_NAME) + // Retrieves all HomePages that link to the Banner through the HomePage.HomePageBanner field + .Linking(nameof(HomePage.HomePageBanner), new[] { indexedItem.ItemID })) + .InLanguage(indexedItem.LanguageName); + + var associatedWebPageItem = (await queryExecutor.GetWebPageResult(query, webPageMapper.Map)).First(); + string url = string.Empty; + try + { + url = (await urlRetriever.Retrieve(associatedWebPageItem.SystemFields.WebPageItemTreePath, + INDEXED_WEBSITECHANNEL_NAME, indexedItem.LanguageName)).RelativePath; + } + catch (Exception) + { + // Retrieve can throw an exception when processing a page update LuceneQueueItem + // and the page was deleted before the update task has processed. In this case, return no item. + return null; + } + + //If the indexed item is a reusable content item, we need to set the url manually. + resultProperties.Url = url; + resultProperties.SortableTitle = resultProperties.Title = associatedWebPageItem!.HomePageBanner.First().BannerText; + string rawContent = await webCrawler.CrawlWebPage(associatedWebPageItem!); + resultProperties.Content = htmlSanitizer.SanitizeHtmlDocument(rawContent); + + //If the indexed item is a reusable content item, we need to set the url manually. + var result = new List() + { + AssignProperties(resultProperties) + }; + + return result; + } + else + { + return null; + } + } + + private JObject AssignProperties(T value) where T : AlgoliaSearchResultModel + { + var jObject = new JObject(); + + foreach (var prop in value.GetType().GetProperties()) + { + var type = prop.PropertyType; + if (type == typeof(string)) + { + jObject[prop.Name] = prop.GetValue(value) as string; + } + else if (type == typeof(int)) + { + jObject[prop.Name] = (int?)prop.GetValue(value) ?? 0; + } + else if (type == typeof(bool)) + { + jObject[prop.Name] = (bool?)prop.GetValue(value) ?? false; + } + } + + return jObject; + } +} diff --git a/examples/DancingGoat/Search/Services/WebCrawlerService.cs b/examples/DancingGoat/Search/Services/WebCrawlerService.cs index c4af3e5..133d948 100644 --- a/examples/DancingGoat/Search/Services/WebCrawlerService.cs +++ b/examples/DancingGoat/Search/Services/WebCrawlerService.cs @@ -43,7 +43,7 @@ public async Task CrawlWebPage(IWebPageFieldsSource page) ex, $"Tree Path: {page.SystemFields.WebPageItemTreePath}"); } - return ""; + return string.Empty; } public async Task CrawlPage(string url) @@ -61,6 +61,6 @@ public async Task CrawlPage(string url) ex, $"Url: {url}"); } - return ""; + return string.Empty; } } diff --git a/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs b/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs index da935d6..473e19e 100644 --- a/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs +++ b/examples/DancingGoat/Search/Services/WebScraperHtmlSanitizer.cs @@ -53,8 +53,8 @@ public virtual string SanitizeHtmlDocument(string htmlContent) textContent = HTMLHelper.RegexHtmlToTextWhiteSpace.Replace(textContent, " "); textContent = textContent.Trim(); - string title = doc.Head?.QuerySelector("title")?.TextContent ?? ""; - string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? ""; + string title = doc.Head?.QuerySelector("title")?.TextContent ?? string.Empty; + string description = doc.Head?.QuerySelector("meta[name='description']")?.GetAttribute("content") ?? string.Empty; return string.Join( " ", diff --git a/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs b/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs index 30ab833..0dac327 100644 --- a/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs +++ b/examples/DancingGoat/Search/SimpleSearchIndexingStrategy.cs @@ -32,40 +32,37 @@ public override IndexSettings GetAlgoliaIndexSettings() => } }; - public override async Task> MapToAlgoliaJObjectsOrNull(IIndexEventItemModel algoliaPageItem) + public override async Task?> MapToAlgoliaJObjectsOrNull(IIndexEventItemModel algoliaPageItem) { var result = new List(); - string title = ""; + string title; // IIndexEventItemModel could be a reusable content item or a web page item, so we use // pattern matching to get access to the web page item specific type and fields - if (algoliaPageItem is IndexEventWebPageItemModel indexedPage) + if (algoliaPageItem is not IndexEventWebPageItemModel indexedPage) { - if (string.Equals(algoliaPageItem.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + return null; + } + if (string.Equals(algoliaPageItem.ContentTypeName, HomePage.CONTENT_TYPE_NAME, StringComparison.OrdinalIgnoreCase)) + { + var page = await GetPage( + indexedPage.ItemGuid, + indexedPage.WebsiteChannelName, + indexedPage.LanguageName, + HomePage.CONTENT_TYPE_NAME); + + if (page is null) { - var page = await GetPage( - indexedPage.ItemGuid, - indexedPage.WebsiteChannelName, - indexedPage.LanguageName, - HomePage.CONTENT_TYPE_NAME); - - if (page is null) - { - return null; - } - - if (page.HomePageBanner.IsNullOrEmpty()) - { - return null; - } - - title = page!.HomePageBanner.First().BannerHeaderText; + return null; } - else + + if (page.HomePageBanner.IsNullOrEmpty()) { return null; } + + title = page!.HomePageBanner.First().BannerHeaderText; } else { diff --git a/examples/DancingGoat/Services/IServiceCollectionExtensions.cs b/examples/DancingGoat/Services/IServiceCollectionExtensions.cs index 0d8c542..7a92104 100644 --- a/examples/DancingGoat/Services/IServiceCollectionExtensions.cs +++ b/examples/DancingGoat/Services/IServiceCollectionExtensions.cs @@ -14,7 +14,7 @@ public static void AddDancingGoatServices(this IServiceCollection services) { AddViewComponentServices(services); AddRepositories(services); - + services.AddSingleton(); } @@ -27,10 +27,15 @@ private static void AddRepositories(IServiceCollection services) services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); } diff --git a/examples/DancingGoat/StorageInitializationModule.cs b/examples/DancingGoat/StorageInitializationModule.cs deleted file mode 100644 index 8e2cbf0..0000000 --- a/examples/DancingGoat/StorageInitializationModule.cs +++ /dev/null @@ -1,98 +0,0 @@ -using CMS; -using CMS.Core; -using CMS.DataEngine; -using CMS.IO; - -using DancingGoat; - -using Kentico.Xperience.AzureStorage; -using Kentico.Xperience.Cloud; - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; - -// Registers the storage module into the system -[assembly: RegisterModule(typeof(StorageInitializationModule))] - -namespace DancingGoat -{ - public class StorageInitializationModule : Module - { - /// - /// Local directory used for deployment of blob storage contents. - /// - private const string LOCAL_STORAGE_ASSETS_DIRECTORY_NAME = "$StorageAssets"; - - - /// - /// Default container name within the blob storage. - /// - private const string CONTAINER_NAME = "default"; - - - private IWebHostEnvironment mEnvironment; - - - /// - /// Gets the web hosting environment information. - /// - public IWebHostEnvironment Environment - { - get - { - return mEnvironment ??= Service.Resolve(); - } - } - - - // Module class constructor, the system registers the module - public StorageInitializationModule() - : base(nameof(StorageInitializationModule)) - { - } - - - // Contains initialization code that is executed when the application starts - protected override void OnInit() - { - base.OnInit(); - - if (Environment.IsQa() || Environment.IsUat() || Environment.IsProduction()) - { - // Maps the assets directory (e.g. media files) to the Azure storage provider - MapAzureStoragePath($"~/assets/"); - MapAzureStoragePath($"~/BizFormFiles"); - } - else - { - // Maps contents of the assets directory which are not handled by the CD tool (media files) - // to the dedicated local folder. - MapLocalStoragePath($"~/assets/media"); - } - } - - - private void MapAzureStoragePath(string path) - { - // Creates a new StorageProvider instance for Azure - var provider = AzureStorageProvider.Create(); - - // Specifies the target container - provider.CustomRootPath = CONTAINER_NAME; - provider.PublicExternalFolderObject = false; - - StorageHelper.MapStoragePath(path, provider); - } - - - private void MapLocalStoragePath(string path) - { - // Creates a new StorageProvider instance for local storage - var provider = StorageProvider.CreateFileSystemStorageProvider(); - - provider.CustomRootPath = $"{LOCAL_STORAGE_ASSETS_DIRECTORY_NAME}/{CONTAINER_NAME}"; - - StorageHelper.MapStoragePath(path, provider); - } - } -} diff --git a/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml b/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml index 5a8e750..3b97fc0 100644 --- a/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatArticle/Index.cshtml @@ -1,14 +1,13 @@ @using Microsoft.AspNetCore.Mvc.Localization -@model IEnumerable +@model DancingGoat.Models.ArticlesSectionViewModel @{ - ViewBag.Title = HtmlLocalizer["Articles"].Value; var i = 1; }
- @foreach (var article in @Model) + @foreach (var article in @Model.Articles) { var lastInRow = ""; if (i % 4 == 0) diff --git a/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml b/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml new file mode 100644 index 0000000..bf29fe6 --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatCoffee/Detail.cshtml @@ -0,0 +1,41 @@ +@using DancingGoat.Models + +@model CoffeeDetailViewModel; + +@{ + ViewData["PageClass"] = "inverted"; + ViewData["Title"] = Model.Name; +} + +
+
+
+
+

@Model.Name

+
+
+
+ +
+ @foreach (var item in Model.Processing.Union(Model.Tastes)) + { +
+ @item.Title +
+ } +
+ +
+
+ @if (!string.IsNullOrEmpty(Model.ImageUrl)) + { +
+ @Model.Name +
+ } +
+ @Html.Raw(Model.Description) +
+
+
+
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml b/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml index cba0d3b..41cd2c1 100644 --- a/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatConfirmation/Index.cshtml @@ -2,10 +2,6 @@ @using System.Linq; -@{ - ViewBag.Title = Model.Title; -} -

@Model.Header

diff --git a/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml b/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml index f39c4cb..56f62cb 100644 --- a/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatContacts/Index.cshtml @@ -1,9 +1,5 @@ @model DancingGoat.Models.ContactsIndexViewModel -@{ - ViewBag.Title = HtmlLocalizer["Contacts"].Value; -} -
diff --git a/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml b/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml new file mode 100644 index 0000000..67c293f --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatGrinder/Detail.cshtml @@ -0,0 +1,41 @@ +@using DancingGoat.Models + +@model GrinderDetailViewModel; + +@{ + ViewData["PageClass"] = "inverted"; + ViewData["Title"] = Model.Name; +} + +
+
+
+
+

@Model.Name

+
+
+
+ +
+ @foreach (var item in Model.Manufacturers.Union(Model.Type)) + { +
+ @item.Title +
+ } +
+ +
+
+ @if (!string.IsNullOrEmpty(Model.ImageUrl)) + { +
+ @Model.Name +
+ } +
+ @Html.Raw(Model.Description) +
+
+
+
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml b/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml index 437e6a6..e35a96a 100644 --- a/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatHome/Index.cshtml @@ -2,10 +2,6 @@ @using System.Linq; -@{ - ViewData["Title"] = @HtmlLocalizer["Home"]; -} - @if (Model.Banner != null) { diff --git a/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml b/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml index 91e18de..60e9381 100644 --- a/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml +++ b/examples/DancingGoat/Views/DancingGoatPrivacy/Index.cshtml @@ -2,7 +2,6 @@ @{ ViewData["PageClass"] = "inverted no-bg"; - ViewBag.Title = HtmlLocalizer["Privacy"].Value; }
diff --git a/examples/DancingGoat/Views/DancingGoatProduct/Filter.cshtml b/examples/DancingGoat/Views/DancingGoatProduct/Filter.cshtml new file mode 100644 index 0000000..3c00982 --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatProduct/Filter.cshtml @@ -0,0 +1,15 @@ +@using DancingGoat.Models + +@model Dictionary + +
+ @Html.Kentico().PageData() + + @foreach (var key in Model.Keys) + { +

@HtmlLocalizer[Model[key].Name]

+ @Html.HiddenFor(m => Model[key].Name) + @Html.HiddenFor(m => Model[key].CodeName) + @Html.EditorFor(model => model[key].Tags) + } +
\ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatProduct/Index.cshtml b/examples/DancingGoat/Views/DancingGoatProduct/Index.cshtml new file mode 100644 index 0000000..ef6134c --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatProduct/Index.cshtml @@ -0,0 +1,29 @@ +@using DancingGoat.Models + +@model ProductListViewModel + +@{ + ViewData["PageClass"] = "inverted"; +} + +
+
+
+ + +
+ +
+
+
+
+ +@section Scripts { + + + +} \ No newline at end of file diff --git a/examples/DancingGoat/Views/DancingGoatProduct/ProductsList.cshtml b/examples/DancingGoat/Views/DancingGoatProduct/ProductsList.cshtml new file mode 100644 index 0000000..c2b1902 --- /dev/null +++ b/examples/DancingGoat/Views/DancingGoatProduct/ProductsList.cshtml @@ -0,0 +1,18 @@ +@using DancingGoat.Models + +@model IEnumerable + +@if (Model.Any()) +{ + foreach (var product in Model) + { + +
+ @Html.DisplayFor(m => product, "ProductListItem") +
+ } +} +else +{ + +} \ No newline at end of file diff --git a/examples/DancingGoat/Views/Search/Index.cshtml b/examples/DancingGoat/Views/Search/Index.cshtml deleted file mode 100644 index 14a3d5a..0000000 --- a/examples/DancingGoat/Views/Search/Index.cshtml +++ /dev/null @@ -1,98 +0,0 @@ -@using Kentico.Xperience.Algolia.Search -@using Algolia.Search.Models.Search -@using DancingGoat.Search -@using Microsoft.AspNetCore.Mvc.Localization -@using DancingGoat.Search.Models - -@model SearchResponse -@{ - Dictionary GetRouteData(int page) => - new Dictionary() { { "query", Model.Query }, { "pageSize", Model.ToString() }, { "page", page.ToString() } }; -} - -

Search

- - - -
-
-
-
-
-
- -
- - -
-
-
-
- - -
-
-
- -@if (!Model.Hits.Any()) -{ - if (!String.IsNullOrWhiteSpace(Model.Query)) - { - @HtmlLocalizer["Sorry, no results match {0}", Model.Query] - } - - return; -} - -@foreach (var item in Model.Hits) -{ -
-

- @item.Title -

-
-} - -
- -
diff --git a/examples/DancingGoat/Views/Search/Simple.cshtml b/examples/DancingGoat/Views/Search/Simple.cshtml deleted file mode 100644 index 202798d..0000000 --- a/examples/DancingGoat/Views/Search/Simple.cshtml +++ /dev/null @@ -1,98 +0,0 @@ -@using Kentico.Xperience.Algolia.Search -@using Algolia.Search.Models.Search -@using DancingGoat.Search -@using Microsoft.AspNetCore.Mvc.Localization -@using DancingGoat.Search.Models - -@model SearchResponse -@{ - Dictionary GetRouteData(int page) => - new Dictionary() { { "query", Model.Query }, { "pageSize", Model.ToString() }, { "page", page.ToString() } }; -} - -

Search

- - - -
-
-
-
-
-
- -
- - -
-
-
-
- - -
-
-
- -@if (!Model.Hits.Any()) -{ - if (!String.IsNullOrWhiteSpace(Model.Query)) - { - @HtmlLocalizer["Sorry, no results match {0}", Model.Query] - } - - return; -} - -@foreach (var item in Model.Hits) -{ -
-

- @item.Title -

-
-} - -
- -
diff --git a/examples/DancingGoat/Views/Shared/DisplayTemplates/ProductListItem.cshtml b/examples/DancingGoat/Views/Shared/DisplayTemplates/ProductListItem.cshtml new file mode 100644 index 0000000..27684d0 --- /dev/null +++ b/examples/DancingGoat/Views/Shared/DisplayTemplates/ProductListItem.cshtml @@ -0,0 +1,15 @@ +@using DancingGoat.Models + +@model ProductListItemViewModel + + \ No newline at end of file diff --git a/examples/DancingGoat/Views/Shared/EditorTemplates/TagViewModel.cshtml b/examples/DancingGoat/Views/Shared/EditorTemplates/TagViewModel.cshtml new file mode 100644 index 0000000..f7022bd --- /dev/null +++ b/examples/DancingGoat/Views/Shared/EditorTemplates/TagViewModel.cshtml @@ -0,0 +1,10 @@ +@using DancingGoat.Models + +@model TagViewModel + +@Html.HiddenFor(m => Model.Value) +@Html.HiddenFor(m => Model.Name) + + + + \ No newline at end of file diff --git a/examples/DancingGoat/Views/Shared/_DancingGoatLayout.cshtml b/examples/DancingGoat/Views/Shared/_DancingGoatLayout.cshtml index 609db2e..31201d1 100644 --- a/examples/DancingGoat/Views/Shared/_DancingGoatLayout.cshtml +++ b/examples/DancingGoat/Views/Shared/_DancingGoatLayout.cshtml @@ -1,24 +1,26 @@ -@using CMS.Websites.Routing; -@using CMS.Websites; -@using Kentico.Content.Web.Mvc.Routing; +@using CMS.Websites.Routing +@using CMS.Websites +@using Kentico.Activities.Web.Mvc +@using Kentico.Content.Web.Mvc.PageBuilder +@using Kentico.Content.Web.Mvc.Routing @using Kentico.Forms.Web.Mvc.Widgets @using Kentico.Xperience.Admin.Base.Forms @using DancingGoat.Controllers -@using DancingGoat.Models; +@using DancingGoat.Models @using DancingGoat.ViewComponents -@using Kentico.Activities.Web.Mvc -@inject HomePageRepository homepageRepository; @inject IWebPageUrlRetriever webPageUrlRetriever; @inject IPreferredLanguageRetriever currentLanguageRetriever; @inject IWebsiteChannelContext websiteChannelContext; +@model object; + @{ const string ENGLISH = "English"; const string ESPANOL = "Español"; var language = currentLanguageRetriever.Get(); - + var homePageUrl = (await webPageUrlRetriever.Retrieve(DancingGoatConstants.HOME_PAGE_PATH, websiteChannelContext.WebsiteChannelName, language)).RelativePath; var routeDataLanguage = Convert.ToString(@ViewContext.RouteData.Values[WebPageRoutingOptions.LANGUAGE_ROUTE_VALUE_KEY]); @@ -29,6 +31,14 @@ SelectedForm = new List { new() { ObjectCodeName = "DancingGoatSubscription" } }, AfterSubmitDisplayText = HtmlLocalizer["Thank you for subscribing! Now we just need to confirm your email address - please click the link in the email we sent you. Thanks!"].Value }; + + string title = ViewBag.Title; + if (title == null) + { + title = SEOSchemaModelDataRetriever.GetTitleValue(Model); + } + + string description = SEOSchemaModelDataRetriever.GetDescriptionValue(Model); } @@ -37,9 +47,17 @@ + @if (!SEOSchemaModelDataRetriever.GetSearchIndexing(Model)) + { + + } + @if (!string.IsNullOrEmpty(description)) + { + + } - @ViewBag.Title - Dancing Goat + @title @RenderSection("styles", required: false) @Html.Kentico().ActivityLoggingScriptV2() diff --git a/examples/DancingGoat/Views/Shared/_LandingPageLayout.cshtml b/examples/DancingGoat/Views/Shared/_LandingPageLayout.cshtml index 0af8542..e19f04d 100644 --- a/examples/DancingGoat/Views/Shared/_LandingPageLayout.cshtml +++ b/examples/DancingGoat/Views/Shared/_LandingPageLayout.cshtml @@ -1,8 +1,21 @@ @using Kentico.Activities.Web.Mvc @using Kentico.OnlineMarketing.Web.Mvc +@using DancingGoat.Models +@using DancingGoat.PageTemplates + +@model TemplateViewModel @{ Layout = null; + + object templateModel = Model.GetTemplateModel(); + string title = ViewBag.Title; + if (title == null) + { + title = SEOSchemaModelDataRetriever.GetTitleValue(templateModel); + } + + string description = SEOSchemaModelDataRetriever.GetDescriptionValue(templateModel); } @@ -10,10 +23,19 @@ + @if (!SEOSchemaModelDataRetriever.GetSearchIndexing(Model.GetTemplateModel())) + { + + } + @if (!string.IsNullOrEmpty(description)) + { + + } - @ViewBag.Title - Dancing Goat + @title + @Html.Kentico().ActivityLoggingScriptV2()
diff --git a/examples/DancingGoat/Views/_ViewImports.cshtml b/examples/DancingGoat/Views/_ViewImports.cshtml index 81d68bb..dd9ae51 100644 --- a/examples/DancingGoat/Views/_ViewImports.cshtml +++ b/examples/DancingGoat/Views/_ViewImports.cshtml @@ -4,6 +4,7 @@ @using Kentico.Web.Mvc @using Kentico.Content.Web.Mvc +@using Kentico.Content.Web.Mvc.PageBuilder @using Kentico.PageBuilder.Web.Mvc @using Microsoft.AspNetCore.Mvc.Localization @@ -12,7 +13,5 @@ @addTagHelper *, Kentico.Content.Web.Mvc @addTagHelper *, Kentico.Web.Mvc @addTagHelper *, DancingGoat -@addTagHelper *, CloudWebSite @inject IHtmlLocalizer HtmlLocalizer -@inject Microsoft.ApplicationInsights.AspNetCore.JavaScriptSnippet ApplicationInsightsSnippet diff --git a/examples/DancingGoat/appsettings.json b/examples/DancingGoat/appsettings.json index b137029..4460c8a 100644 --- a/examples/DancingGoat/appsettings.json +++ b/examples/DancingGoat/appsettings.json @@ -14,13 +14,13 @@ }, "AllowedHosts": "*", "ConnectionStrings": { - "CMSConnectionString": "" + "CMSConnectionString": "Data Source=GIGACHAD;Initial Catalog=xperience-algolia;Integrated Security=True;Persist Security Info=False;Connect Timeout=60;Encrypt=False;Current Language=English;" }, - "CMSHashStringSalt": "sal", - "WebCrawlerBaseUrl": "http://localhost:63328", + "CMSHashStringSalt": "s", + "WebCrawlerBaseUrl": "http://localhost:15037", "CMSAlgoliaSearch": { - "ApplicationId": "", - "ApiKey": "", - "SearchKey": "" + "ApplicationId": "Q2YK718J0J", + "ApiKey": "e394c4ceb17da01378f6924ab603c5f1", + "SearchKey": "7f14c628ce271806397ca4cae3b71e16" } } \ No newline at end of file diff --git a/examples/DancingGoat/assets/ContentItems/1e/1efd72c9-f3ff-4fbf-ac90-f18b7fe7b40e/cc721195-df8f-4799-b974-5ade63036cab/510968cb-ef94-433c-ac43-2ae7679e92d4.jpg b/examples/DancingGoat/assets/ContentItems/1e/1efd72c9-f3ff-4fbf-ac90-f18b7fe7b40e/cc721195-df8f-4799-b974-5ade63036cab/510968cb-ef94-433c-ac43-2ae7679e92d4.jpg new file mode 100644 index 0000000..e904d39 Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/1e/1efd72c9-f3ff-4fbf-ac90-f18b7fe7b40e/cc721195-df8f-4799-b974-5ade63036cab/510968cb-ef94-433c-ac43-2ae7679e92d4.jpg differ diff --git a/examples/DancingGoat/assets/ContentItems/60/60771371-3371-42cd-a101-8ffb6d90f318/cc721195-df8f-4799-b974-5ade63036cab/a0fee33a-d7bc-4f4e-ad0b-5154e0c131b3.jpg b/examples/DancingGoat/assets/ContentItems/60/60771371-3371-42cd-a101-8ffb6d90f318/cc721195-df8f-4799-b974-5ade63036cab/a0fee33a-d7bc-4f4e-ad0b-5154e0c131b3.jpg new file mode 100644 index 0000000..e904d39 Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/60/60771371-3371-42cd-a101-8ffb6d90f318/cc721195-df8f-4799-b974-5ade63036cab/a0fee33a-d7bc-4f4e-ad0b-5154e0c131b3.jpg differ diff --git a/examples/DancingGoat/assets/ContentItems/8a/8a4b970a-99d0-404a-8e9c-82a188731328/cc721195-df8f-4799-b974-5ade63036cab/12d13cb4-6639-4166-9de1-8a1377cc840d.jpg b/examples/DancingGoat/assets/ContentItems/8a/8a4b970a-99d0-404a-8e9c-82a188731328/cc721195-df8f-4799-b974-5ade63036cab/12d13cb4-6639-4166-9de1-8a1377cc840d.jpg new file mode 100644 index 0000000..f99a72b Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/8a/8a4b970a-99d0-404a-8e9c-82a188731328/cc721195-df8f-4799-b974-5ade63036cab/12d13cb4-6639-4166-9de1-8a1377cc840d.jpg differ diff --git a/examples/DancingGoat/assets/ContentItems/da/da0f6058-65b8-48d1-838d-b4d164839cb9/cc721195-df8f-4799-b974-5ade63036cab/390a5c69-11e2-41f0-9cb0-a716af074393.jpg b/examples/DancingGoat/assets/ContentItems/da/da0f6058-65b8-48d1-838d-b4d164839cb9/cc721195-df8f-4799-b974-5ade63036cab/390a5c69-11e2-41f0-9cb0-a716af074393.jpg new file mode 100644 index 0000000..a5eacfd Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/da/da0f6058-65b8-48d1-838d-b4d164839cb9/cc721195-df8f-4799-b974-5ade63036cab/390a5c69-11e2-41f0-9cb0-a716af074393.jpg differ diff --git a/examples/DancingGoat/assets/ContentItems/dd/dde0b153-206f-4adc-924a-8d6e16a7df9e/cc721195-df8f-4799-b974-5ade63036cab/6af2458f-e1b7-4d0c-b0aa-769f0e677551.jpg b/examples/DancingGoat/assets/ContentItems/dd/dde0b153-206f-4adc-924a-8d6e16a7df9e/cc721195-df8f-4799-b974-5ade63036cab/6af2458f-e1b7-4d0c-b0aa-769f0e677551.jpg new file mode 100644 index 0000000..a5eacfd Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/dd/dde0b153-206f-4adc-924a-8d6e16a7df9e/cc721195-df8f-4799-b974-5ade63036cab/6af2458f-e1b7-4d0c-b0aa-769f0e677551.jpg differ diff --git a/examples/DancingGoat/assets/ContentItems/fe/fe59453e-5e59-422f-97b7-0da25ac54354/cc721195-df8f-4799-b974-5ade63036cab/c7037ecc-202b-423a-bce7-12d010eb7c2f.jpg b/examples/DancingGoat/assets/ContentItems/fe/fe59453e-5e59-422f-97b7-0da25ac54354/cc721195-df8f-4799-b974-5ade63036cab/c7037ecc-202b-423a-bce7-12d010eb7c2f.jpg new file mode 100644 index 0000000..f99a72b Binary files /dev/null and b/examples/DancingGoat/assets/ContentItems/fe/fe59453e-5e59-422f-97b7-0da25ac54354/cc721195-df8f-4799-b974-5ade63036cab/c7037ecc-202b-423a-bce7-12d010eb7c2f.jpg differ diff --git a/examples/DancingGoat/packages.lock.json b/examples/DancingGoat/packages.lock.json index ecc8416..b291362 100644 --- a/examples/DancingGoat/packages.lock.json +++ b/examples/DancingGoat/packages.lock.json @@ -4,66 +4,66 @@ "net6.0": { "Kentico.Xperience.Admin": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "0PZqIlNEjpE5GHPtTMHzd5KkO428oRJlYEDx2YmLLYkm+UDMsRIwaS91UtmZTP5FYlDzv7yq0zgB4hqbcdsZTA==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "B1vIV5IO5CdFCQeB1G1tO6We54hwZO1HJFwDs79uniA7sioqx+LOYHNkhprbvRibhDN1eDXMgeIWgG2l0BRoPA==", "dependencies": { "Kentico.Aira.Client": "1.0.25", - "Kentico.Xperience.WebApp": "[29.0.0]", - "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.29", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29" + "Kentico.Xperience.WebApp": "[29.5.0]", + "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.33", + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33" } }, "Kentico.Xperience.AzureStorage": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "oss8WcxBjJpkg8WiaOmAUUViNp++9GgpNQixnAvYtwbHG96nGobMiakkwecYOcnHe9cj4KggkbS1d6LyXpVFpw==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "4UWyIknuZT/CTrLW9F581vXHE+1yhPHd+8w1ohjaBkn3xkg/BKfwHSau86vFTn//ZZmgP2csrPerapd/Uiw99Q==", "dependencies": { - "Azure.Storage.Blobs": "12.19.1", - "Azure.Storage.Queues": "12.17.1", - "Kentico.Xperience.Core": "29.0.0", + "Azure.Storage.Blobs": "12.21.2", + "Azure.Storage.Queues": "12.19.1", + "Kentico.Xperience.Core": "29.5.0", "Newtonsoft.Json": "13.0.3" } }, "Kentico.Xperience.Cloud": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "JV1xwgJm9evmw/eh+LT6q9lbqeTZqlCh//xz2HNoaMcsO7vZeUMacSEqw6pKputsAx32KDvJEWIIqWwoBeRrcA==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "jAohyyUmxtmf7qh8veO6AnkqZ/bRIw8TRZDCkMy2ESuDbBT2OZuh1Nw6WeZMG8K1KeTp46emw0a3gWsXSsCsbA==", "dependencies": { - "Kentico.Xperience.AzureStorage": "29.0.0", - "Kentico.Xperience.Core": "29.0.0", - "Kentico.Xperience.SendGrid": "29.0.0", - "Microsoft.ApplicationInsights.AspNetCore": "2.22.0", - "Microsoft.Extensions.Hosting.Abstractions": "6.0.0" + "Kentico.Xperience.AzureStorage": "29.5.0", + "Kentico.Xperience.Core": "29.5.0", + "Kentico.Xperience.SendGrid": "29.5.0", + "Kentico.Xperience.WebApp": "29.5.0", + "Microsoft.ApplicationInsights.AspNetCore": "2.22.0" } }, "Kentico.Xperience.ImageProcessing": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "aXsCEfvnEpPQQn3wQGwC51f6WT3O5NZzcjReTBSmCCYraHPF87aoqSz+VKS1MI8Pj9u4i1Vt1bRcCC/zrlYJYQ==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "6PxMr63TwZwxZ7SE/U1GB54YQRUC9S+ZsE8LTS42+knDhwdbWd04qHRDdraLr1BGEjeR2OIV4Ms2omyehb0UXw==", "dependencies": { - "Kentico.Xperience.Core": "29.0.0", + "Kentico.Xperience.Core": "29.5.0", "SkiaSharp": "2.88.8", "SkiaSharp.NativeAssets.Linux.NoDependencies": "2.88.8" } }, "Kentico.Xperience.WebApp": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "LXTK6WPoEThc+K2cSGa3GbKg1Zute0tjELazK6JURnGEF7xdoRiVE8ty6WeWFxmK6Cd+FwId10Q49C6SXlLL2A==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "3wGJZRGyyO4iDJTeeB8KSa+nZaFMPJhCxXhlxPHJ+0ukaJiJL09MhbJO5oDu1xCyZX59jv4te2IVbAmlvIKDDw==", "dependencies": { "CommandLineParser": "2.9.1", - "HotChocolate.AspNetCore": "13.9.0", - "HotChocolate.Data": "13.9.0", - "HtmlSanitizer": "8.0.843", - "Kentico.Xperience.Core": "[29.0.0]", + "HotChocolate.AspNetCore": "13.9.12", + "HotChocolate.Data": "13.9.12", + "HtmlSanitizer": "8.1.870", + "Kentico.Xperience.Core": "[29.5.0]", "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29", - "Microsoft.Extensions.Localization": "6.0.29" + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33", + "Microsoft.Extensions.Localization": "6.0.33" } }, "SonarAnalyzer.CSharp": { @@ -91,10 +91,11 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.36.0", - "contentHash": "vwqFZdHS4dzPlI7FFRkPx9ctA+aGGeRev3gnzG8lntWvKMmBhAmulABi1O9CEvS3/jzYt7yA+0pqVdxkpAd7dQ==", + "resolved": "1.41.0", + "contentHash": "7OO8rPCVSvXj2IQET3NkRf8hU2ZDCCvCIUhlrE089qkLNpNfWufJnBwHRKLAOWF3bhKBGJS/9hPBgjJ8kupUIg==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.ClientModel": "1.0.0", "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", @@ -105,12 +106,12 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "resolved": "1.11.4", + "contentHash": "Sf4BoE6Q3jTgFkgBkx7qztYOFELBCo+wQgpYDwal/qJ1unBH73ywPztIJKXBXORRzAeNijsuxhk94h0TIMvfYg==", "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Azure.Core": "1.38.0", + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", @@ -119,44 +120,44 @@ }, "Azure.Storage.Blobs": { "type": "Transitive", - "resolved": "12.19.1", - "contentHash": "x43hWFJ4sPQ23TD4piCwT+KlQpZT8pNDAzqj6yUCqh+WJ2qcQa17e1gh6ZOeT2QNFQTTDSuR56fm2bIV7i11/w==", + "resolved": "12.21.2", + "contentHash": "2J+sMgNbj2DJ+ydRSqYYADDd2AajFLfPzLGxASOxcoGx4iVxyF6jscHw2IY+8QyMPWA09wN3lCtYJ5S4zIsJkA==", "dependencies": { - "Azure.Storage.Common": "12.18.1", + "Azure.Storage.Common": "12.20.1", "System.Text.Json": "4.7.2" } }, "Azure.Storage.Common": { "type": "Transitive", - "resolved": "12.18.1", - "contentHash": "ohCslqP9yDKIn+DVjBEOBuieB1QwsUCz+BwHYNaJ3lcIsTSiI4Evnq81HcKe8CqM8qvdModbipVQKpnxpbdWqA==", + "resolved": "12.20.1", + "contentHash": "KKBFnc4WZ6m9HgsKgwfO1cIxd154b8cAnP3uWhuelvFkzxqBXQQgIsHF0n3DYBG2AoTJCZDXwJpKuVC7CsKJWg==", "dependencies": { - "Azure.Core": "1.36.0", + "Azure.Core": "1.41.0", "System.IO.Hashing": "6.0.0" } }, "Azure.Storage.Queues": { "type": "Transitive", - "resolved": "12.17.1", - "contentHash": "ziN15iQ4+h0zf9EbKzFd5Zj3LiDH21qIrCknkXhpqwftPfIvlftvdyXbKQLi9+sh8dwT6PFPi/wq4oLsKNGfcQ==", + "resolved": "12.19.1", + "contentHash": "s7jBfSrEScS2yk5n61Xx+rNQCV+4SkFag17Wux4l8OufdBUkQPmEskQbOQxlPqBJNX1ycJRWj55Wd9Cz8lOLtQ==", "dependencies": { - "Azure.Storage.Common": "12.18.1", + "Azure.Storage.Common": "12.20.1", "System.Memory.Data": "1.0.2", "System.Text.Json": "4.7.2" } }, "BananaCakePop.Middleware": { "type": "Transitive", - "resolved": "13.0.0", - "contentHash": "6Zj/vfmnCXLjBG7WNdtOgZZ5ZDR3Sy1FQSshZUonIYs3OdzozmsFmqPXMd9XJ0QE9aAildgVGq/lDLpLrMI4Yw==", + "resolved": "16.0.3", + "contentHash": "gwWk5ykS1uum2/++x3UnGhmjs+4itxce1lW5YnKdb8JeG4QxAMzSWVGh3B1ehiKJNAuvNtbfBwp2BAQvOsq02g==", "dependencies": { - "Yarp.ReverseProxy": "2.0.1" + "Yarp.ReverseProxy": "2.1.0" } }, "BouncyCastle.Cryptography": { "type": "Transitive", - "resolved": "2.3.0", - "contentHash": "IaVIiYxZLaBulveGDRUx/pBoW/Rc8QeXGF5u2E8xL8RWhVKCgfmtX9NUyGRbnSqnbFQU2zyP3MkXIdH+jUuQBw==" + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" }, "CommandLineParser": { "type": "Transitive", @@ -165,8 +166,8 @@ }, "GreenDonut": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "T8ZYTsm0S48hi89d2symCvUEJoBkg5F+rfU+HFtkEOc7WLZsIBDStnfF3c890Vxjmx/P1tFpY5StDNTM+C6fIw==", + "resolved": "13.9.12", + "contentHash": "w/nOY3tM8nVmjI1Gyhv5/JVk3VyD7itRhz1Ul0A8C4MHavsEyNFaMA7J+lwBFKwSRsW4R52F0BhUVbomIDA5uQ==", "dependencies": { "Microsoft.Extensions.ObjectPool": "6.0.0", "System.Diagnostics.DiagnosticSource": "6.0.0", @@ -175,170 +176,170 @@ }, "HotChocolate": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "aGBAW6d9Oj1MfmKJF482yYdJ8G87yJ0rVFxU9l7lA1dg1xjc5XALLQO9jCPz4GCpQLetuAhHdkZ713imJ6WCPw==", + "resolved": "13.9.12", + "contentHash": "eRHrmy5rNq9rcPrIsWvoEw5BNMDntCkzGa044fpfwKayAvSvzhsMRNRtrY351jGlg5779n3fSsabwofPu3haYw==", "dependencies": { - "HotChocolate.Authorization": "13.9.0", - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0", - "HotChocolate.Types.Mutations": "13.9.0", - "HotChocolate.Types.OffsetPagination": "13.9.0", - "HotChocolate.Validation": "13.9.0" + "HotChocolate.Authorization": "13.9.12", + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12", + "HotChocolate.Types.Mutations": "13.9.12", + "HotChocolate.Types.OffsetPagination": "13.9.12", + "HotChocolate.Validation": "13.9.12" } }, "HotChocolate.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "mb3IPL8V4NRL2FUefZP20fSwIMOnE7uCMLiM4d5Y5cjljYaMUVzUJnvdW9C1tUfbodP49Llk9WnBCR6S9fr8mQ==", + "resolved": "13.9.12", + "contentHash": "zCDFmDV0lzDJQd7KvLthQ/d9x0TsVIKLXG3t/v0SgcQBYXnMvBeV094d+3cx44xE3T4lU4DpDeRTgD3rLLA+Dw==", "dependencies": { - "HotChocolate.Language": "13.9.0", + "HotChocolate.Language": "13.9.12", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "System.Collections.Immutable": "6.0.0" } }, "HotChocolate.AspNetCore": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "RnxUdKEYOmsjzNPss473CYOug/9GIt8qlS9j8HxtZrW5TASM/9S7pDb7FthcDj4ag/D7wAwme3YxsqxH+iw5Bg==", + "resolved": "13.9.12", + "contentHash": "lv4vBVGFfTOofb/T7Fm+i0rJgyS5ZCBkCmryCcNAOw3YYpt8dL67Mms8+oIEPes04N9Wbimev+1pyxmBh5SpZg==", "dependencies": { - "BananaCakePop.Middleware": "13.0.0", - "HotChocolate": "13.9.0", - "HotChocolate.Subscriptions.InMemory": "13.9.0", - "HotChocolate.Transport.Sockets": "13.9.0", - "HotChocolate.Types.Scalars.Upload": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0" + "BananaCakePop.Middleware": "16.0.3", + "HotChocolate": "13.9.12", + "HotChocolate.Subscriptions.InMemory": "13.9.12", + "HotChocolate.Transport.Sockets": "13.9.12", + "HotChocolate.Types.Scalars.Upload": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12" } }, "HotChocolate.Authorization": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6CPA39zObNuMUmkmQ6J3zqmalukhjCiJS/klSEDPpwTtrn9HS/3edsh/7oiKzmUh6PNVKGed0lwkSdDP+DGZDQ==", + "resolved": "13.9.12", + "contentHash": "LuTW5qZhD0bpZqQ1sTZJav+u6jc4JO7DltKhGM1nFWsOEPxMAx9OgyehQfuAoiGp0CPKHUI+M/LxDbXu1HFJog==", "dependencies": { - "HotChocolate.Execution": "13.9.0" + "HotChocolate.Execution": "13.9.12" } }, "HotChocolate.Data": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "eZI9pIipsJsqdacj55krmxx24cUTCearQ/q9wT4aa6vQ/5GwuwWJ0ZIqdcp1qPjd+BsmJixrQBbi6/OgnFXIGw==", + "resolved": "13.9.12", + "contentHash": "NFsErsZVyMZntDrA6TPHvCgLCaOQ9QhZvmQmnVqcozLQvfCLuS6cSGwdN5zy+DKYa+yTaMG5DK7uKcxVWT//Sg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12" } }, "HotChocolate.Execution": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "zO1aG5qx5lzbZu/iKR56g+zeOgCCCa5pICwxijd1qEap+7J5q0YsME9RByw8wYPH+tNsXCvDcKaeAEcashB4cg==", + "resolved": "13.9.12", + "contentHash": "UsuKiq7ynoqa9LvOjUHJAb4XTtnreFmjT3unhU6wz5cVeJU02eqbIQQyiOPDlv/SEk75XxJ1EjiuXZ/sKzcsag==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0", - "HotChocolate.Validation": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12", + "HotChocolate.Validation": "13.9.12", "Microsoft.Extensions.DependencyInjection": "6.0.0", "System.Threading.Channels": "6.0.0" } }, "HotChocolate.Execution.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "flySLPDyTtM4051tI3mh5Ue0fGrKFDuW3w0ebWmW2qjfuF4jgQzd3pK3ZxfkxAfpxQXyPaVn/Q7fae+fYQxeCg==", + "resolved": "13.9.12", + "contentHash": "o65we+xKpSpn/z5uqeTT3SW8+JEu4tufMxRCXXe38K504+WNy1yuuf3DpmwKBP0I3zeXMaWOsLLFcqzYKMAMXA==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" } }, "HotChocolate.Fetching": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "pIw7VlEABejQGLRnJGnO7iPdT40AHklf0psJp5zNXrq0IX+Vq7hRRqON73nubZv5Ofhh8fV3kugqYFKvzcptoA==", + "resolved": "13.9.12", + "contentHash": "dl098a0FSo2z0k3WwHdrlCeAn4fwFGOC2oQnkWjNGmTZAIuUaOrT1zoxLgFGJ/FLSUdB58jgYAiW+tD4zVE1+Q==", "dependencies": { - "GreenDonut": "13.9.0", - "HotChocolate.Types": "13.9.0" + "GreenDonut": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Language": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "M8q0XHQm8Gtab+wKgYXfVPxScjdDE+INify5yaj6g1ZDkV3sLIeX+muu1WebrNO3DgmuAi6o3aW770Ucw7k/dw==", + "resolved": "13.9.12", + "contentHash": "rohvOiAmZ9Wo8cLjnm5UwtrYrHfLm0YNKAqD7ZqK8QBqv3DTqlZTs3WMaJdkG6BLdZR/l8dK/g1Bl3BGhqSBJA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0", - "HotChocolate.Language.Utf8": "13.9.0", - "HotChocolate.Language.Visitors": "13.9.0", - "HotChocolate.Language.Web": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12", + "HotChocolate.Language.Utf8": "13.9.12", + "HotChocolate.Language.Visitors": "13.9.12", + "HotChocolate.Language.Web": "13.9.12" } }, "HotChocolate.Language.SyntaxTree": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "+vwrQ0qOiKn/yUBHn53030hQmqj45C1g0WI8sip50CPnkgs3bAPnDInUvrR3IiHbRn5spAonO4tFPtMDdJrEMA==", + "resolved": "13.9.12", + "contentHash": "rEmQ0OFW+LjTtYZNenFW9IKWTPJny8ACl1XnPULcGF22mgtuxItLwGJRfceRaAKqpAV2g7oLdFfLYmjqeJc3Tw==", "dependencies": { "Microsoft.Extensions.ObjectPool": "6.0.0" } }, "HotChocolate.Language.Utf8": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "IEWNYGvtwejf7+j+Xci25FaYets2UD8wkfzQ5dUCW47c1rnTAyuRdTiO8T8x6LYuZ7+SLg7UTBYgjv4ybwAUgA==", + "resolved": "13.9.12", + "contentHash": "JfsKnk734a0PxEFo9XGHiAiXNKI5qV1X0mAMcqRetljaiLGKKwYM/1ndvz3JS/gvVP/oltBaRKNKk1pWO9desg==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Visitors": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "j6mPBkfVo2fopWYLoczXCoog4PJ+KwbHItSgHfPfI1kDBcNcy9XY4oxth3Uau1uBbfHYIFjnuVc+FrGb1f9KAQ==", + "resolved": "13.9.12", + "contentHash": "I2T8u0gRY0TxmjLm+EYjIreihp7oJQLhRXOs8p3y7BZAmJNxfeuc6EkMn8VDca1EQeiroNmC9UTawtJNV7QNyQ==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Web": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "GI5ufbNVEoKygSC09owVnCvw1Ma2KzOtm1l6uen3wKshAdOKB4gmSVCjzf71pNL2Nt6cL4IHa70ClqjECmu9qg==", + "resolved": "13.9.12", + "contentHash": "/1HpNKOImaJcy6XLDPQaWqIE1H4Dmu4ST2Sl9lPE9EwDfYe6gBv3dS9mQ7jteyQQ7az05QhotXl2zDHD/Zx7lg==", "dependencies": { - "HotChocolate.Language.Utf8": "13.9.0" + "HotChocolate.Language.Utf8": "13.9.12" } }, "HotChocolate.Subscriptions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "P3ason65NwSzkB2W9myV/pRIm4IMIWXH3RPCtpHVKx22Xw3hRJRJhjLBQZ5LCk5v3+7kKhXNBTbFNpbMyvez3Q==", + "resolved": "13.9.12", + "contentHash": "2VnYGlN9E7e5kGV76JU4Z/5sOag0wgUh694qwx4aPG1Lc5hPQDOL2BIk9jX7PmftHDmbxpNT3ZBvTSJXvGIoPQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0" + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12" } }, "HotChocolate.Subscriptions.InMemory": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "rj5U1Cd2QsjNnSNNdlSopYLtXh0kTZ1NlA1B3v02YFtj4Zu9le6QkGsl3oUljUUq46vSkkrT9ISj+e5wTCcw/Q==", + "resolved": "13.9.12", + "contentHash": "yQxVqqLUdMcl7yvU4qVhIrsRA1WIb1pkiKsXuD3FQxxucW9M4qqqklx91tY33AwIGnBGva7UCnofNxHg2FRbYg==", "dependencies": { - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Subscriptions": "13.9.0", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Subscriptions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" } }, "HotChocolate.Transport.Sockets": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "4hPlhS2bgqT/tYCZfPtbGtPAaedULKgTbFKkTsjigrDhJcVxBA36Gr3yGM6S3NEw2JdIgiwugYV1log9zXkEjA==", + "resolved": "13.9.12", + "contentHash": "7VWxYdWBKhNA1LxBIba7okMvQDcaGzHlYhkmBtPGKtfg7sKqOrF6TrwlJg0peLnN8luG7TfW8Fmz8cbD7teEdA==", "dependencies": { "System.IO.Pipelines": "6.0.0" } }, "HotChocolate.Types": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "VGPZePNC4sBlz/iY4x90zIRxW62MWzWNcl2yjLS3JcW+0W8KuKxh99dFLxL0WY/+Eoe8PUecmoob+FrVEvPzpg==", + "resolved": "13.9.12", + "contentHash": "bTPnQZ0zolwj3E37ma2NPS5SxX6jj2OTQj9bszonB+92t0BQLOuX2wlgz0ux7XSmdC+ch7reCxJcrJEnPDs2QQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Types.Shared": "13.9.0", - "HotChocolate.Utilities": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Types.Shared": "13.9.12", + "HotChocolate.Utilities": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", "Microsoft.Extensions.ObjectPool": "6.0.0", "System.ComponentModel.Annotations": "5.0.0", @@ -347,74 +348,74 @@ }, "HotChocolate.Types.CursorPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2+w6tLrdjo+d/aIKyoNW1L/OH/p+FACMwGWHk1P4MwAspqaF7zjy71qTeNks+8QbRwG8uMleey/0sbr8sWpC6w==", + "resolved": "13.9.12", + "contentHash": "gjYxrEgQlcYTIcLMRUbF4/++C5c87OP7JU+f+YP6+BPID+r9tfEjC0U5KuRgbSg83t5jtgK1RpMLrbdTOUUGJg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Mutations": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "NX1zLkb7t19Om5RYubmkA6yRCtBbca454rqSGKSVBYjDrsiA6+4ZDvmS9Kjbw8F+cPm3VqShenrIIgfW8bzCXQ==", + "resolved": "13.9.12", + "contentHash": "Uvm+FfZISLM5+/vYuq4Rphns1UrfhiCfoLmdUtjMIPq4jVVl4unLxfcy1GrXdHVoBO7bOL1+gHl96e9S422+6w==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.OffsetPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "LIAaSVRS6FJCssP+s4ooLajhQ1/QfES78twX4OgZFJ9/UZMxXlU3K/IWeB2aXcJNkehfIZLgoiROnouB7ATepw==", + "resolved": "13.9.12", + "contentHash": "ipcyM/APH4J5oUFSE+TMYlCZ0n3lVvvap4eOHSXiriHlNM9/deLy5CooAlMmBkFbMsiFR8XcD9Ebc7od/xwm+g==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Scalars.Upload": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "hisB6PGGgsekz3a8YJwKgvbZHED98eph9+TMPg5A500tyvrZS00fbdpjRcN+rcTKAxhJ5evzHB2Fo1m62Dyo4w==", + "resolved": "13.9.12", + "contentHash": "3cAHgOwyl0O6qznO7SyjYsUa/RdnSK1JnKxPkQ4lk5Y3pDpl4iLLKuGtReoS+n74h5WLE88U3RPR4x6JcWMDlw==", "dependencies": { - "HotChocolate.Types": "13.9.0" + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Shared": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2lhdbXU/GltPQWO9r8qePZSzDo9ryFs8Wv0aF7aQgEq3dLvwer6OpvnZhIYmGua6bXXebA1PzBAEaaxPpLx3Wg==", + "resolved": "13.9.12", + "contentHash": "zWDYduCtLFxGqMV3vJ5lMfUv4h9ebU8dLwtG1Irtv5W5zOze0S+U6C0853hzDwL8/o6Torb5knQj56n78WBnAA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Utilities": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6zqwjROYxtuzAYjh31JnYKgM/MySRWEq4DHO64oSPFRJQ8NDgg7EvUU771yLt/6T7kUh+S6k25hVnmUipFtEnQ==" + "resolved": "13.9.12", + "contentHash": "Bo7aY9qaZ+8rcpDZFz9V03oVu4IWHmVgxlCDbMLYx1VJWOOyJA7pQb25ILxYVzScadn+lMkLy+4iq55GetLMhw==" }, "HotChocolate.Utilities.DependencyInjection": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "o1ijY8Rk0IUAo8QZYhfQ8s4/3z78JS9tyXGHzA963gkzTSJPehD4960CAmWlyC19FdE1i2KiTnYLhNOwNoL6+A==", + "resolved": "13.9.12", + "contentHash": "iSTJZCLfpg7l+ExXFQbWsPPvkAPL+JLU3UA1E6avgTEzPvMpzo9I1c5mA2ItyoOrmTewKSWmnQBlv25oEFQF6g==", "dependencies": { "Microsoft.Extensions.DependencyInjection": "6.0.0" } }, "HotChocolate.Validation": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "gC7/YfOcOOmT+zV/V45CubYhK3lZI7+SmNYLGXQ1ko4cwjVRh3PzSJMAaKw3naWDcbjXbEyWwdYc0dLuoVBNEA==", + "resolved": "13.9.12", + "contentHash": "7DyCifF5kBD2hbrsFoQX+nVYMURaHDzAt8gFm3+Ubedqx91cV39iP/Mam1qgx3gh/shaKYSRQFw4Ao8TTpFj2Q==", "dependencies": { - "HotChocolate.Types": "13.9.0", + "HotChocolate.Types": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", "Microsoft.Extensions.Options": "6.0.0" } }, "HtmlSanitizer": { "type": "Transitive", - "resolved": "8.0.843", - "contentHash": "XfmHK4rFz9PPN0gcv7J7pc+MRpcni1mrnO04mwA+9/1zIHLgdOvLJeDwWnX5a+up4tioPvGreB+p+KljLJ32wg==", + "resolved": "8.1.870", + "contentHash": "bQWYaKg8PrlgnhM9sPALl0UorpjWQkPTQiSTVyvm8imqF9lCLqBmtC0adUDi8xUYcdg6SJC+aHCw1MOjcg+Wnw==", "dependencies": { "AngleSharp": "[0.17.1]", "AngleSharp.Css": "[0.17.0]", @@ -435,19 +436,19 @@ }, "Kentico.Xperience.Core": { "type": "Transitive", - "resolved": "29.0.0", - "contentHash": "jG0gkDLE4H7ZNEdxdyZEzPxoAMlfx24oVdPeRa8RCUriOhBtleNREInbR9kYoMWwo456EaUaf3RPngArmZdy1g==", + "resolved": "29.5.0", + "contentHash": "RfcGWuhZSVDfmuUwl26svb9DZ/FWnhlNTr4q120uC7tuj7v/o3PH2iCtWCsDxkosGuN8f6c4FfO7cTnEPgmgWg==", "dependencies": { "AngleSharp": "0.17.1", - "MailKit": "4.5.0", - "Microsoft.Data.SqlClient": "5.2.0", + "MailKit": "4.7.1.1", + "Microsoft.Data.SqlClient": "5.2.2", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.Configuration": "6.0.1", "Microsoft.Extensions.Configuration.Binder": "6.0.0", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.FileProviders.Physical": "6.0.0", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization": "6.0.29", + "Microsoft.Extensions.Localization": "6.0.33", "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", "Mono.Cecil": "0.11.5", "Newtonsoft.Json": "13.0.3", @@ -456,20 +457,21 @@ }, "Kentico.Xperience.SendGrid": { "type": "Transitive", - "resolved": "29.0.0", - "contentHash": "BtJ5pHdg3kvk7KVDxmMyA7RyIiRphnvECXHCY4qyzhlcHaQ/xze/87UlFqKyn6jAH4UuF0LC/Asq+KJVq3E0Gg==", + "resolved": "29.5.0", + "contentHash": "1BSg7KT/a4ctxa1LA3JOZv7bhfSEl1L8rKM9Zyz6qttR1INP/tPW6kcWQ6U+NJ/kD/WR33U/JN6YFAQE4WuMwA==", "dependencies": { - "Kentico.Xperience.Core": "29.0.0", + "Kentico.Xperience.Core": "29.5.0", "SendGrid": "9.29.3", "SendGrid.Extensions.DependencyInjection": "1.0.1" } }, "MailKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "EaXHODUdIV5oPdWvBJGazwaEpKt1LI/H/S//EEozANYCsfOSKHntX+Skk2kW616lSQp+fkRTmSjk0CYxEuOyEA==", + "resolved": "4.7.1.1", + "contentHash": "Y3okmIxu8g/ZcoJiE2i+dCeKgnNyddsXmcJslZnCPGVPP0aRyeVINHV1h97V+OVMdqjQI6O12J2p8Duwq5UEqQ==", "dependencies": { - "MimeKit": "4.5.0" + "MimeKit": "4.7.1", + "System.Formats.Asn1": "8.0.1" } }, "Microsoft.ApplicationInsights": { @@ -627,8 +629,8 @@ }, "Microsoft.AspNetCore.SpaServices.Extensions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "2LeomoSAHbVBEffWwZS4cFLAQsPw2UK4gfNcajssV/cMM5/i61d8LwAdTcGHVmgF5e0zOz/25B06fk3iymD4VA==", + "resolved": "6.0.33", + "contentHash": "YFWk3bkKKVLQ1Q8jnTbjuzIIpIVoua4iw152wBNIH50gBZEi0xubmf0vxfgjXKoRs0xIgOBnjunvaMa8Of1e3w==", "dependencies": { "Microsoft.Extensions.FileProviders.Physical": "6.0.0" } @@ -647,14 +649,22 @@ "resolved": "6.0.0", "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "resolved": "5.2.2", + "contentHash": "mtoeRMh7F/OA536c/Cnh8L4H0uLSKB5kSmoi54oN7Fp0hNJDy22IqyMhaMH4PkDCqI7xL//Fvg9ldtuPHG0h5g==", "dependencies": { - "Azure.Identity": "1.10.3", + "Azure.Identity": "1.11.4", "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client": "4.61.3", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", @@ -762,8 +772,8 @@ }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "ih7lIqCUXsG4+CNNcPs67TBOe3Yd/HMdBBVP3BhvdZkJEUilhvUK69FB7ZPsiZKel08GkOh2qFXqZsWWPa/lPQ==", + "resolved": "6.0.33", + "contentHash": "A5HxR46JT3B81XtfYY1/vr4RvICcue7/7lkOjrTMhGX0RdDXqQHXL1NpeYB27S1CLlsjuJn2fF1LSeGRnYJbgg==", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" } @@ -806,19 +816,19 @@ }, "Microsoft.Extensions.Localization": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "cZ5Tx6NtTZFzk+PWW2icApat7agQiMIFIsohsmHmz/scKRfAI/5XTa9lpZMwKowQBZm+ap0RwAJmQ2/5xoL+VQ==", + "resolved": "6.0.33", + "contentHash": "o4I6H5vdDoILQvHJXvVdo33ts4zTb4FXcdc+Et1FYG0dao9GLrDQ3HXwgV8yU2M/JeEJJnsQvUwtaANJFDnjQQ==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization.Abstractions": "6.0.29", + "Microsoft.Extensions.Localization.Abstractions": "6.0.33", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" } }, "Microsoft.Extensions.Localization.Abstractions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "4HVhh+V/7H2VMgFI8EP1kLgLpeRqm1kQOlXjHk4MHCVD5/pgWOTTbLEz9pdXymQQf/eRg1vNK8tG2MZstBHhlw==" + "resolved": "6.0.33", + "contentHash": "Hbq0a3DswFjen1K6hDljNENpy6bDbA/s2qsQ5M9kqa6fB3JVKWggAdqwx2GJG4+SGkZKOWkOZxQ1QVqavWaF5g==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", @@ -882,19 +892,19 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "resolved": "4.61.3", + "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "resolved": "4.61.3", + "contentHash": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", + "Microsoft.Identity.Client": "4.61.3", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -966,10 +976,11 @@ }, "MimeKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "OYn8b8b66J4mgtDzoImepiUtdkJOAVGoTj/ghzJ+az4wVixA5L5Z8GmgFhRvQ1btAIwZh/d9zvZLCALndQdz5w==", + "resolved": "4.7.1", + "contentHash": "Qoj4aVvhX14A1FNvaJ33hzOP4VZI2j+Mr38I9wSGcjMq4BYDtWLJG89aJ9nRW2cNfH6Czjwyp7+Mh++xv3AZvg==", "dependencies": { - "BouncyCastle.Cryptography": "2.3.0", + "BouncyCastle.Cryptography": "2.4.0", + "System.Formats.Asn1": "8.0.1", "System.Security.Cryptography.Pkcs": "8.0.0" } }, @@ -1038,6 +1049,15 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", + "dependencies": { + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, "System.CodeDom": { "type": "Transitive", "resolved": "8.0.0", @@ -1091,8 +1111,8 @@ }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", @@ -1105,11 +1125,11 @@ }, "System.IO.FileSystem.AccessControl": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", + "resolved": "4.7.0", + "contentHash": "vMToiarpU81LR1/KZtnT7VDPvqAZfw9oOS5nY6pPP78nGYz3COLsQH3OfzbR+SjTgltd31R6KmKklz/zDpTmzw==", "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" + "System.Security.AccessControl": "4.7.0", + "System.Security.Principal.Windows": "4.7.0" } }, "System.IO.Hashing": { @@ -1188,8 +1208,8 @@ }, "System.Security.Principal.Windows": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" + "resolved": "4.7.0", + "contentHash": "ojD0PX0XhneCsUbAZVKdb7h/70vyYMDYs85lwEI+LngEONe/17A0cFaRFqZU+sOEidcVswYWikYOQ9PPfjlbtQ==" }, "System.Text.Encoding.CodePages": { "type": "Transitive", @@ -1236,9 +1256,11 @@ }, "Yarp.ReverseProxy": { "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "op7vBwONPFeR1PYxeLw+RLqSodODDX8RWd0OinLGMVIq6yi1q9mv1j56ImuyZgiAToksiC0Dc7jbRUZ9I+jvFA==", + "resolved": "2.1.0", + "contentHash": "VgRuCBxmh5ND4VuFhvIN3AAeoxFhYkS2hNINk6AVCrOVTlpk7OwdrTXi8NHACfqfhDL+/oYCZrF9RxN+yiYnEg==", "dependencies": { + "Microsoft.Bcl.TimeProvider": "8.0.0", + "System.Collections.Immutable": "8.0.0", "System.IO.Hashing": "7.0.0" } }, @@ -1246,8 +1268,8 @@ "type": "Project", "dependencies": { "Algolia.Search": "[6.16.0, )", - "Kentico.Xperience.Admin": "[29.0.0, )", - "Kentico.Xperience.WebApp": "[29.0.0, )" + "Kentico.Xperience.Admin": "[29.5.0, )", + "Kentico.Xperience.WebApp": "[29.5.0, )" } }, "Algolia.Search": { diff --git a/examples/DancingGoat/wwwroot/Content/Styles/Controls.less b/examples/DancingGoat/wwwroot/Content/Styles/Controls.less new file mode 100644 index 0000000..c54975b --- /dev/null +++ b/examples/DancingGoat/wwwroot/Content/Styles/Controls.less @@ -0,0 +1,186 @@ +// Checkboxes and radios +// Uses font-icon for the checkboxes and radio buttons +// +// Common radio and checkbox styles +.radio, +.ktc-radio, +.checkbox, +.ktc-checkbox { + display: block; + + label { + display: inline-block; + cursor: pointer; + position: relative; + padding-left: @base-unit * 1.5; + line-height: @line-height-100; + font-weight: normal; + // Common styles for border and inner icon + &:before, + &:after { + content: ""; + width: @base-unit - 1px; // remove white bg around + height: @base-unit - 1px; // remove white bg around + line-height: @base-unit; + display: inline-block; + box-sizing: border-box; + position: absolute; + left: 0; + top: @base-unit * 0.125; // special alignment + background-color: @color-white; + } + // Inner icon specific + &:after { + background-color: transparent; + } + } + + input { + // Disabled styling + &[disabled], &:active[disabled] { + & + label { + cursor: not-allowed; + + &:before, &:focus:before, &:active:before { + color: @input-bg-disabled; + } + + &:after { + color: @input-color-disabled; + } + } + } + // Hide default inputs + .sr-only; + // Icons + + label:before, + + label:after { + font-family: @icon-font-name; + font-size: @icon-size-80; + text-align: center; + } + + + label:before { + color: @color-gray-130; + } + + + label:after { + color: @color-green-100; + } + // Focus + &:focus + label:before, + &:active + label:before { + color: @color-blue-100; + } + } +} +// Checkbox correction for Safari +&.Safari { + .checkbox, .ktc-checkbox { + label { + &:after { + height: @base-unit; + } + } + } +} +// Checkbox correction for Chrome +&.Chrome { + .checkbox, .ktc-checkbox { + label { + &:before, + &:after { + height: @base-unit; + } + } + } +} + +// Radio specific styles +.radio, +.ktc-radio { + input { + // Border - shown for both selected and unselected + ~ label:before { + content: @icon-rb-uncheck; + } + + &:disabled ~ label:before { + content: @icon-circle; + } + // Inner icon + &:checked ~ label:after { + content: @icon-rb-check-sign; + } + } + // Radio button border radius fix - because of background issue on table hover + label:before { + border-radius: 50%; + } +} + +// Checkbox specific styles +.checkbox, .ktc-checkbox { + input { + // Border - shown for both checked and unchecked + ~ label:before { + content: @icon-cb-uncheck; + } + + &:disabled ~ label:before { + content: @icon-cb-check-disabled; + } + // Inner icon + &:checked ~ label:after { + content: @icon-cb-check-sign; + } + } + + &:not(.checkbox-no-label), &:not(.ktc-checkbox-no-label) { + label { + margin-right: @base-unit * 0.5; + } + } +} + + + +// Vertical radio and checkbox lists +.radio-list-vertical, +.ktc-radio-list-vertical, +.checkbox-list-vertical, +.ktc-checkbox-list-vertical { + margin-top: (@base-unit * 0.25 + @input-border-width); + margin-right: @base-unit * 0.5; + + label:not(:first-of-type), + // When disabled, radio list item gets wrapped with a span + span:not(:first-of-type) label, + .radio + .radio, + .ktc-radio + .ktc-radio, + .checkbox + .checkbox, + .ktc-checkbox + .ktc-checkbox { + margin-top: @base-unit * 0.25; + } + // Use this class when the list is the first thing on the page + &.first-on-page { + margin-top: 0px; + } +} + +// Horizontal radio and checkbox lists +.radio-list-horizontal, +.ktc-radio-list-horizontal, +.checkbox-list-horizontal, +.ktc-checkbox-list-horizontal { + .radio, + .ktc-radio, + .checkbox, + .ktc-checkbox { + display: inline-block; + } + + label { + margin-right: @base-unit; + } +} \ No newline at end of file diff --git a/examples/DancingGoat/wwwroot/Content/Styles/Landing-page.css b/examples/DancingGoat/wwwroot/Content/Styles/Landing-page.css index 49da8f8..0e02ed6 100644 --- a/examples/DancingGoat/wwwroot/Content/Styles/Landing-page.css +++ b/examples/DancingGoat/wwwroot/Content/Styles/Landing-page.css @@ -4487,6 +4487,17 @@ p { .row.section-cappuccino .image-uploader-editor .uploader .dz-message { color: #ffffff; } +/*# Consent #*/ +.consent-item:not(:first-of-type) { + border-top: 1px solid #e7e7e7; +} +.consent-item .row { + margin: 0 32px 0 32px; + padding: 8px 0 0 0; +} +.consent-item .consent-heading { + margin: 0; +} .cookie-consent { font-size: 16px; padding: 8px; diff --git a/examples/DancingGoat/wwwroot/Content/Styles/Products.less b/examples/DancingGoat/wwwroot/Content/Styles/Products.less new file mode 100644 index 0000000..701960f --- /dev/null +++ b/examples/DancingGoat/wwwroot/Content/Styles/Products.less @@ -0,0 +1,132 @@ +/*# Image #*/ +.product-tile-image { + overflow: hidden; + text-align: center; + position: relative; + display: block; + margin: .5rem; + padding-top: 15%; + padding-bottom: 25%; +} + +.product-tile-image img { + height: auto; + width: 100%; +} + +.product-tile-info { + padding: 1.25rem; + position: absolute; + bottom: 0; +} + +/*# Product list page #*/ +.product-page { + margin-top: 1.25rem; +} + +.product-tile { + overflow: hidden; + border: 1px solid #E5E5E5; + margin: 0 0 -2px -2px; + background: @color-white; +} + +.product-tile .product-heading { + text-align: center; + font-size: 1rem; + font-weight: normal; + font-family: 'Source Sans Pro', sans-serif; + z-index: 1; + position: absolute; + display: block; + margin: auto; + width: 100%; + padding: 1.25rem; +} + +.product-tile a { + color: #000; + text-decoration: none; +} + +/*# Product #*/ +.product-detail header { + text-align: left; +} + +.product-detail header h2 { + margin-top: 1.5rem; + font-size: 2rem; +} + +.product-detail .description { + margin-top: 1.25rem; +} + +/*# Image #*/ +.product-detail .image { + border: 1px solid #e5e5e5; + margin: 0 0 1.25rem -2px; + text-align: center; +} + +.product-detail .image img { + max-width: 100%; + height: auto; + margin: auto; +} + +.product-detail { + .tag-row { + display: flex; + flex-direction: row; + padding-bottom: 24px; + gap: 12px; + + .tag { + padding: 8px 16px; + border-radius: 8px; + background: #846331; + color: #FFF; + letter-spacing: 0.4px; + } + } +} + +.product-filter { + background-color: @color-brownbg; + padding: 1rem; + + h4 { + &:first-of-type { + margin-top: 0px; + } + } + + label { + padding-left: 0.25rem; + } + + input[type="checkbox"] { + margin: 0; + padding: 0; + } +} + +@media(min-width:768px) { + .product-page > div.flex { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + } +} + +.product-list { + .ContentLabel { + display: block; + margin-left: 1rem; + margin-top: 0.5rem; + } +} diff --git a/examples/DancingGoat/wwwroot/Content/Styles/Site.css b/examples/DancingGoat/wwwroot/Content/Styles/Site.css index bd2ee66..785af4f 100644 --- a/examples/DancingGoat/wwwroot/Content/Styles/Site.css +++ b/examples/DancingGoat/wwwroot/Content/Styles/Site.css @@ -1,4 +1,4 @@ -/* http://meyerweb.com/eric/tools/css/reset/ +/* http://meyerweb.com/eric/tools/css/reset/ v2.0 | 20110126 License: none (public domain) */ @@ -5089,6 +5089,355 @@ li.dropdown a { padding: 1rem 2.5rem; } } +/*# Image #*/ +.product-tile-image { + overflow: hidden; + text-align: center; + position: relative; + display: block; + margin: 0.5rem; + padding-top: 15%; + padding-bottom: 25%; +} +.product-tile-image img { + height: auto; + width: 100%; +} +.product-tile-info { + padding: 1.25rem; + position: absolute; + bottom: 0; +} +/*# Product list page #*/ +.product-page { + margin-top: 1.25rem; +} +.product-tile { + overflow: hidden; + border: 1px solid #E5E5E5; + margin: 0 0 -2px -2px; + background: #ffffff; +} +.product-tile .product-heading { + text-align: center; + font-size: 1rem; + font-weight: normal; + font-family: 'Source Sans Pro', sans-serif; + z-index: 1; + position: absolute; + display: block; + margin: auto; + width: 100%; + padding: 1.25rem; +} +.product-tile a { + color: #000; + text-decoration: none; +} +/*# Product #*/ +.product-detail header { + text-align: left; +} +.product-detail header h2 { + margin-top: 1.5rem; + font-size: 2rem; +} +.product-detail .description { + margin-top: 1.25rem; +} +/*# Image #*/ +.product-detail .image { + border: 1px solid #e5e5e5; + margin: 0 0 1.25rem -2px; + text-align: center; +} +.product-detail .image img { + max-width: 100%; + height: auto; + margin: auto; +} +.product-detail .tag-row { + display: flex; + flex-direction: row; + padding-bottom: 24px; + gap: 12px; +} +.product-detail .tag-row .tag { + padding: 8px 16px; + border-radius: 8px; + background: #846331; + color: #FFF; + letter-spacing: 0.4px; +} +.product-filter { + background-color: #F0E8DD; + padding: 1rem; +} +.product-filter h4:first-of-type { + margin-top: 0px; +} +.product-filter label { + padding-left: 0.25rem; +} +.product-filter input[type="checkbox"] { + margin: 0; + padding: 0; +} +@media (min-width: 768px) { + .product-page > div.flex { + display: -webkit-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + } +} +.product-list .ContentLabel { + display: block; + margin-left: 1rem; + margin-top: 0.5rem; +} +.radio, +.ktc-radio, +.checkbox, +.ktc-checkbox { + display: block; +} +.radio label, +.ktc-radio label, +.checkbox label, +.ktc-checkbox label { + display: inline-block; + cursor: pointer; + position: relative; + padding-left: 24px; + line-height: 20px; + font-weight: normal; +} +.radio label:before, +.ktc-radio label:before, +.checkbox label:before, +.ktc-checkbox label:before, +.radio label:after, +.ktc-radio label:after, +.checkbox label:after, +.ktc-checkbox label:after { + content: ""; + width: 15px; + height: 15px; + line-height: 16px; + display: inline-block; + box-sizing: border-box; + position: absolute; + left: 0; + top: 2px; + background-color: #ffffff; +} +.radio label:after, +.ktc-radio label:after, +.checkbox label:after, +.ktc-checkbox label:after { + background-color: transparent; +} +.radio input, +.ktc-radio input, +.checkbox input, +.ktc-checkbox input { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.radio input[disabled] + label, +.ktc-radio input[disabled] + label, +.checkbox input[disabled] + label, +.ktc-checkbox input[disabled] + label, +.radio input:active[disabled] + label, +.ktc-radio input:active[disabled] + label, +.checkbox input:active[disabled] + label, +.ktc-checkbox input:active[disabled] + label { + cursor: not-allowed; +} +.radio input[disabled] + label:before, +.ktc-radio input[disabled] + label:before, +.checkbox input[disabled] + label:before, +.ktc-checkbox input[disabled] + label:before, +.radio input:active[disabled] + label:before, +.ktc-radio input:active[disabled] + label:before, +.checkbox input:active[disabled] + label:before, +.ktc-checkbox input:active[disabled] + label:before, +.radio input[disabled] + label:focus:before, +.ktc-radio input[disabled] + label:focus:before, +.checkbox input[disabled] + label:focus:before, +.ktc-checkbox input[disabled] + label:focus:before, +.radio input:active[disabled] + label:focus:before, +.ktc-radio input:active[disabled] + label:focus:before, +.checkbox input:active[disabled] + label:focus:before, +.ktc-checkbox input:active[disabled] + label:focus:before, +.radio input[disabled] + label:active:before, +.ktc-radio input[disabled] + label:active:before, +.checkbox input[disabled] + label:active:before, +.ktc-checkbox input[disabled] + label:active:before, +.radio input:active[disabled] + label:active:before, +.ktc-radio input:active[disabled] + label:active:before, +.checkbox input:active[disabled] + label:active:before, +.ktc-checkbox input:active[disabled] + label:active:before { + color: #e5e5e5; +} +.radio input[disabled] + label:after, +.ktc-radio input[disabled] + label:after, +.checkbox input[disabled] + label:after, +.ktc-checkbox input[disabled] + label:after, +.radio input:active[disabled] + label:after, +.ktc-radio input:active[disabled] + label:after, +.checkbox input:active[disabled] + label:after, +.ktc-checkbox input:active[disabled] + label:after { + color: #696663; +} +.radio input + label:before, +.ktc-radio input + label:before, +.checkbox input + label:before, +.ktc-checkbox input + label:before, +.radio input + label:after, +.ktc-radio input + label:after, +.checkbox input + label:after, +.ktc-checkbox input + label:after { + font-family: "Core-icons"; + font-size: 16px; + text-align: center; +} +.radio input + label:before, +.ktc-radio input + label:before, +.checkbox input + label:before, +.ktc-checkbox input + label:before { + color: #bdbbbb; +} +.radio input + label:after, +.ktc-radio input + label:after, +.checkbox input + label:after, +.ktc-checkbox input + label:after { + color: #497d04; +} +.radio input:focus + label:before, +.ktc-radio input:focus + label:before, +.checkbox input:focus + label:before, +.ktc-checkbox input:focus + label:before, +.radio input:active + label:before, +.ktc-radio input:active + label:before, +.checkbox input:active + label:before, +.ktc-checkbox input:active + label:before { + color: #1175ae; +} +.Safari .checkbox label:after, +.Safari .ktc-checkbox label:after { + height: 16px; +} +.Chrome .checkbox label:before, +.Chrome .ktc-checkbox label:before, +.Chrome .checkbox label:after, +.Chrome .ktc-checkbox label:after { + height: 16px; +} +.radio input ~ label:before, +.ktc-radio input ~ label:before { + content: "\e626"; +} +.radio input:disabled ~ label:before, +.ktc-radio input:disabled ~ label:before { + content: "\e6ac"; +} +.radio input:checked ~ label:after, +.ktc-radio input:checked ~ label:after { + content: "\e627"; +} +.radio label:before, +.ktc-radio label:before { + border-radius: 50%; +} +.checkbox input ~ label:before, +.ktc-checkbox input ~ label:before { + content: "\e6ad"; +} +.checkbox input:disabled ~ label:before, +.ktc-checkbox input:disabled ~ label:before { + content: "\e6f0"; +} +.checkbox input:checked ~ label:after, +.ktc-checkbox input:checked ~ label:after { + content: "\e6b0"; +} +.checkbox:not(.checkbox-no-label) label, +.ktc-checkbox:not(.checkbox-no-label) label, +.checkbox:not(.ktc-checkbox-no-label) label, +.ktc-checkbox:not(.ktc-checkbox-no-label) label { + margin-right: 8px; +} +.radio-list-vertical, +.ktc-radio-list-vertical, +.checkbox-list-vertical, +.ktc-checkbox-list-vertical { + margin-top: 6px; + margin-right: 8px; +} +.radio-list-vertical label:not(:first-of-type), +.ktc-radio-list-vertical label:not(:first-of-type), +.checkbox-list-vertical label:not(:first-of-type), +.ktc-checkbox-list-vertical label:not(:first-of-type), +.radio-list-vertical span:not(:first-of-type) label, +.ktc-radio-list-vertical span:not(:first-of-type) label, +.checkbox-list-vertical span:not(:first-of-type) label, +.ktc-checkbox-list-vertical span:not(:first-of-type) label, +.radio-list-vertical .radio + .radio, +.ktc-radio-list-vertical .radio + .radio, +.checkbox-list-vertical .radio + .radio, +.ktc-checkbox-list-vertical .radio + .radio, +.radio-list-vertical .ktc-radio + .ktc-radio, +.ktc-radio-list-vertical .ktc-radio + .ktc-radio, +.checkbox-list-vertical .ktc-radio + .ktc-radio, +.ktc-checkbox-list-vertical .ktc-radio + .ktc-radio, +.radio-list-vertical .checkbox + .checkbox, +.ktc-radio-list-vertical .checkbox + .checkbox, +.checkbox-list-vertical .checkbox + .checkbox, +.ktc-checkbox-list-vertical .checkbox + .checkbox, +.radio-list-vertical .ktc-checkbox + .ktc-checkbox, +.ktc-radio-list-vertical .ktc-checkbox + .ktc-checkbox, +.checkbox-list-vertical .ktc-checkbox + .ktc-checkbox, +.ktc-checkbox-list-vertical .ktc-checkbox + .ktc-checkbox { + margin-top: 4px; +} +.radio-list-vertical.first-on-page, +.ktc-radio-list-vertical.first-on-page, +.checkbox-list-vertical.first-on-page, +.ktc-checkbox-list-vertical.first-on-page { + margin-top: 0px; +} +.radio-list-horizontal .radio, +.ktc-radio-list-horizontal .radio, +.checkbox-list-horizontal .radio, +.ktc-checkbox-list-horizontal .radio, +.radio-list-horizontal .ktc-radio, +.ktc-radio-list-horizontal .ktc-radio, +.checkbox-list-horizontal .ktc-radio, +.ktc-checkbox-list-horizontal .ktc-radio, +.radio-list-horizontal .checkbox, +.ktc-radio-list-horizontal .checkbox, +.checkbox-list-horizontal .checkbox, +.ktc-checkbox-list-horizontal .checkbox, +.radio-list-horizontal .ktc-checkbox, +.ktc-radio-list-horizontal .ktc-checkbox, +.checkbox-list-horizontal .ktc-checkbox, +.ktc-checkbox-list-horizontal .ktc-checkbox { + display: inline-block; +} +.radio-list-horizontal label, +.ktc-radio-list-horizontal label, +.checkbox-list-horizontal label, +.ktc-checkbox-list-horizontal label { + margin-right: 16px; +} /*# Page wrap #*/ html, body { diff --git a/examples/DancingGoat/wwwroot/Content/Styles/Site.less b/examples/DancingGoat/wwwroot/Content/Styles/Site.less index e7be99e..b1b3a43 100644 --- a/examples/DancingGoat/wwwroot/Content/Styles/Site.less +++ b/examples/DancingGoat/wwwroot/Content/Styles/Site.less @@ -5,8 +5,11 @@ @import "./Grid.less"; @import "./Menu.less"; @import "./icons-core.less"; +@import "./TrackingConsent.less"; @import "./Buttons.less"; @import "./Mixins.less"; +@import "./Products.less"; +@import "./Controls.less"; /*# Page wrap #*/ html, body { diff --git a/examples/DancingGoat/wwwroot/Content/Styles/TrackingConsent.less b/examples/DancingGoat/wwwroot/Content/Styles/TrackingConsent.less index e74f226..355024c 100644 --- a/examples/DancingGoat/wwwroot/Content/Styles/TrackingConsent.less +++ b/examples/DancingGoat/wwwroot/Content/Styles/TrackingConsent.less @@ -1,5 +1,21 @@ @import "./variables.less"; +/*# Consent #*/ +.consent-item { + &:not(:first-of-type) { + border-top: 1px solid #e7e7e7; + } + + .row { + margin: 0 32px 0 32px; + padding: 8px 0 0 0; + } + + .consent-heading { + margin: 0; + } +} + .cookie-consent { font-size: @base-unit; padding: 8px; diff --git a/examples/DancingGoat/wwwroot/Scripts/formAutoPost.js b/examples/DancingGoat/wwwroot/Scripts/formAutoPost.js new file mode 100644 index 0000000..8fe957b --- /dev/null +++ b/examples/DancingGoat/wwwroot/Scripts/formAutoPost.js @@ -0,0 +1,44 @@ +(function () { + 'use strict'; + + function formAutoPost(options) { + // Default settings + var settings = Object.assign({ + targetContainerSelector: "#target-list", + url: "" + }, options); + + function onSuccess(data) { + document.querySelector(settings.targetContainerSelector).innerHTML = data; + } + + function getAjaxParameters(htmlControl) { + var form = htmlControl.closest("form"); + return { + url: form.getAttribute("action"), + method: form.getAttribute("method"), + data: new URLSearchParams(new FormData(form)).toString() + }; + } + + function ajaxCall() { + var ajaxParams = getAjaxParameters(this); + var xhr = new XMLHttpRequest(); + xhr.open(ajaxParams.method, ajaxParams.url, true); + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4 && xhr.status === 200) { + onSuccess(xhr.responseText); + } + }; + xhr.send(ajaxParams.data); + } + + var elements = document.querySelectorAll(".js-postback input[type=checkbox]"); + elements.forEach(function (element) { + element.addEventListener("click", ajaxCall); + }); + } + + window.formAutoPost = formAutoPost; +})(); \ No newline at end of file diff --git a/images/xperience-administration-search-index-edit-form-paths-edit.jpg b/images/xperience-administration-search-index-edit-form-paths-edit.jpg index bd2add5..5511ade 100644 Binary files a/images/xperience-administration-search-index-edit-form-paths-edit.jpg and b/images/xperience-administration-search-index-edit-form-paths-edit.jpg differ diff --git a/images/xperience-administration-search-index-edit-form.jpg b/images/xperience-administration-search-index-edit-form.jpg index c5ca22b..2720c0b 100644 Binary files a/images/xperience-administration-search-index-edit-form.jpg and b/images/xperience-administration-search-index-edit-form.jpg differ diff --git a/src/Kentico.Xperience.Algolia/Admin/AlgoliaConfigurationModel.cs b/src/Kentico.Xperience.Algolia/Admin/AlgoliaConfigurationModel.cs index 76957ad..f639242 100644 --- a/src/Kentico.Xperience.Algolia/Admin/AlgoliaConfigurationModel.cs +++ b/src/Kentico.Xperience.Algolia/Admin/AlgoliaConfigurationModel.cs @@ -14,22 +14,25 @@ public class AlgoliaConfigurationModel Order = 1)] [Required] [MinLength(1)] - public string IndexName { get; set; } = ""; + public string IndexName { get; set; } = string.Empty; - [GeneralSelectorComponent(dataProviderType: typeof(LanguageOptionsProvider), Label = "Indexed Languages", Order = 2)] - public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); + [AlgoliaIndexConfigurationComponent(Label = "Included Paths", Order = 2)] + public IEnumerable Paths { get; set; } = new List(); - [DropDownComponent(Label = "Channel Name", DataProviderType = typeof(ChannelOptionsProvider), Order = 3)] - public string ChannelName { get; set; } = ""; + [GeneralSelectorComponent(dataProviderType: typeof(ReusableContentOptionsProvider), Label = "Included Reusable Content Types", Order = 3)] + public IEnumerable ReusableContentTypeNames { get; set; } = Enumerable.Empty(); - [DropDownComponent(Label = "Indexing Strategy", DataProviderType = typeof(IndexingStrategyOptionsProvider), Order = 4)] - public string StrategyName { get; set; } = ""; + [GeneralSelectorComponent(dataProviderType: typeof(LanguageOptionsProvider), Label = "Indexed Languages", Order = 4)] + public IEnumerable LanguageNames { get; set; } = Enumerable.Empty(); - [TextInputComponent(Label = "Rebuild Hook")] - public string RebuildHook { get; set; } = ""; + [DropDownComponent(Label = "Channel Name", DataProviderType = typeof(ChannelOptionsProvider), Order = 5)] + public string ChannelName { get; set; } = string.Empty; - [AlgoliaIndexConfigurationComponent(Label = "Included Paths")] - public IEnumerable Paths { get; set; } = new List(); + [DropDownComponent(Label = "Indexing Strategy", DataProviderType = typeof(IndexingStrategyOptionsProvider), Order = 6)] + public string StrategyName { get; set; } = string.Empty; + + [TextInputComponent(Label = "Rebuild Hook", Order = 7)] + public string RebuildHook { get; set; } = string.Empty; public AlgoliaConfigurationModel() { } @@ -37,7 +40,8 @@ public AlgoliaConfigurationModel( AlgoliaIndexItemInfo index, IEnumerable indexLanguages, IEnumerable indexPaths, - IEnumerable contentTypes + IEnumerable contentTypes, + IEnumerable reusableContentTypes ) { Id = index.AlgoliaIndexItemId; @@ -49,6 +53,10 @@ IEnumerable contentTypes .Where(l => l.AlgoliaIndexLanguageItemIndexItemId == index.AlgoliaIndexItemId) .Select(l => l.AlgoliaIndexLanguageItemName) .ToList(); + ReusableContentTypeNames = reusableContentTypes + .Where(c => c.AlgoliaReusableContentTypeItemIndexItemId == index.AlgoliaIndexItemId) + .Select(c => c.AlgoliaReusableContentTypeItemContentTypeName) + .ToList(); Paths = indexPaths .Where(p => p.AlgoliaIncludedPathItemIndexItemId == index.AlgoliaIndexItemId) .Select(p => new AlgoliaIndexIncludedPath(p, contentTypes)) diff --git a/src/Kentico.Xperience.Algolia/Admin/AlgoliaIndexContentType.cs b/src/Kentico.Xperience.Algolia/Admin/AlgoliaIndexContentType.cs index b7e5106..fc2bc26 100644 --- a/src/Kentico.Xperience.Algolia/Admin/AlgoliaIndexContentType.cs +++ b/src/Kentico.Xperience.Algolia/Admin/AlgoliaIndexContentType.cs @@ -5,12 +5,12 @@ public class AlgoliaIndexContentType /// /// Name of the indexed content type for an indexed path /// - public string ContentTypeName { get; set; } = ""; + public string ContentTypeName { get; set; } = string.Empty; /// /// Displayed name of the indexed content type for an indexed path which will be shown in admin UI /// - public string ContentTypeDisplayName { get; set; } = ""; + public string ContentTypeDisplayName { get; set; } = string.Empty; public AlgoliaIndexContentType() { } diff --git a/src/Kentico.Xperience.Algolia/Admin/AlgoliaModuleInstaller.cs b/src/Kentico.Xperience.Algolia/Admin/AlgoliaModuleInstaller.cs index c1c5939..c47af13 100644 --- a/src/Kentico.Xperience.Algolia/Admin/AlgoliaModuleInstaller.cs +++ b/src/Kentico.Xperience.Algolia/Admin/AlgoliaModuleInstaller.cs @@ -20,6 +20,7 @@ public void Install() InstallAlgoliaLanguageInfo(resource); InstallAlgoliaIndexPathItemInfo(resource); InstallAlgoliaContentTypeItemInfo(resource); + InstallLuceneReusableContentTypeItemInfo(resource); } public ResourceInfo InitializeResource(ResourceInfo resource) @@ -302,6 +303,64 @@ public void InstallAlgoliaContentTypeItemInfo(ResourceInfo resource) } } + public void InstallLuceneReusableContentTypeItemInfo(ResourceInfo resource) + { + var info = DataClassInfoProvider.GetDataClassInfo(AlgoliaReusableContentTypeItemInfo.OBJECT_TYPE) ?? DataClassInfo.New(AlgoliaReusableContentTypeItemInfo.OBJECT_TYPE); + + info.ClassName = AlgoliaReusableContentTypeItemInfo.TYPEINFO.ObjectClassName; + info.ClassTableName = AlgoliaReusableContentTypeItemInfo.TYPEINFO.ObjectClassName.Replace(".", "_"); + info.ClassDisplayName = "Algolia Reusable Content Type Item"; + info.ClassType = ClassType.OTHER; + info.ClassResourceID = resource.ResourceID; + + var formInfo = FormHelper.GetBasicFormDefinition(nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemId)); + + var formItem = new FormFieldInfo + { + Name = nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemContentTypeName), + AllowEmpty = false, + Visible = true, + Precision = 0, + Size = 100, + DataType = "text", + Enabled = true, + IsUnique = false + }; + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemGuid), + Enabled = true, + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "guid", + }; + + formInfo.AddFormItem(formItem); + + formItem = new FormFieldInfo + { + Name = nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId), + AllowEmpty = false, + Visible = true, + Precision = 0, + DataType = "integer", + ReferenceToObjectType = AlgoliaIndexItemInfo.OBJECT_TYPE, + ReferenceType = ObjectDependencyEnum.Required + }; + + formInfo.AddFormItem(formItem); + + SetFormDefinition(info, formInfo); + + if (info.HasChanged) + { + DataClassInfoProvider.SetDataClassInfo(info); + } + } + /// /// Ensure that the form is upserted with any existing form /// diff --git a/src/Kentico.Xperience.Algolia/Admin/Client/package-lock.json b/src/Kentico.Xperience.Algolia/Admin/Client/package-lock.json index ba4a197..339d9d5 100644 --- a/src/Kentico.Xperience.Algolia/Admin/Client/package-lock.json +++ b/src/Kentico.Xperience.Algolia/Admin/Client/package-lock.json @@ -8,11 +8,11 @@ "name": "kentico-algolia-web-admin", "version": "2.0.2", "dependencies": { - "@kentico/xperience-admin-base": "28.4.3", - "@kentico/xperience-admin-components": "28.4.3", + "@kentico/xperience-admin-base": "^29.5.0", + "@kentico/xperience-admin-components": "^29.5.0", "react": "18.3.1", "react-dom": "18.3.1", - "react-icons": "^5.2.1", + "react-icons": "5.2.1", "react-tooltip": "^5.26.4" }, "devDependencies": { @@ -56,9 +56,10 @@ } }, "node_modules/@amcharts/amcharts5": { - "version": "5.8.5", - "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.8.5.tgz", - "integrity": "sha512-KVUtC/gTyBE2HMXJya8LCluoEElPu+DXxBUDG5L1pbwiv7wzO4Myjm6WT7lDD2YP+V8nQsfJhYoj9+xhNlDteg==", + "version": "5.10.5", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.10.5.tgz", + "integrity": "sha512-R3ltwLBVMuBlfWX5edSFf/6edp7mGf8TJavdDA9ZYfCifJBB/0iKPApAosOGhLGvVBERHn5MCRBckVJpIQpkYw==", + "license": "SEE LICENSE IN LICENSE", "dependencies": { "@types/d3": "^7.0.0", "@types/d3-chord": "^3.0.0", @@ -70,9 +71,12 @@ "@types/svg-arc-to-cubic-bezier": "^3.2.0", "d3": "^7.0.0", "d3-chord": "^3.0.0", + "d3-force": "^3.0.0", "d3-geo": "^3.0.0", + "d3-hierarchy": "^3.0.0", "d3-sankey": "^0.12.3", "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", "d3-transition": "^3.0.0", "d3-voronoi-treemap": "^1.1.2", "flatpickr": "^4.6.9", @@ -1950,9 +1954,10 @@ } }, "node_modules/@codemirror/autocomplete": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.15.0.tgz", - "integrity": "sha512-G2Zm0mXznxz97JhaaOdoEG2cVupn4JjPaS4AcNvZzhOsnnG9YVN68VzfoUw6dYTsIxT6a/cmoFEN47KAWhXaOg==", + "version": "6.18.1", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.1.tgz", + "integrity": "sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA==", + "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -1967,32 +1972,35 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.3.3.tgz", - "integrity": "sha512-dO4hcF0fGT9tu1Pj1D2PvGvxjeGkbC6RGcZw6Qs74TH+Ed1gw98jmUgd2axWvIZEqTeTuFrg1lEB1KV6cK9h1A==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.2.tgz", + "integrity": "sha512-Fq7eWOl1Rcbrfn6jD8FPCj9Auaxdm5nIK5RYOeW7ughnd/rY5AmPg6b+CfsG39ZHdwiwe8lde3q8uR7CF5S0yQ==", + "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.0.0", + "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "node_modules/@codemirror/lang-css": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", - "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.0.tgz", + "integrity": "sha512-CyR4rUNG9OYcXDZwMPvJdtb6PHbBDKUc/6Na2BIwZ6dKab1JQqKa4di+RNRY9Myn7JB81vayKwJeQ7jEdmNVDA==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@lezer/common": "^1.0.2", - "@lezer/css": "^1.0.0" + "@lezer/css": "^1.1.7" } }, "node_modules/@codemirror/lang-html": { - "version": "6.4.8", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.8.tgz", - "integrity": "sha512-tE2YK7wDlb9ZpAH6mpTPiYm6rhfdQKVDa5r9IwIFlwwgvVaKsCfuKKZoJGWsmMZIf3FQAuJ5CHMPLymOtg1hXw==", + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", + "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/lang-css": "^6.0.0", @@ -2009,6 +2017,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", @@ -2020,9 +2029,10 @@ } }, "node_modules/@codemirror/lang-sql": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.6.3.tgz", - "integrity": "sha512-fo5i3OD/7TmmqMtKycC4OaqfPsRxk0sKOb35g8cOtyUyyI2hfP2qXkDc7Asb6h7BiJK+MU/DYVPnQm6iNB5ZTw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-sql/-/lang-sql-6.7.1.tgz", + "integrity": "sha512-flQa7zemrLKk0TIrOJnpeyH/b29BcVybtsTeZMgAo40O6kGbrnUSCgwI3TF5iJY3O9VXJKKCA+i0CBVvDfr88w==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.0.0", @@ -2036,6 +2046,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", "integrity": "sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.4.0", @@ -2046,9 +2057,10 @@ } }, "node_modules/@codemirror/language": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz", - "integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.3.tgz", + "integrity": "sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==", + "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", @@ -2059,9 +2071,10 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.5.0.tgz", - "integrity": "sha512-+5YyicIaaAZKU8K43IQi8TBy6mF6giGeWAH7N96Z5LC30Wm5JMjqxOYIE9mxwMG1NbhT2mA3l9hA4uuKUM3E5g==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.1.tgz", + "integrity": "sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==", + "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -2072,6 +2085,7 @@ "version": "6.5.6", "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz", "integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==", + "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -2081,12 +2095,14 @@ "node_modules/@codemirror/state": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" + "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==", + "license": "MIT" }, "node_modules/@codemirror/theme-one-dark": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", + "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -2095,9 +2111,10 @@ } }, "node_modules/@codemirror/view": { - "version": "6.26.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.1.tgz", - "integrity": "sha512-wLw0t3R9AwOSQThdZ5Onw8QQtem5asE7+bPlnzc57eubPqiuJKIzwjMZ+C42vQett+iva+J8VgFV4RYWDBh5FA==", + "version": "6.33.0", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.33.0.tgz", + "integrity": "sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==", + "license": "MIT", "dependencies": { "@codemirror/state": "^6.4.0", "style-mod": "^4.1.0", @@ -2114,15 +2131,16 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -2135,6 +2153,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -2143,39 +2162,43 @@ } }, "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" }, "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -2188,44 +2211,50 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", + "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", + "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.0", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" }, "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==", + "license": "MIT" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -2338,12 +2367,13 @@ } }, "node_modules/@floating-ui/react": { - "version": "0.26.11", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.11.tgz", - "integrity": "sha512-fo01Cu+jzLDVG/AYAV2OtV6flhXvxP5rDaR1Fk8WWhtsFqwk478Dr2HGtB8s0HqQCsFWVbdHYpPjMiQiR/A9VA==", + "version": "0.26.24", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.24.tgz", + "integrity": "sha512-2ly0pCkZIGEQUq5H8bBK0XJmc1xIK/RM3tvVzY3GBER7IOD1UgmC2Y2tjj4AuS+TC+vTE1KJv2053290jua0Sw==", + "license": "MIT", "dependencies": { - "@floating-ui/react-dom": "^2.0.0", - "@floating-ui/utils": "^0.2.0", + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -2352,11 +2382,12 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -2364,14 +2395,16 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" }, "node_modules/@foliojs-fork/fontkit": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", + "license": "MIT", "dependencies": { "@foliojs-fork/restructure": "^2.0.2", "brotli": "^1.2.0", @@ -2387,6 +2420,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", + "license": "MIT", "dependencies": { "base64-js": "1.3.1", "unicode-trie": "^2.0.0" @@ -2396,6 +2430,7 @@ "version": "0.14.0", "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.14.0.tgz", "integrity": "sha512-nMOiQAv6id89MT3tVTCgc7HxD5ZMANwio2o5yvs5sexQkC0KI3BLaLakpsrHmFfeGFAhqPmZATZGbJGXTUebpg==", + "license": "MIT", "dependencies": { "@foliojs-fork/fontkit": "^1.9.1", "@foliojs-fork/linebreak": "^1.1.1", @@ -2406,12 +2441,14 @@ "node_modules/@foliojs-fork/restructure": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", - "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==" + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "license": "MIT" }, "node_modules/@formatjs/ecma402-abstract": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.18.2.tgz", - "integrity": "sha512-+QoPW4csYALsQIl8GbN14igZzDbuwzcpWrku9nyMXlaqAlwRBgl5V+p0vWMGFqHOw37czNXaP/lEk4wbLgcmtA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", + "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", + "license": "MIT", "dependencies": { "@formatjs/intl-localematcher": "0.5.4", "tslib": "^2.4.0" @@ -2421,26 +2458,29 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-messageformat-parser": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.6.tgz", - "integrity": "sha512-etVau26po9+eewJKYoiBKP6743I1br0/Ie00Pb/S/PtmYfmjTcOn2YCh2yNkSZI12h6Rg+BOgQYborXk46BvkA==", + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", + "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", - "@formatjs/icu-skeleton-parser": "1.8.0", + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/icu-skeleton-parser": "1.8.2", "tslib": "^2.4.0" } }, "node_modules/@formatjs/icu-skeleton-parser": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.0.tgz", - "integrity": "sha512-QWLAYvM0n8hv7Nq5BEs4LKIjevpVpbGLAJgOaYzg9wABEoX1j0JO1q2/jVkO6CVlq0dbsxZCngS5aXbysYueqA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", + "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", + "license": "MIT", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/ecma402-abstract": "2.0.0", "tslib": "^2.4.0" } }, @@ -2448,6 +2488,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "license": "MIT", "dependencies": { "tslib": "^2.4.0" } @@ -2508,34 +2549,38 @@ "dev": true }, "node_modules/@internationalized/date": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.2.tgz", - "integrity": "sha512-vo1yOMUt2hzp63IutEaTUxROdvQg1qlMRsbCvbay2AK2Gai7wIgCyK5weEX3nHkiLgo4qCXHijFNC/ILhlRpOQ==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.5.tgz", + "integrity": "sha512-H+CfYvOZ0LTJeeLOqm19E3uj/4YjrmOFtBufDHPfvtI80hFAMqtrp7oCACpe4Cil5l8S0Qu/9dYfZc/5lY8WQQ==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/message": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.2.tgz", - "integrity": "sha512-MHAWsZWz8jf6jFPZqpTudcCM361YMtPIRu9CXkYmKjJ/0R3pQRScV5C0zS+Qi50O5UAm8ecKhkXx6mWDDcF6/g==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@internationalized/message/-/message-3.1.4.tgz", + "integrity": "sha512-Dygi9hH1s7V9nha07pggCkvmRfDd3q2lWnMGvrJyrOwYMe1yj4D2T9BoH9I6MGR7xz0biQrtLPsqUkqXzIrBOw==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0", "intl-messageformat": "^10.1.0" } }, "node_modules/@internationalized/number": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.1.tgz", - "integrity": "sha512-N0fPU/nz15SwR9IbfJ5xaS9Ss/O5h1sVXMZf43vc9mxEG48ovglvvzBjF53aHlq20uoR6c+88CrIXipU/LSzwg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.5.3.tgz", + "integrity": "sha512-rd1wA3ebzlp0Mehj5YTuTI50AQEx80gWFyHcQu+u91/5NgdwBecO8BH6ipPfE+lmQ9d63vpB3H9SHoIUiupllw==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } }, "node_modules/@internationalized/string": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.1.tgz", - "integrity": "sha512-vWQOvRIauvFMzOO+h7QrdsJmtN1AXAFVcaLWP9AseRN2o7iHceZ6bIXhBD4teZl8i91A3gxKnWBlGgjCwU6MFQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@internationalized/string/-/string-3.2.3.tgz", + "integrity": "sha512-9kpfLoA8HegiWTeCbR2livhdVeKobCnVv8tlJ6M2jF+4tcMqDo94ezwlnrUANBWPgd8U7OXIHCk2Ov2qhk4KXw==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" } @@ -2601,40 +2646,44 @@ "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", + "license": "Apache-2.0" }, "node_modules/@kentico/xperience-admin-base": { - "version": "28.4.3", - "resolved": "https://registry.npmjs.org/@kentico/xperience-admin-base/-/xperience-admin-base-28.4.3.tgz", - "integrity": "sha512-BfCFh1ImPsVUiMlTDMAIB9QLU3QOp12zUr8rvdiznyUqUd4/Ul7RhNFAFMaobKMFXegUKR6NUuSWy4d3aEwi5g==", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@kentico/xperience-admin-base/-/xperience-admin-base-29.5.0.tgz", + "integrity": "sha512-6tcMDcCJb37I/0E7Cv/ZuCGWl5A/zhRwTfejefpCtvJo3szhZJ0h+KO37VdncHkfkYvm0O+N84IaQAjIuGu/7w==", + "license": "SEE LICENSE IN LICENSE.txt", "dependencies": { - "@kentico/xperience-admin-components": "28.4.3", + "@kentico/xperience-admin-components": "29.5.0", "@react-aria/focus": "^3.15.0", "@react-aria/visually-hidden": "^3.8.7", "classnames": "^2.5.1", - "react": "^18.2.0", + "react": "^18.3.1", + "react-beautiful-dnd": "^13.1.1", "react-cool-inview": "^3.0.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-router-dom": "^6.22.3", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.2", "react-select": "^5.8.0", - "react-select-async-paginate": "^0.7.3", - "use-debounce": "^10.0.0", + "react-select-async-paginate": "^0.7.5", + "use-debounce": "^10.0.3", "use-resize-observer": "9.1.0", - "uuid": "^9.0.1" + "uuid": "^10.0.0" } }, "node_modules/@kentico/xperience-admin-components": { - "version": "28.4.3", - "resolved": "https://registry.npmjs.org/@kentico/xperience-admin-components/-/xperience-admin-components-28.4.3.tgz", - "integrity": "sha512-sGJVNqFed7TVo9NYQptE6sGMJcsDhQ0Cl8TdMHVA9ct4QgmcnkTY1IluAwPSXNJAmeC2vda03Ruecpj6xi10Gg==", - "dependencies": { - "@amcharts/amcharts5": "5.8.5", - "@codemirror/lang-css": "^6.2.1", - "@codemirror/lang-html": "^6.4.8", + "version": "29.5.0", + "resolved": "https://registry.npmjs.org/@kentico/xperience-admin-components/-/xperience-admin-components-29.5.0.tgz", + "integrity": "sha512-E6OYipu4UPI0RcQ+WLvSVGFns8Hy3Fq70eH7TCCUZi1zA7lO5O3fUR37ZCKOVj4I9YqGZlh/hDDIZawdrKEIGQ==", + "license": "SEE LICENSE IN LICENSE.txt", + "dependencies": { + "@amcharts/amcharts5": "5.10.5", + "@codemirror/lang-css": "^6.3.0", + "@codemirror/lang-html": "^6.4.9", "@codemirror/lang-javascript": "^6.2.2", - "@codemirror/lang-sql": "^6.5.4", + "@codemirror/lang-sql": "^6.7.1", "@codemirror/lang-xml": "^6.1.0", "@react-aria/focus": "3.14.3", "@react-aria/interactions": "3.19.1", @@ -2645,20 +2694,20 @@ "@react-stately/radio": "3.9.1", "@react-stately/toggle": "3.6.3", "@tippyjs/react": "^4.2.6", - "@uiw/react-codemirror": "^4.21.24", + "@uiw/react-codemirror": "^4.23.2", "classnames": "^2.5.1", - "froala-editor": "4.1.4", - "react": "^18.2.0", + "froala-editor": "4.2.2", + "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", - "react-datepicker": "^6.4.0", + "react-datepicker": "^7.3.0", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", - "react-dom": "^18.2.0", - "react-froala-wysiwyg": "4.1.4", + "react-dom": "^18.3.1", + "react-froala-wysiwyg": "4.2.2", "react-modal": "^3.16.1", - "react-router-dom": "^6.22.3", + "react-router-dom": "^6.26.2", "react-textarea-autosize": "8.5.3", - "use-debounce": "^10.0.0", + "use-debounce": "^10.0.3", "use-resize-observer": "9.1.0" } }, @@ -2666,6 +2715,7 @@ "version": "3.14.3", "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.14.3.tgz", "integrity": "sha512-gvO/frZ7SxyfyHJYC+kRsUXnXct8hGHKlG1TwbkzCCXim9XIPKDgRzfNGuFfj0i8ZpR9xmsjOBUkHZny0uekFA==", + "license": "Apache-2.0", "dependencies": { "@react-aria/interactions": "^3.19.1", "@react-aria/utils": "^3.21.1", @@ -2681,6 +2731,7 @@ "version": "3.8.6", "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.6.tgz", "integrity": "sha512-6DmS/JLbK9KgU/ClK1WjwOyvpn8HtwYn+uisMLdP7HlCm692peYOkXDR1jqYbHL4GlyLCD0JLI+/xGdVh5aR/w==", + "license": "Apache-2.0", "dependencies": { "@react-aria/interactions": "^3.19.1", "@react-aria/utils": "^3.21.1", @@ -2696,6 +2747,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "license": "MIT", "engines": { "node": ">=6" } @@ -2718,12 +2770,14 @@ "node_modules/@lezer/common": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", - "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" + "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==", + "license": "MIT" }, "node_modules/@lezer/css": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz", - "integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.9.tgz", + "integrity": "sha512-TYwgljcDv+YrV0MZFFvYFQHCfGgbPMR6nuqLabBdmZoFH3EP1gvw8t0vae326Ne3PszQkbXfVBjCnf3ZVCr0bA==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", @@ -2731,17 +2785,19 @@ } }, "node_modules/@lezer/highlight": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", - "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@lezer/html": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.9.tgz", - "integrity": "sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==", + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", + "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", @@ -2749,9 +2805,10 @@ } }, "node_modules/@lezer/javascript": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.14.tgz", - "integrity": "sha512-GEdUyspTRgc5dwIGebUk+f3BekvqEWVIYsIuAC3pA8e8wcikGwBZRWRa450L0s8noGWuULwnmi4yjxTnYz9PpA==", + "version": "1.4.18", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.18.tgz", + "integrity": "sha512-Y8BeHOt4LtcxJgXwadtfSeWPrh0XzklcCHnCVT+vOsxqH4gWmunP2ykX+VVOlM/dusyVyiNfG3lv0f10UK+mgA==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", @@ -2759,9 +2816,10 @@ } }, "node_modules/@lezer/lr": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", - "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } @@ -2770,6 +2828,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@lezer/xml/-/xml-1.0.5.tgz", "integrity": "sha512-VFouqOzmUWfIg+tfmpcdV33ewtK+NSwd4ngSe1aG7HFb4BN0ExyY1b8msp+ndFrnlG4V4iC8yXacjFtrwERnaw==", + "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.0.0", @@ -2846,62 +2905,67 @@ "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@react-aria/focus": { - "version": "3.16.2", - "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.16.2.tgz", - "integrity": "sha512-Rqo9ummmgotESfypzFjI3uh58yMpL+E+lJBbQuXkBM0u0cU2YYzu0uOrFrq3zcHk997udZvq1pGK/R+2xk9B7g==", - "dependencies": { - "@react-aria/interactions": "^3.21.1", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.18.2", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.18.2.tgz", + "integrity": "sha512-Jc/IY+StjA3uqN73o6txKQ527RFU7gnG5crEl5Xy3V+gbYp2O5L3ezAo/E0Ipi2cyMbG6T5Iit1IDs7hcGu8aw==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.22.2", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/focus/node_modules/@react-aria/interactions": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", - "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", - "dependencies": { - "@react-aria/ssr": "^3.9.2", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.2.tgz", + "integrity": "sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/i18n": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.10.2.tgz", - "integrity": "sha512-Z1ormoIvMOI4mEdcFLYsoJy9w/EzBdBmgfLP+S/Ah+1xwQOXpgwZxiKOhYHpWa0lf6hkKJL34N9MHJvCJ5Crvw==", - "dependencies": { - "@internationalized/date": "^3.5.2", - "@internationalized/message": "^3.1.2", - "@internationalized/number": "^3.5.1", - "@internationalized/string": "^3.2.1", - "@react-aria/ssr": "^3.9.2", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/@react-aria/i18n/-/i18n-3.12.2.tgz", + "integrity": "sha512-PvEyC6JWylTpe8dQEWqQwV6GiA+pbTxHQd//BxtMSapRW3JT9obObAnb/nFhj3HthkUvqHyj0oO1bfeN+mtD8A==", + "license": "Apache-2.0", + "dependencies": { + "@internationalized/date": "^3.5.5", + "@internationalized/message": "^3.1.4", + "@internationalized/number": "^3.5.3", + "@internationalized/string": "^3.2.3", + "@react-aria/ssr": "^3.9.5", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/interactions": { "version": "3.19.1", "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.19.1.tgz", "integrity": "sha512-2QFOvq/rJfMGEezmtYcGcJmfaD16kHKcSTLFrZ8aeBK6hYFddGVZJZk+dXf+G7iNaffa8rMt6uwzVe/malJPBA==", + "license": "Apache-2.0", "dependencies": { "@react-aria/ssr": "^3.8.0", "@react-aria/utils": "^3.21.1", @@ -2913,22 +2977,24 @@ } }, "node_modules/@react-aria/label": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.6.tgz", - "integrity": "sha512-ap9iFS+6RUOqeW/F2JoNpERqMn1PvVIo3tTMrJ1TY1tIwyJOxdCBRgx9yjnPBnr+Ywguep+fkPNNi/m74+tXVQ==", + "version": "3.7.11", + "resolved": "https://registry.npmjs.org/@react-aria/label/-/label-3.7.11.tgz", + "integrity": "sha512-REgejE5Qr8cXG/b8H2GhzQmjQlII/0xQW/4eDzydskaTLvA7lF5HoJUE6biYTquH5va38d8XlH465RPk+bvHzA==", + "license": "Apache-2.0", "dependencies": { - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/overlays": { "version": "3.18.1", "resolved": "https://registry.npmjs.org/@react-aria/overlays/-/overlays-3.18.1.tgz", "integrity": "sha512-C74eZbTp3OA/gXy9/+4iPrZiz7g27Zy6Q1+plbg5QTLpsFLBt2Ypy9jTTANNRZfW7a5NW/Bnw9WIRjCdtTBRXw==", + "license": "Apache-2.0", "dependencies": { "@react-aria/focus": "^3.14.3", "@react-aria/i18n": "^3.8.4", @@ -2951,6 +3017,7 @@ "version": "3.8.2", "resolved": "https://registry.npmjs.org/@react-aria/radio/-/radio-3.8.2.tgz", "integrity": "sha512-j8yyGjboTgoBEQWlnJbQVvegKiUeQEUvU/kZ7ZAdj+eAL3BqfO6FO7yt6WzK7ZIBzjGS9YbesaUa3hwIjDi3LA==", + "license": "Apache-2.0", "dependencies": { "@react-aria/focus": "^3.14.3", "@react-aria/i18n": "^3.8.4", @@ -2967,9 +3034,10 @@ } }, "node_modules/@react-aria/ssr": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.2.tgz", - "integrity": "sha512-0gKkgDYdnq1w+ey8KzG9l+H5Z821qh9vVjztk55rUg71vTk/Eaebeir+WtzcLLwTjw3m/asIjx8Y59y1lJZhBw==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.5.tgz", + "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" }, @@ -2977,13 +3045,14 @@ "node": ">= 12" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/switch": { "version": "3.5.6", "resolved": "https://registry.npmjs.org/@react-aria/switch/-/switch-3.5.6.tgz", "integrity": "sha512-W6H/0TFa72MJY02AatUERt5HKgaDTF8lOaTjNNmS6U6U20+//uvrVCqcBof8OMe4M60mQpkp7Bd6756CJAMX1w==", + "license": "Apache-2.0", "dependencies": { "@react-aria/toggle": "^3.8.2", "@react-stately/toggle": "^3.6.3", @@ -2995,123 +3064,135 @@ } }, "node_modules/@react-aria/toggle": { - "version": "3.10.2", - "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.2.tgz", - "integrity": "sha512-DgitscHWgI6IFgnvp2HcMpLGX/cAn+XX9kF5RJQbRQ9NqUgruU5cEEGSOLMrEJ6zXDa2xmOiQ+kINcyNhA+JLg==", - "dependencies": { - "@react-aria/focus": "^3.16.2", - "@react-aria/interactions": "^3.21.1", - "@react-aria/utils": "^3.23.2", - "@react-stately/toggle": "^3.7.2", - "@react-types/checkbox": "^3.7.1", + "version": "3.10.7", + "resolved": "https://registry.npmjs.org/@react-aria/toggle/-/toggle-3.10.7.tgz", + "integrity": "sha512-/RJQU8QlPZXRElZ3Tt10F5K5STgUBUGPpfuFUGuwF3Kw3GpPxYsA1YAVjxXz2MMGwS0+y6+U/J1xIs1AF0Jwzg==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/focus": "^3.18.2", + "@react-aria/interactions": "^3.22.2", + "@react-aria/utils": "^3.25.2", + "@react-stately/toggle": "^3.7.7", + "@react-types/checkbox": "^3.8.3", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/toggle/node_modules/@react-aria/interactions": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", - "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", - "dependencies": { - "@react-aria/ssr": "^3.9.2", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.2.tgz", + "integrity": "sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/toggle/node_modules/@react-stately/toggle": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.2.tgz", - "integrity": "sha512-SHCF2btcoK57c4lyhucRbyPBAFpp0Pdp0vcPdn3hUgqbu6e5gE0CwG/mgFmZRAQoc7PRc7XifL0uNw8diJJI0Q==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.7.7.tgz", + "integrity": "sha512-AS+xB4+hHWa3wzYkbS6pwBkovPfIE02B9SnuYTe0stKcuejpWKo5L3QMptW0ftFYsW3ZPCXuneImfObEw2T01A==", + "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.9.1", - "@react-types/checkbox": "^3.7.1", + "@react-stately/utils": "^3.10.3", + "@react-types/checkbox": "^3.8.3", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/utils": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.23.2.tgz", - "integrity": "sha512-yznR9jJ0GG+YJvTMZxijQwVp+ahP66DY0apZf7X+dllyN+ByEDW+yaL1ewYPIpugxVzH5P8jhnBXsIyHKN411g==", - "dependencies": { - "@react-aria/ssr": "^3.9.2", - "@react-stately/utils": "^3.9.1", - "@react-types/shared": "^3.22.1", + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.25.2.tgz", + "integrity": "sha512-GdIvG8GBJJZygB4L2QJP1Gabyn2mjFsha73I2wSe+o4DYeGWoJiMZRM06PyTIxLH4S7Sn7eVDtsSBfkc2VY/NA==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-stately/utils": "^3.10.3", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0", "clsx": "^2.0.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/visually-hidden": { - "version": "3.8.10", - "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.10.tgz", - "integrity": "sha512-np8c4wxdbE7ZrMv/bnjwEfpX0/nkWy9sELEb0sK8n4+HJ+WycoXXrVxBUb9tXgL/GCx5ReeDQChjQWwajm/z3A==", - "dependencies": { - "@react-aria/interactions": "^3.21.1", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.8.15", + "resolved": "https://registry.npmjs.org/@react-aria/visually-hidden/-/visually-hidden-3.8.15.tgz", + "integrity": "sha512-l+sJ7xTdD5Sd6+rDNDaeJCSPnHOsI+BaJyApvb/YcVgHa7rB47lp6TXCWUCDItcPY4JqRGyeByRJVrtzBFTWCw==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.22.2", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-aria/visually-hidden/node_modules/@react-aria/interactions": { - "version": "3.21.1", - "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.21.1.tgz", - "integrity": "sha512-AlHf5SOzsShkHfV8GLLk3v9lEmYqYHURKcXWue0JdYbmquMRkUsf/+Tjl1+zHVAQ8lKqRnPYbTmc4AcZbqxltw==", - "dependencies": { - "@react-aria/ssr": "^3.9.2", - "@react-aria/utils": "^3.23.2", - "@react-types/shared": "^3.22.1", + "version": "3.22.2", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.22.2.tgz", + "integrity": "sha512-xE/77fRVSlqHp2sfkrMeNLrqf2amF/RyuAS6T5oDJemRSgYM3UoxTbWjucPhfnoW7r32pFPHHgz4lbdX8xqD/g==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-aria/utils": "^3.25.2", + "@react-types/shared": "^3.24.1", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-dnd/asap": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@react-dnd/asap/-/asap-5.0.2.tgz", - "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==" + "integrity": "sha512-WLyfoHvxhs0V9U+GTsGilGgf2QsPl6ZZ44fnv0/b8T3nQyvzxidxsg/ZltbWssbsRDlYW8UKSQMTGotuTotZ6A==", + "license": "MIT" }, "node_modules/@react-dnd/invariant": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@react-dnd/invariant/-/invariant-4.0.2.tgz", - "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==" + "integrity": "sha512-xKCTqAK/FFauOM9Ta2pswIyT3D8AQlfrYdOi/toTPEhqCuAs1v5tcJ3Y08Izh1cJ5Jchwy9SeAXmMg6zrKs2iw==", + "license": "MIT" }, "node_modules/@react-dnd/shallowequal": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz", - "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==" + "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA==", + "license": "MIT" }, "node_modules/@react-stately/overlays": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.5.tgz", - "integrity": "sha512-U4rCFj6TPJPXLUvYXAcvh+yP/CO2W+7f0IuqP7ZZGE+Osk9qFkT+zRK5/6ayhBDFpmueNfjIEAzT9gYPQwNHFw==", + "version": "3.6.10", + "resolved": "https://registry.npmjs.org/@react-stately/overlays/-/overlays-3.6.10.tgz", + "integrity": "sha512-XxZ2qScT5JPwGk9qiVJE4dtVh3AXTcYwGRA5RsHzC26oyVVsegPqY2PmNJGblAh6Q57VyodoVUyebE0Eo5CzRw==", + "license": "Apache-2.0", "dependencies": { - "@react-stately/utils": "^3.9.1", - "@react-types/overlays": "^3.8.5", + "@react-stately/utils": "^3.10.3", + "@react-types/overlays": "^3.8.9", "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-stately/radio": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/@react-stately/radio/-/radio-3.9.1.tgz", "integrity": "sha512-DrQPHiP9pz1uQbBP/NDFdO8uOZigPbvuAWPUNK7Gq6kye5lW+RsS97IUnYJePNTSMvhiAVz/aleBt05Gr/PZmg==", + "license": "Apache-2.0", "dependencies": { "@react-stately/utils": "^3.8.0", "@react-types/radio": "^3.5.2", @@ -3126,6 +3207,7 @@ "version": "3.6.3", "resolved": "https://registry.npmjs.org/@react-stately/toggle/-/toggle-3.6.3.tgz", "integrity": "sha512-4kIMTjRjtaapFk4NVmBoFDUYfkmyqDaYAmHpRyEIHTDpBYn0xpxZL/MHv9WuLYa4MjJLRp0MeicuWiZ4ai7f6Q==", + "license": "Apache-2.0", "dependencies": { "@react-stately/utils": "^3.8.0", "@react-types/checkbox": "^3.5.2", @@ -3137,83 +3219,91 @@ } }, "node_modules/@react-stately/utils": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.9.1.tgz", - "integrity": "sha512-yzw75GE0iUWiyps02BOAPTrybcsMIxEJlzXqtvllAb01O9uX5n0i3X+u2eCpj2UoDF4zS08Ps0jPgWxg8xEYtA==", + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.10.3.tgz", + "integrity": "sha512-moClv7MlVSHpbYtQIkm0Cx+on8Pgt1XqtPx6fy9rQFb2DNc9u1G3AUVnqA17buOkH1vLxAtX4MedlxMWyRCYYA==", + "license": "Apache-2.0", "dependencies": { "@swc/helpers": "^0.5.0" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/button": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.2.tgz", - "integrity": "sha512-EnPTkGHZRtiwAoJy5q9lDjoG30bEzA/qnvKG29VVXKYAGeqY2IlFs1ypmU+z1X/CpJgPcG3I5cakM7yTVm3pSg==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/@react-types/button/-/button-3.9.6.tgz", + "integrity": "sha512-8lA+D5JLbNyQikf8M/cPP2cji91aVTcqjrGpDqI7sQnaLFikM8eFR6l1ZWGtZS5MCcbfooko77ha35SYplSQvw==", + "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.22.1" + "@react-types/shared": "^3.24.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/checkbox": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.7.1.tgz", - "integrity": "sha512-kuGqjQFex0As/3gfWyk+e9njCcad/ZdnYLLiNvhlk15730xfa0MmnOdpqo9jfuFSXBjOcpxoofvEhvrRMtEdUA==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@react-types/checkbox/-/checkbox-3.8.3.tgz", + "integrity": "sha512-f4c1mnLEt0iS1NMkyZXgT3q3AgcxzDk7w6MSONOKydcnh0xG5L2oefY14DhVDLkAuQS7jThlUFwiAs+MxiO3MA==", + "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.22.1" + "@react-types/shared": "^3.24.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/overlays": { - "version": "3.8.5", - "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.5.tgz", - "integrity": "sha512-4D7EEBQigD/m8hE68Ys8eloyyZFHHduqykSIgINJ0edmo0jygRbWlTwuhWFR9USgSP4dK54duN0Mvq0m4HEVEw==", + "version": "3.8.9", + "resolved": "https://registry.npmjs.org/@react-types/overlays/-/overlays-3.8.9.tgz", + "integrity": "sha512-9ni9upQgXPnR+K9cWmbYWvm3ll9gH8P/XsEZprqIV5zNLMF334jADK48h4jafb1X9RFnj0WbHo6BqcSObzjTig==", + "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.22.1" + "@react-types/shared": "^3.24.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/radio": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.7.1.tgz", - "integrity": "sha512-Zut3rN1odIUBLZdijeyou+UqsLeRE76d9A+npykYGu29ndqmo3w4sLn8QeQcdj1IR71ZnG0pW2Y2BazhK5XrrQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/@react-types/radio/-/radio-3.8.3.tgz", + "integrity": "sha512-fUVJt4Bb6jOReFqnhHVNxWXH7t6c60uSFfoPKuXt/xI9LL1i2jhpur0ggpTfIn3qLIAmNBU6bKBCWAdr4KjeVQ==", + "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.22.1" + "@react-types/shared": "^3.24.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/shared": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.22.1.tgz", - "integrity": "sha512-PCpa+Vo6BKnRMuOEzy5zAZ3/H5tnQg1e80khMhK2xys0j6ZqzkgQC+fHMNZ7VDFNLqqNMj/o0eVeSBDh2POjkw==", + "version": "3.24.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.24.1.tgz", + "integrity": "sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==", + "license": "Apache-2.0", "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@react-types/switch": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.1.tgz", - "integrity": "sha512-2LFEKMGeufqyYmeN/5dtkDkCPG6x9O4eu6aaBaJmPGon7C/l3yiFEgRue6oCUYc1HixR7Qlp0sPxk0tQeWzrSg==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/@react-types/switch/-/switch-3.5.5.tgz", + "integrity": "sha512-SZx1Bd+COhAOs/RTifbZG+uq/llwba7VAKx7XBeX4LeIz1dtguy5bigOBgFTMQi4qsIVCpybSWEEl+daj4XFPw==", + "license": "Apache-2.0", "dependencies": { - "@react-types/shared": "^3.22.1" + "@react-types/shared": "^3.24.1" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" } }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.19.2.tgz", + "integrity": "sha512-baiMx18+IMuD1yyvOGaHM9QrVUPGGG0jC+z+IPHnRJWUAUvaKuWKyE8gjDj2rzv3sz9zOGoRSPgeBVHRhZnBlA==", + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -3221,12 +3311,14 @@ "node_modules/@seznam/compose-react-refs": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@seznam/compose-react-refs/-/compose-react-refs-1.0.6.tgz", - "integrity": "sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q==" + "integrity": "sha512-izzOXQfeQLonzrIQb8u6LQ8dk+ymz3WXTIXjvOlTXHq6sbzROg3NWU+9TTAOpEoK9Bth24/6F/XrfHJ5yR5n6Q==", + "license": "ISC" }, "node_modules/@swc/helpers": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.8.tgz", - "integrity": "sha512-lruDGw3pnfM3wmZHeW7JuhkGQaJjPyiKjxeGhdmfoOT53Ic9qb5JLDNaK2HUdl1zLDeX28H221UvKjfdvSLVMg==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.4.0" } @@ -3235,6 +3327,7 @@ "version": "4.2.6", "resolved": "https://registry.npmjs.org/@tippyjs/react/-/react-4.2.6.tgz", "integrity": "sha512-91RicDR+H7oDSyPycI13q3b7o4O60wa2oRbjlz2fyRLmHImc4vyDwuUP8NtZaN0VARJY5hybvDYrFzhY9+Lbyw==", + "license": "MIT", "dependencies": { "tippy.js": "^6.3.1" }, @@ -3285,6 +3378,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -3321,12 +3415,14 @@ "node_modules/@types/d3-array": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -3335,6 +3431,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -3342,17 +3439,20 @@ "node_modules/@types/d3-chord": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==" + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -3361,17 +3461,20 @@ "node_modules/@types/d3-delaunay": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==" + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==" + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -3379,35 +3482,41 @@ "node_modules/@types/d3-dsv": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==" + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", - "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==" + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==" + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", "dependencies": { "@types/geojson": "*" } @@ -3415,12 +3524,14 @@ "node_modules/@types/d3-hierarchy": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", - "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A==" + "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A==", + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -3428,27 +3539,32 @@ "node_modules/@types/d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" + "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==" + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==" + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==" + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" }, "node_modules/@types/d3-sankey": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz", "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==", + "license": "MIT", "dependencies": { "@types/d3-shape": "^1" } @@ -3456,12 +3572,14 @@ "node_modules/@types/d3-sankey/node_modules/@types/d3-path": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", - "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" + "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==", + "license": "MIT" }, "node_modules/@types/d3-sankey/node_modules/@types/d3-shape": { "version": "1.3.12", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", "integrity": "sha512-8oMzcd4+poSLGgV0R1Q1rOlx/xdmozS4Xab7np0eamFFUYq71AU9pOCJEFnkXW2aI/oXdVYJzw6pssbSut7Z9Q==", + "license": "MIT", "dependencies": { "@types/d3-path": "^1" } @@ -3470,6 +3588,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "license": "MIT", "dependencies": { "@types/d3-time": "*" } @@ -3477,17 +3596,20 @@ "node_modules/@types/d3-scale-chromatic": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==" + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", + "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==" + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", + "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "license": "MIT", "dependencies": { "@types/d3-path": "*" } @@ -3495,22 +3617,26 @@ "node_modules/@types/d3-time": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==" + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } @@ -3519,6 +3645,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -3577,12 +3704,14 @@ "node_modules/@types/geojson": { "version": "7946.0.14", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "license": "MIT" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -3642,12 +3771,14 @@ "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" }, "node_modules/@types/polylabel": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.1.3.tgz", - "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==" + "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==", + "license": "MIT" }, "node_modules/@types/prop-types": { "version": "15.7.12", @@ -3689,6 +3820,7 @@ "version": "7.1.33", "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz", "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==", + "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -3697,9 +3829,10 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", "dependencies": { "@types/react": "*" } @@ -3763,7 +3896,8 @@ "node_modules/@types/svg-arc-to-cubic-bezier": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.2.tgz", - "integrity": "sha512-XQtKy9lmkKlV+c3Jelo7kxNPw7qOqIq3GcnOhywGZHF7zw5D5m+Ssigbmf3Turbe/A8Ur+lRh8TYjuxXKvyivw==" + "integrity": "sha512-XQtKy9lmkKlV+c3Jelo7kxNPw7qOqIq3GcnOhywGZHF7zw5D5m+Ssigbmf3Turbe/A8Ur+lRh8TYjuxXKvyivw==", + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.10", @@ -4256,9 +4390,10 @@ } }, "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.21.25", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.21.25.tgz", - "integrity": "sha512-eeUKlmEE8aSoSgelS8OR2elcPGntpRo669XinAqPCLa0eKorT2B0d3ts+AE+njAeGk744tiyAEbHb2n+6OQmJw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.23.2.tgz", + "integrity": "sha512-eacivkj7wzskl2HBYs4rfN0CbYlsSQh5ADtOYWTpc8Txm4ONw8RTi4/rxF6Ks2vdaovizewU5QaHximbxoNTrw==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -4282,15 +4417,16 @@ } }, "node_modules/@uiw/react-codemirror": { - "version": "4.21.25", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.21.25.tgz", - "integrity": "sha512-mBrCoiffQ+hbTqV1JoixFEcH7BHXkS3PjTyNH7dE8Gzf3GSBRazhtSM5HrAFIiQ5FIRGFs8Gznc4UAdhtevMmw==", + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.23.2.tgz", + "integrity": "sha512-MmFL6P5V1Mr81JLkJyWNedfxENKdRhsvyU7Izji9wp337m8dqRAz7rCF5XWarGKx+iQ7q2H5ryl07nLqKLSvtQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.6", "@codemirror/commands": "^6.1.0", "@codemirror/state": "^6.1.1", "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.21.25", + "@uiw/codemirror-extensions-basic-setup": "4.23.2", "codemirror": "^6.0.0" }, "funding": { @@ -4313,9 +4449,10 @@ "dev": true }, "node_modules/@vtaits/use-lazy-ref": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@vtaits/use-lazy-ref/-/use-lazy-ref-0.1.1.tgz", - "integrity": "sha512-aNXf1bBLMZKUfm7buFn/cmjfsDhT8WLOBEc0x44Su2BwMtVTflfowO7qtNODqCBLXtI+P/xiatepgK8OzPAKEQ==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@vtaits/use-lazy-ref/-/use-lazy-ref-0.1.3.tgz", + "integrity": "sha512-ZTLuFBHSivPcgWrwkXe5ExVt6R3/ybD+N0yFPy4ClzCztk/9bUD/1udKQ/jd7eCal+lapSrRWXbffqI9jkpDlg==", + "license": "MIT", "peerDependencies": { "react": "^16.14.0 || ^17.0.0 || ^18.0.0" } @@ -4891,6 +5028,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -4981,7 +5119,8 @@ "node_modules/base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "license": "MIT" }, "node_modules/batch": { "version": "0.6.1", @@ -5096,6 +5235,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", "dependencies": { "base64-js": "^1.1.2" } @@ -5314,6 +5454,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", "engines": { "node": ">=0.8" } @@ -5333,9 +5474,10 @@ } }, "node_modules/clsx": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", - "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -5344,6 +5486,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", + "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -5377,6 +5520,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", "engines": { "node": ">= 10" } @@ -5477,7 +5621,8 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" }, "node_modules/cookie": { "version": "0.6.0", @@ -5517,6 +5662,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -5532,6 +5678,7 @@ "version": "15.7.0", "resolved": "https://registry.npmjs.org/create-react-class/-/create-react-class-15.7.0.tgz", "integrity": "sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==", + "license": "MIT", "dependencies": { "loose-envify": "^1.3.1", "object-assign": "^4.1.1" @@ -5540,7 +5687,8 @@ "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -5559,12 +5707,14 @@ "node_modules/crypto-js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, "node_modules/css-box-model": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "license": "MIT", "dependencies": { "tiny-invariant": "^1.0.6" } @@ -5578,6 +5728,7 @@ "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -5618,6 +5769,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -5629,6 +5781,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5637,6 +5790,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -5652,6 +5806,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -5663,6 +5818,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5671,6 +5827,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -5682,6 +5839,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -5693,6 +5851,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5701,6 +5860,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -5713,6 +5873,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -5737,6 +5898,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", "engines": { "node": ">=12" } @@ -5745,6 +5907,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -5756,6 +5919,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -5769,6 +5933,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5777,6 +5942,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -5788,6 +5954,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5796,6 +5963,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -5807,6 +5975,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5815,6 +5984,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5823,6 +5993,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5831,6 +6002,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5839,6 +6011,7 @@ "version": "0.12.3", "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" @@ -5848,6 +6021,7 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" } @@ -5855,12 +6029,14 @@ "node_modules/d3-sankey/node_modules/d3-path": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" }, "node_modules/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" } @@ -5868,12 +6044,14 @@ "node_modules/d3-sankey/node_modules/internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -5889,6 +6067,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -5901,6 +6080,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5909,6 +6089,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -5920,6 +6101,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -5931,6 +6113,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -5942,6 +6125,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -5950,6 +6134,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -5968,6 +6153,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/d3-voronoi-map/-/d3-voronoi-map-2.1.1.tgz", "integrity": "sha512-mCXfz/kD9IQxjHaU2IMjkO8fSo4J6oysPR2iL+omDsCy1i1Qn6BQ/e4hEAW8C6ms2kfuHwqtbNom80Hih94YsA==", + "license": "BSD-3-Clause", "dependencies": { "d3-dispatch": "2.*", "d3-polygon": "2.*", @@ -5978,22 +6164,26 @@ "node_modules/d3-voronoi-map/node_modules/d3-dispatch": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", - "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==", + "license": "BSD-3-Clause" }, "node_modules/d3-voronoi-map/node_modules/d3-polygon": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", - "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-voronoi-map/node_modules/d3-timer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", - "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==", + "license": "BSD-3-Clause" }, "node_modules/d3-voronoi-treemap": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/d3-voronoi-treemap/-/d3-voronoi-treemap-1.1.2.tgz", "integrity": "sha512-7odu9HdG/yLPWwzDteJq4yd9Q/NwgQV7IE/u36VQtcCK7k1sZwDqbkHCeMKNTBsq5mQjDwolTsrXcU0j8ZEMCA==", + "license": "BSD-3-Clause", "dependencies": { "d3-voronoi-map": "2.*" } @@ -6002,6 +6192,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/d3-weighted-voronoi/-/d3-weighted-voronoi-1.1.3.tgz", "integrity": "sha512-C3WdvSKl9aqhAy+f3QT3PPsQG6V+ajDfYO3BSclQDSD+araW2xDBFIH67aKzsSuuuKaX8K2y2dGq1fq/dWTVig==", + "license": "BSD-3-Clause", "dependencies": { "d3-array": "2", "d3-polygon": "2" @@ -6011,6 +6202,7 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" } @@ -6018,17 +6210,20 @@ "node_modules/d3-weighted-voronoi/node_modules/d3-polygon": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", - "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "license": "BSD-3-Clause" }, "node_modules/d3-weighted-voronoi/node_modules/internmap": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" }, "node_modules/d3-zoom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6101,6 +6296,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -6127,6 +6323,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", "dependencies": { "is-arguments": "^1.1.1", "is-date-object": "^1.0.5", @@ -6205,6 +6402,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" } @@ -6246,7 +6444,8 @@ "node_modules/dfa": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==" + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -6264,6 +6463,7 @@ "version": "16.0.1", "resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-16.0.1.tgz", "integrity": "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng==", + "license": "MIT", "dependencies": { "@react-dnd/asap": "^5.0.1", "@react-dnd/invariant": "^4.0.1", @@ -6298,6 +6498,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -6359,6 +6560,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } @@ -7362,7 +7564,8 @@ "node_modules/exenv": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "license": "BSD-3-Clause" }, "node_modules/express": { "version": "4.19.2", @@ -7572,7 +7775,8 @@ "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -7616,7 +7820,8 @@ "node_modules/flatpickr": { "version": "4.6.13", "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", - "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==" + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==", + "license": "MIT" }, "node_modules/flatted": { "version": "3.3.1", @@ -7672,9 +7877,10 @@ } }, "node_modules/froala-editor": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/froala-editor/-/froala-editor-4.1.4.tgz", - "integrity": "sha512-oWF8SZNtLvfweURV5T0WYO69ZQpB1LQiGO2e6zoYRAlOwmqlW5yqLWfGi0tfn99qOgZ/4dxqBBDxqfOsRCQFiA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/froala-editor/-/froala-editor-4.2.2.tgz", + "integrity": "sha512-7vMbhl7KpoD8IdCR7sFVI/eh/mvTmVctPmFHyd8bveHk5jq1Mw2j2oYTkdwhTRKjTLnQO4XgbIgyzzdxDpuedQ==", + "license": "https://www.froala.com/wysiwyg-editor/pricing" }, "node_modules/fs-monkey": { "version": "1.0.5", @@ -8002,6 +8208,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } @@ -8149,6 +8356,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8306,6 +8514,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", "engines": { "node": ">=12" } @@ -8320,13 +8529,14 @@ } }, "node_modules/intl-messageformat": { - "version": "10.5.11", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.11.tgz", - "integrity": "sha512-eYq5fkFBVxc7GIFDzpFQkDOZgNayNTQn4Oufe8jw6YY6OHVw70/4pA3FyCsQ0Gb2DnvEJEMmN2tOaXUGByM+kg==", + "version": "10.5.14", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.14.tgz", + "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", + "license": "BSD-3-Clause", "dependencies": { - "@formatjs/ecma402-abstract": "1.18.2", + "@formatjs/ecma402-abstract": "2.0.0", "@formatjs/fast-memoize": "2.2.0", - "@formatjs/icu-messageformat-parser": "2.7.6", + "@formatjs/icu-messageformat-parser": "2.7.8", "tslib": "^2.4.0" } }, @@ -8343,6 +8553,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8373,7 +8584,8 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" }, "node_modules/is-async-function": { "version": "2.0.0", @@ -8961,6 +9173,12 @@ "node": ">=0.10.0" } }, + "node_modules/krustykrab": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/krustykrab/-/krustykrab-1.1.0.tgz", + "integrity": "sha512-xpX9MPbw+nJseewe6who9Oq46RQwrBfps+dO/N4fSjJhsf2+y4XWC2kz46oBGX8yzMHyYJj35ug0X5s5yxB6tA==", + "license": "MIT" + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -9005,7 +9223,8 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", @@ -9066,7 +9285,8 @@ "node_modules/markerjs2": { "version": "2.32.1", "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.32.1.tgz", - "integrity": "sha512-OGBINMGhXwTXZF/k0ky9vciPm8C3/bsDZUJroZrIvoX0xv3OWYBEDiUSmgRpiLkCv5Z4Q7RaYxhza/iafc25zw==" + "integrity": "sha512-OGBINMGhXwTXZF/k0ky9vciPm8C3/bsDZUJroZrIvoX0xv3OWYBEDiUSmgRpiLkCv5Z4Q7RaYxhza/iafc25zw==", + "license": "SEE LICENSE IN LICENSE" }, "node_modules/media-typer": { "version": "0.3.0", @@ -9092,7 +9312,8 @@ "node_modules/memoize-one": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", + "license": "MIT" }, "node_modules/merge-descriptors": { "version": "1.0.1", @@ -9306,6 +9527,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -9563,7 +9785,8 @@ "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==" + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT" }, "node_modules/parent-module": { "version": "1.0.1", @@ -9580,6 +9803,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -9649,9 +9873,10 @@ } }, "node_modules/pdfmake": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.10.tgz", - "integrity": "sha512-doipFnmE1UHSk+Z3wfQuVweVQqx2pE/Ns2G5gCqZmWwqjDj+mZHnZYH/ryXWoIfD+iVdZUAutgI/VHkTCN+Xrw==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.12.tgz", + "integrity": "sha512-TFsqaG6KVtk+TWermmJNNwom3wmB/xiz07prM74KBhdM+7pz3Uwq2b0uoqhhQRn6cYUTpL8lXZY6xF011o1YcQ==", + "license": "MIT", "dependencies": { "@foliojs-fork/linebreak": "^1.1.1", "@foliojs-fork/pdfkit": "^0.14.0", @@ -9785,6 +10010,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", + "license": "ISC", "dependencies": { "tinyqueue": "^2.0.3" } @@ -9907,7 +10133,8 @@ "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -9978,6 +10205,7 @@ "version": "13.1.1", "resolved": "https://registry.npmjs.org/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", + "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.9.2", "css-box-model": "^1.2.0", @@ -10001,9 +10229,10 @@ } }, "node_modules/react-datepicker": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.6.0.tgz", - "integrity": "sha512-ERC0/Q4pPC9bNIcGUpdCbHc+oCxhkU3WI3UOGHkyJ3A9fqALCYpEmLc5S5xvAd7DuCDdbsyW97oRPM6pWWwjww==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-7.3.0.tgz", + "integrity": "sha512-EqRKLAtLZUTztiq6a+tjSjQX9ES0Xd229JPckAtyZZ4GoY3rtvNWAzkYZnQUf6zTWT50Ki0+t+W9VRQIkSJLfg==", + "license": "MIT", "dependencies": { "@floating-ui/react": "^0.26.2", "clsx": "^2.1.0", @@ -10020,6 +10249,7 @@ "version": "16.0.1", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", "integrity": "sha512-QeoM/i73HHu2XF9aKksIUuamHPDvRglEwdHL4jsp784BgUuWcg6mzfxT0QDdQz8Wj0qyRKx2eMg8iZtWvU4E2Q==", + "license": "MIT", "dependencies": { "@react-dnd/invariant": "^4.0.1", "@react-dnd/shallowequal": "^4.0.1", @@ -10049,6 +10279,7 @@ "version": "16.0.1", "resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-16.0.1.tgz", "integrity": "sha512-Wu3dw5aDJmOGw8WjH1I1/yTH+vlXEL4vmjk5p+MHxP8HuHJS1lAGeIdG/hze1AvNeXWo/JgULV87LyQOr+r5jw==", + "license": "MIT", "dependencies": { "dnd-core": "^16.0.1" } @@ -10066,12 +10297,13 @@ } }, "node_modules/react-froala-wysiwyg": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/react-froala-wysiwyg/-/react-froala-wysiwyg-4.1.4.tgz", - "integrity": "sha512-gykUmilMhq7uGqPDrFPEvCUE6KAa6ZdBL6Cp9joCm9RA/M2nio150Ug/DGFO1zGYEBMpXDeL7JaFaOhkxldSAA==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/react-froala-wysiwyg/-/react-froala-wysiwyg-4.2.2.tgz", + "integrity": "sha512-lkrq/EGUa9vz+6EozYaDirqng4XL16ALyuMEbUaYCIM+/+AqOH9v3yhiOPan6Ohg7LfnV22AztpvH95imJTwaw==", + "license": "MIT", "dependencies": { "create-react-class": "^15.5.2", - "froala-editor": "4.1.4" + "froala-editor": "4.2.2" }, "peerDependencies": { "react": "~0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", @@ -10095,12 +10327,14 @@ "node_modules/react-lifecycles-compat": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", + "license": "MIT" }, "node_modules/react-modal": { "version": "3.16.1", "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "license": "MIT", "dependencies": { "exenv": "^1.2.0", "prop-types": "^15.7.2", @@ -10116,9 +10350,10 @@ } }, "node_modules/react-onclickoutside": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.0.tgz", - "integrity": "sha512-ty8So6tcUpIb+ZE+1HAhbLROvAIJYyJe/1vRrrcmW+jLsaM+/powDRqxzo6hSh9CuRZGSL1Q8mvcF5WRD93a0A==", + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", + "license": "MIT", "funding": { "type": "individual", "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" @@ -10132,6 +10367,7 @@ "version": "7.2.9", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.9.tgz", "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.15.4", "@types/react-redux": "^7.1.20", @@ -10155,14 +10391,16 @@ "node_modules/react-redux/node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.26.2.tgz", + "integrity": "sha512-tvN1iuT03kHgOFnLPfLJ8V95eijteveqdOSk+srqfePtQvqCExB8eHOYnlilbOcyJyKnYkr1vJvf7YqotAJu1A==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.19.2" }, "engines": { "node": ">=14.0.0" @@ -10172,12 +10410,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.26.2.tgz", + "integrity": "sha512-z7YkaEW0Dy35T3/QKPYB1LjMK2R1fxnHO8kWpUMTBdfVzZrWOiY9a7CtN8HqdWtDUWd5FY6Dl8HFsqVwH4uOtQ==", + "license": "MIT", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.19.2", + "react-router": "6.26.2" }, "engines": { "node": ">=14.0.0" @@ -10188,9 +10427,10 @@ } }, "node_modules/react-select": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", - "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.1.tgz", + "integrity": "sha512-RT1CJmuc+ejqm5MPgzyZujqDskdvB9a9ZqrdnVLsvAHjJ3Tj0hELnLeVPQlmYdVKCdCpxanepl6z7R5KhXhWzg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", @@ -10208,14 +10448,17 @@ } }, "node_modules/react-select-async-paginate": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/react-select-async-paginate/-/react-select-async-paginate-0.7.3.tgz", - "integrity": "sha512-5r1vcXsVhG2zWbEEAnsnT55UIbU0H0kW+l0x/qJyEX/jwmn+7DyI8DbV92GYa4V4WsmMg224eki00erayqK/sQ==", + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/react-select-async-paginate/-/react-select-async-paginate-0.7.6.tgz", + "integrity": "sha512-aaQpzdfSUbGC8AaagxE8PuqJrwnDVu6Nx/J4cWPzpMwDyP1SEJonwnjZg3iI/zbUIRIpP+Mj5hrp2m7YeZXJvA==", + "license": "MIT", "dependencies": { "@seznam/compose-react-refs": "^1.0.6", - "@vtaits/use-lazy-ref": "^0.1.0", + "@vtaits/use-lazy-ref": "^0.1.3", + "krustykrab": "^1.1.0", "sleep-promise": "^9.1.0", - "use-is-mounted-ref": "^1.5.0" + "use-is-mounted-ref": "^1.5.0", + "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.14.0 || ^17.0.0 || ^18.0.0", @@ -10225,12 +10468,14 @@ "node_modules/react-select/node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" }, "node_modules/react-textarea-autosize": { "version": "8.5.3", "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.3.tgz", "integrity": "sha512-XT1024o2pqCuZSuBt9FwHlaDeNtVrtCXu0Rnz88t1jUGheCLa3PhjE1GH8Ctm2axEtvdCl5SUHYschyQ0L5QHQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", @@ -10260,6 +10505,7 @@ "version": "4.4.5", "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -10313,6 +10559,7 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.9.2" } @@ -10531,7 +10778,8 @@ "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -10559,7 +10807,8 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { "version": "1.1.2", @@ -10622,9 +10871,10 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" }, "node_modules/scheduler": { "version": "0.23.2", @@ -10690,7 +10940,8 @@ "node_modules/seedrandom": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT" }, "node_modules/select-hose": { "version": "2.0.0", @@ -10981,7 +11232,8 @@ "node_modules/sleep-promise": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz", - "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==" + "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==", + "license": "MIT" }, "node_modules/sockjs": { "version": "0.3.24", @@ -11007,6 +11259,7 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -11198,12 +11451,14 @@ "node_modules/style-mod": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "license": "MIT" }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", @@ -11230,7 +11485,8 @@ "node_modules/svg-arc-to-cubic-bezier": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC" }, "node_modules/systemjs-webpack-interop": { "version": "2.3.7", @@ -11244,7 +11500,8 @@ "node_modules/tabbable": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", @@ -11346,22 +11603,26 @@ "node_modules/tiny-inflate": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" }, "node_modules/tinyqueue": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "license": "ISC" }, "node_modules/tippy.js": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", + "license": "MIT", "dependencies": { "@popperjs/core": "^2.9.0" } @@ -11432,9 +11693,10 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -11615,6 +11877,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" @@ -11633,6 +11896,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" @@ -11690,25 +11954,28 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/use-debounce": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.0.tgz", - "integrity": "sha512-XRjvlvCB46bah9IBXVnq/ACP2lxqXyZj0D9hj4K5OzNroMDpTEBg8Anuh1/UfRTRs7pLhQ+RiNxxwZu9+MVl1A==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.3.tgz", + "integrity": "sha512-DxQSI9ZKso689WM1mjgGU3ozcxU1TJElBJ3X6S4SMzMNcm2lVH0AHmyXB+K7ewjz2BSUKJTDqTcwtSMRfB89dg==", + "license": "MIT", "engines": { "node": ">= 16.0.0" }, "peerDependencies": { - "react": ">=16.8.0" + "react": "*" } }, "node_modules/use-is-mounted-ref": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/use-is-mounted-ref/-/use-is-mounted-ref-1.5.0.tgz", "integrity": "sha512-p5FksHf/ospZUr5KU9ese6u3jp9fzvZ3wuSb50i0y6fdONaHWgmOqQtxR/PUcwi6hnhQDbNxWSg3eTK3N6m+dg==", + "license": "MIT", "peerDependencies": { "react": ">=16.0.0" } @@ -11717,6 +11984,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, @@ -11730,6 +11998,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "license": "MIT", "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, @@ -11746,6 +12015,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz", "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", + "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -11754,6 +12024,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", + "license": "MIT", "dependencies": { "@juggle/resize-observer": "^3.3.1" }, @@ -11778,13 +12049,14 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -11801,12 +12073,14 @@ "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", "dependencies": { "loose-envify": "^1.0.0" } @@ -12233,6 +12507,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.3.0.tgz", "integrity": "sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng==", + "license": "MIT", "dependencies": { "sax": "^1.2.4" } @@ -12247,6 +12522,7 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", "engines": { "node": ">= 6" } diff --git a/src/Kentico.Xperience.Algolia/Admin/Client/package.json b/src/Kentico.Xperience.Algolia/Admin/Client/package.json index ccc7d36..b39c871 100644 --- a/src/Kentico.Xperience.Algolia/Admin/Client/package.json +++ b/src/Kentico.Xperience.Algolia/Admin/Client/package.json @@ -13,8 +13,8 @@ "node": ">=18.12.0 <=19" }, "dependencies": { - "@kentico/xperience-admin-base": "28.4.3", - "@kentico/xperience-admin-components": "28.4.3", + "@kentico/xperience-admin-base": "29.5.0", + "@kentico/xperience-admin-components": "29.5.0", "react": "18.3.1", "react-dom": "18.3.1", "react-icons": "5.2.1", diff --git a/src/Kentico.Xperience.Algolia/Admin/Client/src/templates/AlgoliaIndexConfigurationFormComponent.tsx b/src/Kentico.Xperience.Algolia/Admin/Client/src/templates/AlgoliaIndexConfigurationFormComponent.tsx index 6b45e35..7e649f3 100644 --- a/src/Kentico.Xperience.Algolia/Admin/Client/src/templates/AlgoliaIndexConfigurationFormComponent.tsx +++ b/src/Kentico.Xperience.Algolia/Admin/Client/src/templates/AlgoliaIndexConfigurationFormComponent.tsx @@ -421,7 +421,7 @@ export const AlgoliaIndexConfigurationFormComponent = ( defaultValue={contentTypesValue} options={options} onChange={selectContentTypes} - placeholder="Select a tag type" + placeholder="Select content types" styles={customStyle} hideSelectedOptions={false} components={{ MultiValueRemove, ClearIndicator, Option }} diff --git a/src/Kentico.Xperience.Algolia/Admin/DefaultAlgoliaConfigurationStorageService.cs b/src/Kentico.Xperience.Algolia/Admin/DefaultAlgoliaConfigurationStorageService.cs index f1f6048..61c8cb1 100644 --- a/src/Kentico.Xperience.Algolia/Admin/DefaultAlgoliaConfigurationStorageService.cs +++ b/src/Kentico.Xperience.Algolia/Admin/DefaultAlgoliaConfigurationStorageService.cs @@ -5,22 +5,25 @@ namespace Kentico.Xperience.Algolia.Admin; internal class DefaultAlgoliaConfigurationStorageService : IAlgoliaConfigurationStorageService { - private readonly IAlgoliaIndexItemInfoProvider indexProvider; - private readonly IAlgoliaIncludedPathItemInfoProvider pathProvider; - private readonly IAlgoliaContentTypeItemInfoProvider contentTypeProvider; - private readonly IAlgoliaIndexLanguageItemInfoProvider languageProvider; + private readonly IInfoProvider indexProvider; + private readonly IInfoProvider pathProvider; + private readonly IInfoProvider contentTypeProvider; + private readonly IInfoProvider languageProvider; + private readonly IInfoProvider reusableContentTypeProvider; public DefaultAlgoliaConfigurationStorageService( - IAlgoliaIndexItemInfoProvider indexProvider, - IAlgoliaIncludedPathItemInfoProvider pathProvider, - IAlgoliaContentTypeItemInfoProvider contentTypeProvider, - IAlgoliaIndexLanguageItemInfoProvider languageProvider + IInfoProvider indexProvider, + IInfoProvider pathProvider, + IInfoProvider contentTypeProvider, + IInfoProvider languageProvider, + IInfoProvider reusableContentTypeProvider ) { this.indexProvider = indexProvider; this.pathProvider = pathProvider; this.contentTypeProvider = contentTypeProvider; this.languageProvider = languageProvider; + this.reusableContentTypeProvider = reusableContentTypeProvider; } private static string RemoveWhitespacesUsingStringBuilder(string source) @@ -36,6 +39,8 @@ private static string RemoveWhitespacesUsingStringBuilder(string source) } return source.Length == builder.Length ? source : builder.ToString(); } + + public bool TryCreateIndex(AlgoliaConfigurationModel configuration) { var existingIndex = indexProvider.Get() @@ -50,10 +55,10 @@ public bool TryCreateIndex(AlgoliaConfigurationModel configuration) var newInfo = new AlgoliaIndexItemInfo() { - AlgoliaIndexItemIndexName = configuration.IndexName ?? "", - AlgoliaIndexItemChannelName = configuration.ChannelName ?? "", - AlgoliaIndexItemStrategyName = configuration.StrategyName ?? "", - AlgoliaIndexItemRebuildHook = configuration.RebuildHook ?? "" + AlgoliaIndexItemIndexName = configuration.IndexName ?? string.Empty, + AlgoliaIndexItemChannelName = configuration.ChannelName ?? string.Empty, + AlgoliaIndexItemStrategyName = configuration.StrategyName ?? string.Empty, + AlgoliaIndexItemRebuildHook = configuration.RebuildHook ?? string.Empty }; indexProvider.Set(newInfo); @@ -101,8 +106,24 @@ public bool TryCreateIndex(AlgoliaConfigurationModel configuration) } } + if (configuration.ReusableContentTypeNames is not null) + { + foreach (string? reusableContentTypeName in configuration.ReusableContentTypeNames) + { + var reusableContentTypeItemInfo = new AlgoliaReusableContentTypeItemInfo() + { + AlgoliaReusableContentTypeItemContentTypeName = reusableContentTypeName, + AlgoliaReusableContentTypeItemIndexItemId = newInfo.AlgoliaIndexItemId + }; + + reusableContentTypeItemInfo.Insert(); + } + } + return true; } + + public AlgoliaConfigurationModel? GetIndexDataOrNull(int indexId) { var indexInfo = indexProvider.Get().WithID(indexId).FirstOrDefault(); @@ -128,13 +149,20 @@ public bool TryCreateIndex(AlgoliaConfigurationModel configuration) ).GetEnumerableTypedResult() .Select(x => new AlgoliaIndexContentType(x.ClassName, x.ClassDisplayName)); + var reusableContentTypes = reusableContentTypeProvider.Get().WhereEquals(nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId), indexInfo.AlgoliaIndexItemId).GetEnumerableTypedResult(); var languages = languageProvider.Get().WhereEquals(nameof(AlgoliaIndexLanguageItemInfo.AlgoliaIndexLanguageItemIndexItemId), indexInfo.AlgoliaIndexItemId).GetEnumerableTypedResult(); - return new AlgoliaConfigurationModel(indexInfo, languages, paths, contentTypes); + return new AlgoliaConfigurationModel(indexInfo, languages, paths, contentTypes, reusableContentTypes); } + + public List GetExistingIndexNames() => indexProvider.Get().Select(x => x.AlgoliaIndexItemIndexName).ToList(); + + public List GetIndexIds() => indexProvider.Get().Select(x => x.AlgoliaIndexItemId).ToList(); + + public IEnumerable GetAllIndexData() { var indexInfos = indexProvider.Get().GetEnumerableTypedResult().ToList(); @@ -161,11 +189,15 @@ public IEnumerable GetAllIndexData() var languages = languageProvider.Get().ToList(); - return indexInfos.Select(index => new AlgoliaConfigurationModel(index, languages, paths, contentTypes)); + var reusableContentTypes = reusableContentTypeProvider.Get().ToList(); + + return indexInfos.Select(index => new AlgoliaConfigurationModel(index, languages, paths, contentTypes, reusableContentTypes)); } + + public bool TryEditIndex(AlgoliaConfigurationModel configuration) { - configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? ""); + configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? string.Empty); var indexInfo = indexProvider.Get() .WhereEquals(nameof(AlgoliaIndexItemInfo.AlgoliaIndexItemId), configuration.Id) @@ -181,10 +213,10 @@ public bool TryEditIndex(AlgoliaConfigurationModel configuration) languageProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIndexLanguageItemInfo.AlgoliaIndexLanguageItemIndexItemId)} = {configuration.Id}")); contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaContentTypeItemInfo.AlgoliaContentTypeItemIndexItemId)} = {configuration.Id}")); - indexInfo.AlgoliaIndexItemRebuildHook = configuration.RebuildHook ?? ""; - indexInfo.AlgoliaIndexItemStrategyName = configuration.StrategyName ?? ""; - indexInfo.AlgoliaIndexItemChannelName = configuration.ChannelName ?? ""; - indexInfo.AlgoliaIndexItemIndexName = configuration.IndexName ?? ""; + indexInfo.AlgoliaIndexItemRebuildHook = configuration.RebuildHook ?? string.Empty; + indexInfo.AlgoliaIndexItemStrategyName = configuration.StrategyName ?? string.Empty; + indexInfo.AlgoliaIndexItemChannelName = configuration.ChannelName ?? string.Empty; + indexInfo.AlgoliaIndexItemIndexName = configuration.IndexName ?? string.Empty; indexProvider.Set(indexInfo); @@ -219,7 +251,7 @@ public bool TryEditIndex(AlgoliaConfigurationModel configuration) { var contentInfo = new AlgoliaContentTypeItemInfo() { - AlgoliaContentTypeItemContentTypeName = contentType.ContentTypeName ?? "", + AlgoliaContentTypeItemContentTypeName = contentType.ContentTypeName ?? string.Empty, AlgoliaContentTypeItemIncludedPathItemId = pathInfo.AlgoliaIncludedPathItemId, AlgoliaContentTypeItemIndexItemId = indexInfo.AlgoliaIndexItemId, }; @@ -229,26 +261,72 @@ public bool TryEditIndex(AlgoliaConfigurationModel configuration) } } + RemoveUnusedReusableContentTypes(configuration); + SetNewIndexReusableContentTypeItems(configuration, indexInfo); + return true; } + public bool TryDeleteIndex(int id) { indexProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIndexItemInfo.AlgoliaIndexItemId)} = {id}")); pathProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIncludedPathItemInfo.AlgoliaIncludedPathItemIndexItemId)} = {id}")); languageProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIndexLanguageItemInfo.AlgoliaIndexLanguageItemIndexItemId)} = {id}")); contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaContentTypeItemInfo.AlgoliaContentTypeItemIndexItemId)} = {id}")); + reusableContentTypeProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId)} = {id}")); return true; } + public bool TryDeleteIndex(AlgoliaConfigurationModel configuration) { indexProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIndexItemInfo.AlgoliaIndexItemId)} = {configuration.Id}")); pathProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIncludedPathItemInfo.AlgoliaIncludedPathItemIndexItemId)} = {configuration.Id}")); languageProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaIndexLanguageItemInfo.AlgoliaIndexLanguageItemIndexItemId)} = {configuration.Id}")); contentTypeProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaContentTypeItemInfo.AlgoliaContentTypeItemIndexItemId)} = {configuration.Id}")); + reusableContentTypeProvider.BulkDelete(new WhereCondition($"{nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId)} = {configuration.Id}")); return true; } + + + private void RemoveUnusedReusableContentTypes(AlgoliaConfigurationModel configuration) + { + var removeReusableContentTypesQuery = reusableContentTypeProvider + .Get() + .WhereEquals(nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId), configuration.Id) + .WhereNotIn(nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemContentTypeName), configuration.ReusableContentTypeNames.ToArray()); + + reusableContentTypeProvider.BulkDelete(new WhereCondition(removeReusableContentTypesQuery)); + } + + + private void SetNewIndexReusableContentTypeItems(AlgoliaConfigurationModel configuration, AlgoliaIndexItemInfo indexInfo) + { + var newReusableContentTypes = GetNewReusableContentTypesOnIndex(configuration); + + foreach (string? reusableContentType in newReusableContentTypes) + { + var reusableContentTypeInfo = new AlgoliaReusableContentTypeItemInfo() + { + AlgoliaReusableContentTypeItemContentTypeName = reusableContentType, + AlgoliaReusableContentTypeItemIndexItemId = indexInfo.AlgoliaIndexItemId, + }; + + reusableContentTypeProvider.Set(reusableContentTypeInfo); + } + } + + + private IEnumerable GetNewReusableContentTypesOnIndex(AlgoliaConfigurationModel configuration) + { + var existingReusableContentTypes = reusableContentTypeProvider + .Get() + .WhereEquals(nameof(AlgoliaReusableContentTypeItemInfo.AlgoliaReusableContentTypeItemIndexItemId), configuration.Id) + .GetEnumerableTypedResult(); + + return configuration.ReusableContentTypeNames.Where(x => !existingReusableContentTypes.Any(y => y.AlgoliaReusableContentTypeItemContentTypeName == x)); + } } diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfo.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfo.generated.cs index 2c3cd0b..83d057b 100644 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfo.generated.cs +++ b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfo.generated.cs @@ -16,7 +16,7 @@ namespace Kentico.Xperience.Algolia.Admin; /// Data container class for . /// [Serializable] -public partial class AlgoliaContentTypeItemInfo : AbstractInfo +public partial class AlgoliaContentTypeItemInfo : AbstractInfo> { /// /// Object type. @@ -27,7 +27,7 @@ public partial class AlgoliaContentTypeItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(AlgoliaContentTypeItemInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaContentTypeItem", nameof(AlgoliaContentTypeItemId), null, nameof(AlgoliaContentTypeItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaContentTypeItem", nameof(AlgoliaContentTypeItemId), null, nameof(AlgoliaContentTypeItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfoProvider.generated.cs deleted file mode 100644 index 6e5a88a..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/AlgoliaContentTypeItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(IAlgoliaContentTypeItemInfoProvider))] -public partial class AlgoliaContentTypeItemInfoProvider : AbstractInfoProvider, IAlgoliaContentTypeItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public AlgoliaContentTypeItemInfoProvider() - : base(AlgoliaContentTypeItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.cs deleted file mode 100644 index ee454cd..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaContentTypeItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.generated.cs deleted file mode 100644 index 6479e31..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaContentTypeItem/IAlgoliaContentTypeItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaContentTypeItemInfoProvider : IInfoProvider, IInfoByIdProvider, IInfoByNameProvider -{ -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfo.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfo.generated.cs index 8c3bba4..9e6ab9d 100644 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfo.generated.cs +++ b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfo.generated.cs @@ -16,7 +16,7 @@ namespace Kentico.Xperience.Algolia.Admin; /// Data container class for . /// [Serializable] -public partial class AlgoliaIncludedPathItemInfo : AbstractInfo +public partial class AlgoliaIncludedPathItemInfo : AbstractInfo> { /// /// Object type. @@ -27,7 +27,7 @@ public partial class AlgoliaIncludedPathItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(AlgoliaIncludedPathItemInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIncludedPathItem", nameof(AlgoliaIncludedPathItemId), null, nameof(AlgoliaIncludedPathItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIncludedPathItem", nameof(AlgoliaIncludedPathItemId), null, nameof(AlgoliaIncludedPathItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfoProvider.generated.cs deleted file mode 100644 index 8977550..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/AlgoliaIncludedPathItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(IAlgoliaIncludedPathItemInfoProvider))] -public partial class AlgoliaIncludedPathItemInfoProvider : AbstractInfoProvider, IAlgoliaIncludedPathItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public AlgoliaIncludedPathItemInfoProvider() - : base(AlgoliaIncludedPathItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.cs deleted file mode 100644 index 9380d5a..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -public partial interface IAlgoliaIncludedPathItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.generated.cs deleted file mode 100644 index be23207..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIncludedPathItem/IAlgoliaIncludedPathItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaIncludedPathItemInfoProvider : IInfoProvider, IInfoByIdProvider -{ -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfo.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfo.generated.cs index 822a204..eb7c804 100644 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfo.generated.cs +++ b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfo.generated.cs @@ -14,7 +14,7 @@ namespace Kentico.Xperience.Algolia.Admin; /// Data container class for . /// [Serializable] -public partial class AlgoliaIndexItemInfo : AbstractInfo +public partial class AlgoliaIndexItemInfo : AbstractInfo> { /// /// Object type. @@ -25,7 +25,7 @@ public partial class AlgoliaIndexItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(AlgoliaIndexItemInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIndexItem", nameof(AlgoliaIndexItemId), null, nameof(AlgoliaIndexItemGuid), nameof(AlgoliaIndexItemIndexName), null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIndexItem", nameof(AlgoliaIndexItemId), null, nameof(AlgoliaIndexItemGuid), nameof(AlgoliaIndexItemIndexName), null, null, null, null) { TouchCacheDependencies = true, ContinuousIntegrationSettings = diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfoProvider.generated.cs deleted file mode 100644 index 2a442ab..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/AlgoliaIndexItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(IAlgoliaIndexItemInfoProvider))] -public partial class AlgoliaIndexItemInfoProvider : AbstractInfoProvider, IAlgoliaIndexItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public AlgoliaIndexItemInfoProvider() - : base(AlgoliaIndexItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.cs deleted file mode 100644 index d5ac677..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.cs +++ /dev/null @@ -1,8 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -public partial interface IAlgoliaIndexItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.generated.cs deleted file mode 100644 index 96e2436..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexItem/IAlgoliaIndexItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaIndexItemInfoProvider : IInfoProvider, IInfoByIdProvider, IInfoByNameProvider -{ -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfo.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfo.generated.cs index 50464d5..166cba0 100644 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfo.generated.cs +++ b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfo.generated.cs @@ -15,7 +15,7 @@ namespace Kentico.Xperience.Algolia.Admin; /// Data container class for . /// [Serializable] -public partial class AlgoliaIndexLanguageItemInfo : AbstractInfo +public partial class AlgoliaIndexLanguageItemInfo : AbstractInfo> { /// /// Object type. @@ -26,7 +26,7 @@ public partial class AlgoliaIndexLanguageItemInfo : AbstractInfo /// Type information. /// - public static readonly ObjectTypeInfo TYPEINFO = new(typeof(AlgoliaIndexedLanguageInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIndexLanguageItem", nameof(AlgoliaIndexLanguageItemID), null, nameof(AlgoliaIndexLanguageItemGuid), null, null, null, null, null) + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaIndexLanguageItem", nameof(AlgoliaIndexLanguageItemID), null, nameof(AlgoliaIndexLanguageItemGuid), null, null, null, null, null) { TouchCacheDependencies = true, DependsOn = new List() diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfoProvider.generated.cs deleted file mode 100644 index 93901f7..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/AlgoliaIndexLanguageItemInfoProvider.generated.cs +++ /dev/null @@ -1,18 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Class providing management. -/// -[ProviderInterface(typeof(IAlgoliaIndexLanguageItemInfoProvider))] -public partial class AlgoliaIndexedLanguageInfoProvider : AbstractInfoProvider, IAlgoliaIndexLanguageItemInfoProvider -{ - /// - /// Initializes a new instance of the class. - /// - public AlgoliaIndexedLanguageInfoProvider() - : base(AlgoliaIndexLanguageItemInfo.TYPEINFO) - { - } -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.cs deleted file mode 100644 index 6bf30e2..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaIndexLanguageItemInfoProvider -{ - void BulkDelete(IWhereCondition where, BulkDeleteSettings? settings = null); -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.generated.cs deleted file mode 100644 index 490dd03..0000000 --- a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaIndexLanguageItem/IAlgoliaIndexLanguageItemInfoProvider.generated.cs +++ /dev/null @@ -1,10 +0,0 @@ -using CMS.DataEngine; - -namespace Kentico.Xperience.Algolia.Admin; - -/// -/// Declares members for management. -/// -public partial interface IAlgoliaIndexLanguageItemInfoProvider : IInfoProvider, IInfoByIdProvider -{ -} diff --git a/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaResuableContentTypeItem/AlgoliaReusableContentTypeItemInfo.generated.cs b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaResuableContentTypeItem/AlgoliaReusableContentTypeItemInfo.generated.cs new file mode 100644 index 0000000..a691e95 --- /dev/null +++ b/src/Kentico.Xperience.Algolia/Admin/InfoModels/AlgoliaResuableContentTypeItem/AlgoliaReusableContentTypeItemInfo.generated.cs @@ -0,0 +1,133 @@ +using System.Data; +using System.Runtime.Serialization; + +using CMS; +using CMS.DataEngine; +using CMS.Helpers; + +using Kentico.Xperience.Algolia.Admin; + +[assembly: RegisterObjectType(typeof(AlgoliaReusableContentTypeItemInfo), AlgoliaReusableContentTypeItemInfo.OBJECT_TYPE)] + +namespace Kentico.Xperience.Algolia.Admin; + +/// +/// Data container class for . +/// +[Serializable] +public class AlgoliaReusableContentTypeItemInfo : AbstractInfo> +{ + /// + /// Object type. + /// + public const string OBJECT_TYPE = "kenticoalgolia.algoliareusablecontenttypeitem"; + + + /// + /// Type information. + /// + public static readonly ObjectTypeInfo TYPEINFO = new(typeof(IInfoProvider), OBJECT_TYPE, "KenticoAlgolia.AlgoliaReusableContentTypeItem", nameof(AlgoliaReusableContentTypeItemId), null, nameof(AlgoliaReusableContentTypeItemGuid), null, null, null, null, null) + { + TouchCacheDependencies = true, + DependsOn = new List() + { + new(nameof(AlgoliaReusableContentTypeItemIndexItemId), AlgoliaIndexItemInfo.OBJECT_TYPE, ObjectDependencyEnum.Required), + }, + ContinuousIntegrationSettings = + { + Enabled = true + } + }; + + + /// + /// Lucene reusable content type item id. + /// + [DatabaseField] + public virtual int AlgoliaReusableContentTypeItemId + { + get => ValidationHelper.GetInteger(GetValue(nameof(AlgoliaReusableContentTypeItemId)), 0); + set => SetValue(nameof(AlgoliaReusableContentTypeItemId), value); + } + + + /// + /// Lucene reusable content type item guid. + /// + [DatabaseField] + public virtual Guid AlgoliaReusableContentTypeItemGuid + { + get => ValidationHelper.GetGuid(GetValue(nameof(AlgoliaReusableContentTypeItemGuid)), default); + set => SetValue(nameof(AlgoliaReusableContentTypeItemGuid), value); + } + + + /// + /// Reusable content type name. + /// + [DatabaseField] + public virtual string AlgoliaReusableContentTypeItemContentTypeName + { + get => ValidationHelper.GetString(GetValue(nameof(AlgoliaReusableContentTypeItemContentTypeName)), String.Empty); + set => SetValue(nameof(AlgoliaReusableContentTypeItemContentTypeName), value); + } + + + /// + /// Lucene index item id. + /// + [DatabaseField] + public virtual int AlgoliaReusableContentTypeItemIndexItemId + { + get => ValidationHelper.GetInteger(GetValue(nameof(AlgoliaReusableContentTypeItemIndexItemId)), 0); + set => SetValue(nameof(AlgoliaReusableContentTypeItemIndexItemId), value); + } + + + /// + /// Deletes the object using appropriate provider. + /// + protected override void DeleteObject() + { + Provider.Delete(this); + } + + + /// + /// Updates the object using appropriate provider. + /// + protected override void SetObject() + { + Provider.Set(this); + } + + + /// + /// Constructor for de-serialization. + /// + /// Serialization info. + /// Streaming context. + protected AlgoliaReusableContentTypeItemInfo(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + + + /// + /// Creates an empty instance of the class. + /// + public AlgoliaReusableContentTypeItemInfo() + : base(TYPEINFO) + { + } + + + /// + /// Creates a new instances of the class from the given . + /// + /// DataRow with the object data. + public AlgoliaReusableContentTypeItemInfo(DataRow dr) + : base(TYPEINFO, dr) + { + } +} diff --git a/src/Kentico.Xperience.Algolia/Admin/Providers/ReusableContentOptionsProvider.cs b/src/Kentico.Xperience.Algolia/Admin/Providers/ReusableContentOptionsProvider.cs new file mode 100644 index 0000000..7131f0c --- /dev/null +++ b/src/Kentico.Xperience.Algolia/Admin/Providers/ReusableContentOptionsProvider.cs @@ -0,0 +1,68 @@ +using CMS.DataEngine; + +using Kentico.Xperience.Admin.Base.FormAnnotations; +using Kentico.Xperience.Admin.Base.Forms; + +namespace Kentico.Xperience.Algolia.Admin; +internal class ReusableContentOptionsProvider : IGeneralSelectorDataProvider +{ + public async Task> GetItemsAsync(string searchTerm, int pageIndex, CancellationToken cancellationToken) + { + // Prepares a query for retrieving objects + var itemQuery = DataClassInfoProvider.ProviderObject + .Get() + .WhereEquals(nameof(DataClassInfo.ClassContentTypeType), "Reusable"); + // If a search term is entered, only loads data whose first name starts with the term + if (!string.IsNullOrEmpty(searchTerm)) + { + itemQuery.WhereStartsWith(nameof(DataClassInfo.ClassDisplayName), searchTerm); + } + + // Ensures paging of items + itemQuery.Page(pageIndex, 20); + + // Retrieves the reusable content types and converts them into ObjectSelectorListItem options + var items = (await itemQuery.GetEnumerableTypedResultAsync()).Select(x => new ObjectSelectorListItem() + { + Value = x.ClassName, + Text = x.ClassDisplayName, + IsValid = true + }); + + return new PagedSelectListItems() + { + NextPageAvailable = itemQuery.NextPageAvailable, + Items = items + }; + } + + // Returns ObjectSelectorListItem options for all item values that are currently selected + public async Task>> GetSelectedItemsAsync(IEnumerable selectedValues, CancellationToken cancellationToken) + { + var itemQuery = DataClassInfoProvider.ProviderObject + .Get() + .WhereEquals(nameof(DataClassInfo.ClassContentTypeType), "Reusable"); + + var items = (await itemQuery.GetEnumerableTypedResultAsync()).Select(x => new ObjectSelectorListItem() + { + Value = x.ClassName, + Text = x.ClassDisplayName, + IsValid = true + }); + + var selectedItems = new List>(); + if (selectedValues is not null) + { + foreach (string? value in selectedValues) + { + var item = items.FirstOrDefault(x => x.Value == value); + + if (item != default) + { + selectedItems.Add(item); + } + } + } + return selectedItems; + } +} diff --git a/src/Kentico.Xperience.Algolia/Admin/UIPages/BaseIndexEditPage.cs b/src/Kentico.Xperience.Algolia/Admin/UIPages/BaseIndexEditPage.cs index 5fe3169..ced2ee0 100644 --- a/src/Kentico.Xperience.Algolia/Admin/UIPages/BaseIndexEditPage.cs +++ b/src/Kentico.Xperience.Algolia/Admin/UIPages/BaseIndexEditPage.cs @@ -18,7 +18,7 @@ protected BaseIndexEditPage( protected IndexModificationResult ValidateAndProcess(AlgoliaConfigurationModel configuration) { - configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? ""); + configuration.IndexName = RemoveWhitespacesUsingStringBuilder(configuration.IndexName ?? string.Empty); if (StorageService.GetIndexIds().Exists(x => x == configuration.Id)) { diff --git a/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexCreatePage.cs b/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexCreatePage.cs index f57ebd2..e8acac5 100644 --- a/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexCreatePage.cs +++ b/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexCreatePage.cs @@ -1,8 +1,10 @@ using CMS.Membership; + using Kentico.Xperience.Admin.Base; using Kentico.Xperience.Admin.Base.Forms; using Kentico.Xperience.Algolia.Admin; using Kentico.Xperience.Algolia.Indexing; + using IFormItemCollectionProvider = Kentico.Xperience.Admin.Base.Forms.Internal.IFormItemCollectionProvider; [assembly: UIPage( @@ -18,15 +20,15 @@ namespace Kentico.Xperience.Algolia.Admin; [UIEvaluatePermission(SystemPermissions.CREATE)] internal class IndexCreatePage : BaseIndexEditPage { - private readonly IPageUrlGenerator pageUrlGenerator; + private readonly IPageLinkGenerator pageLinkGenerator; private AlgoliaConfigurationModel? model = null; public IndexCreatePage( IFormItemCollectionProvider formItemCollectionProvider, IFormDataBinder formDataBinder, IAlgoliaConfigurationStorageService storageService, - IPageUrlGenerator pageUrlGenerator) - : base(formItemCollectionProvider, formDataBinder, storageService) => this.pageUrlGenerator = pageUrlGenerator; + IPageLinkGenerator pageLinkGenerator) + : base(formItemCollectionProvider, formDataBinder, storageService) => this.pageLinkGenerator = pageLinkGenerator; protected override AlgoliaConfigurationModel Model { @@ -46,7 +48,12 @@ protected override Task ProcessFormData(AlgoliaConfigurationMo { var index = AlgoliaIndexStore.Instance.GetRequiredIndex(model.IndexName); - var successResponse = NavigateTo(pageUrlGenerator.GenerateUrl(index.Identifier.ToString())) + var pageParameterValues = new PageParameterValues + { + { typeof(IndexEditPage), index.Identifier } + }; + + var successResponse = NavigateTo(pageLinkGenerator.GetPath(pageParameterValues)) .AddSuccessMessage("Index created."); return Task.FromResult(successResponse); diff --git a/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexListingPage.cs b/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexListingPage.cs index f2fe0ea..1fcfe39 100644 --- a/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexListingPage.cs +++ b/src/Kentico.Xperience.Algolia/Admin/UIPages/IndexListingPage.cs @@ -21,7 +21,7 @@ namespace Kentico.Xperience.Algolia.Admin; internal class IndexListingPage : ListingPage { private readonly IAlgoliaClient algoliaClient; - private readonly IPageUrlGenerator pageUrlGenerator; + private readonly IPageLinkGenerator pageLinkGenerator; private readonly IAlgoliaConfigurationStorageService configurationStorageService; private readonly IConversionService conversionService; @@ -32,12 +32,12 @@ internal class IndexListingPage : ListingPage /// public IndexListingPage( IAlgoliaClient algoliaClient, - IPageUrlGenerator pageUrlGenerator, + IPageLinkGenerator pageLinkGenerator, IAlgoliaConfigurationStorageService configurationStorageService, IConversionService conversionService) { this.algoliaClient = algoliaClient; - this.pageUrlGenerator = pageUrlGenerator; + this.pageLinkGenerator = pageLinkGenerator; this.configurationStorageService = configurationStorageService; this.conversionService = conversionService; } @@ -48,8 +48,8 @@ public override async Task ConfigurePage() { if (!AlgoliaIndexStore.Instance.GetAllIndices().Any()) { - PageConfiguration.Callouts = new List - { + PageConfiguration.Callouts = + [ new() { Headline = "No indexes", @@ -58,7 +58,7 @@ public override async Task ConfigurePage() Type = CalloutType.FriendlyWarning, Placement = CalloutPlacement.OnDesk } - }; + ]; } PageConfiguration.ColumnConfigurations @@ -80,7 +80,7 @@ public override async Task ConfigurePage() [PageCommand(Permission = SystemPermissions.DELETE)] public async Task Delete(int id, CancellationToken cancellationToken) { - var response = NavigateTo(pageUrlGenerator.GenerateUrl()); + var response = NavigateTo(pageLinkGenerator.GetPath()); var index = AlgoliaIndexStore.Instance.GetIndex(id); if (index == null) { @@ -149,7 +149,7 @@ public async Task> Rebuild(int id, Cancellatio int indexID = conversionService.GetInteger(row.Identifier, 0); string indexName = AlgoliaIndexStore.Instance.GetIndex(indexID) is AlgoliaIndex index ? index.IndexName - : ""; + : string.Empty; return statistics.FirstOrDefault(s => string.Equals(s.Name, indexName, StringComparison.OrdinalIgnoreCase)); } diff --git a/src/Kentico.Xperience.Algolia/AlgoliaSearchModule.cs b/src/Kentico.Xperience.Algolia/AlgoliaSearchModule.cs index 6f3ad99..ecc8c93 100644 --- a/src/Kentico.Xperience.Algolia/AlgoliaSearchModule.cs +++ b/src/Kentico.Xperience.Algolia/AlgoliaSearchModule.cs @@ -51,7 +51,9 @@ protected override void OnInit(ModuleInitParameters parameters) WebPageEvents.Publish.Execute += HandleEvent; WebPageEvents.Delete.Execute += HandleEvent; + WebPageEvents.Unpublish.Execute += HandleEvent; ContentItemEvents.Publish.Execute += HandleContentItemEvent; + ContentItemEvents.Unpublish.Execute += HandleContentItemEvent; ContentItemEvents.Delete.Execute += HandleContentItemEvent; RequestEvents.RunEndRequestTasks.Execute += (sender, eventArgs) => AlgoliaQueueWorker.Current.EnsureRunningThread(); diff --git a/src/Kentico.Xperience.Algolia/AlgoliaStartupExtensions.cs b/src/Kentico.Xperience.Algolia/AlgoliaStartupExtensions.cs index d827447..5126d3a 100644 --- a/src/Kentico.Xperience.Algolia/AlgoliaStartupExtensions.cs +++ b/src/Kentico.Xperience.Algolia/AlgoliaStartupExtensions.cs @@ -25,9 +25,9 @@ private static IServiceCollection AddKenticoAlgoliaInternal(this IServiceCollect bool isConfigured = false; - if (algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.SearchKey)).Value != "" - && algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.ApiKey)).Value != "" - && algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.ApplicationId)).Value != "") + if (algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.SearchKey)).Value != string.Empty + && algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.ApiKey)).Value != string.Empty + && algoliaOptions.Single(x => x.Key == nameof(AlgoliaOptions.ApplicationId)).Value != string.Empty) { isConfigured = true; } @@ -48,7 +48,7 @@ private static IServiceCollection AddKenticoAlgoliaInternal(this IServiceCollect var options = s.GetRequiredService>(); var configuration = new SearchConfig(options.Value.ApplicationId, options.Value.ApiKey); var fileVersion = FileVersionInfo.GetVersionInfo(typeof(AlgoliaOptions).Assembly.Location); - string versioNumber = new Version(fileVersion.FileVersion ?? "").ToString(3); + string versioNumber = new Version(fileVersion.FileVersion ?? string.Empty).ToString(3); configuration.DefaultHeaders["User-Agent"] = $"Kentico Xperience for Algolia ({versioNumber})"; return new SearchClient(configuration); diff --git a/src/Kentico.Xperience.Algolia/Indexing/AlgoliaIndex.cs b/src/Kentico.Xperience.Algolia/Indexing/AlgoliaIndex.cs index ff0f278..64811bc 100644 --- a/src/Kentico.Xperience.Algolia/Indexing/AlgoliaIndex.cs +++ b/src/Kentico.Xperience.Algolia/Indexing/AlgoliaIndex.cs @@ -27,6 +27,11 @@ public sealed class AlgoliaIndex /// public List LanguageNames { get; } + /// + /// A list of reusable content types that will be indexed. + /// + public List IncludedReusableContentTypes { get; } + /// /// The type of the class which extends . /// @@ -41,6 +46,7 @@ internal AlgoliaIndex(AlgoliaConfigurationModel indexConfiguration, Dictionary @@ -56,7 +56,7 @@ public string CrawlerApiKey { get; set; - } = ""; + } = string.Empty; /// @@ -66,7 +66,7 @@ public string CrawlerUserId { get; set; - } = ""; + } = string.Empty; /// diff --git a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaClient.cs b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaClient.cs index 7468504..1ce5c6b 100644 --- a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaClient.cs +++ b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaClient.cs @@ -132,9 +132,14 @@ private async Task DeleteRecordsInternal(IEnumerable objectIds, str private async Task RebuildInternal(AlgoliaIndex algoliaIndex, CancellationToken cancellationToken) { - var indexedItems = new List(); + var indexedItems = new List(); foreach (var includedPathAttribute in algoliaIndex.IncludedPaths) { + var pathMatch = + includedPathAttribute.AliasPath.EndsWith("/%", StringComparison.OrdinalIgnoreCase) + ? PathMatch.Children(includedPathAttribute.AliasPath[..^2]) + : PathMatch.Single(includedPathAttribute.AliasPath); + foreach (string language in algoliaIndex.LanguageNames) { var queryBuilder = new ContentItemQueryBuilder(); @@ -143,16 +148,40 @@ private async Task RebuildInternal(AlgoliaIndex algoliaIndex, CancellationToken { foreach (var contentType in includedPathAttribute.ContentTypes) { - queryBuilder.ForContentType(contentType.ContentTypeName, config => config.ForWebsite(algoliaIndex.WebSiteChannelName, includeUrlPath: true)); + queryBuilder.ForContentType(contentType.ContentTypeName, config => config.ForWebsite(algoliaIndex.WebSiteChannelName, includeUrlPath: true, pathMatch: pathMatch)); } + + queryBuilder.InLanguage(language); + + var webpages = await executor.GetWebPageResult(queryBuilder, container => container, cancellationToken: cancellationToken); + + foreach (var page in webpages) + { + var item = await MapToEventItem(page); + indexedItems.Add(item); + } + } + } + } + + foreach (string language in algoliaIndex.LanguageNames) + { + var queryBuilder = new ContentItemQueryBuilder(); + + if (algoliaIndex.IncludedReusableContentTypes != null && algoliaIndex.IncludedReusableContentTypes.Count > 0) + { + foreach (string reusableContentType in algoliaIndex.IncludedReusableContentTypes) + { + queryBuilder.ForContentType(reusableContentType); } + queryBuilder.InLanguage(language); - var webpages = await executor.GetWebPageResult(queryBuilder, container => container, cancellationToken: cancellationToken); + var reusableItems = await executor.GetResult(queryBuilder, result => result, cancellationToken: cancellationToken); - foreach (var page in webpages) + foreach (var reusableItem in reusableItems) { - var item = await MapToEventItem(page); + var item = await MapToEventReusableItem(reusableItem); indexedItems.Add(item); } } @@ -168,11 +197,11 @@ private async Task MapToEventItem(IWebPageContentQue { var languages = await GetAllLanguages(); - string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? ""; + string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? string.Empty; var websiteChannels = await GetAllWebsiteChannels(); - string channelName = websiteChannels.FirstOrDefault(c => c.WebsiteChannelID == content.WebPageItemWebsiteChannelID).ChannelName ?? ""; + string channelName = websiteChannels.FirstOrDefault(c => c.WebsiteChannelID == content.WebPageItemWebsiteChannelID).ChannelName ?? string.Empty; var item = new IndexEventWebPageItemModel( content.WebPageItemID, @@ -190,6 +219,25 @@ private async Task MapToEventItem(IWebPageContentQue return item; } + private async Task MapToEventReusableItem(IContentQueryDataContainer content) + { + var languages = await GetAllLanguages(); + + string languageName = languages.FirstOrDefault(l => l.ContentLanguageID == content.ContentItemCommonDataContentLanguageID)?.ContentLanguageName ?? string.Empty; + + var item = new IndexEventReusableItemModel( + content.ContentItemID, + content.ContentItemGUID, + languageName, + content.ContentTypeName, + content.ContentItemName, + content.ContentItemIsSecured, + content.ContentItemContentTypeID, + content.ContentItemCommonDataContentLanguageID); + + return item; + } + private async Task UpsertRecordsInternal(IEnumerable dataObjects, string indexName, CancellationToken cancellationToken) { int upsertedCount = 0; @@ -231,7 +279,7 @@ private Task> GetAllLanguages() => { if (item.TryGetValue(nameof(WebsiteChannelInfo.WebsiteChannelID), out object channelID) && item.TryGetValue(nameof(ChannelInfo.ChannelName), out object channelName)) { - items.Add(new(conversionService.GetInteger(channelID, 0), conversionService.GetString(channelName, ""))); + items.Add(new(conversionService.GetInteger(channelID, 0), conversionService.GetString(channelName, string.Empty))); } } diff --git a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskLogger.cs b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskLogger.cs index db79d7f..7de5ddc 100644 --- a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskLogger.cs +++ b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskLogger.cs @@ -107,7 +107,7 @@ private static AlgoliaTaskType GetTaskType(string eventName) } if (eventName.Equals(WebPageEvents.Delete.Name, StringComparison.OrdinalIgnoreCase) || - eventName.Equals(WebPageEvents.Archive.Name, StringComparison.OrdinalIgnoreCase)) + eventName.Equals(WebPageEvents.Unpublish.Name, StringComparison.OrdinalIgnoreCase)) { return AlgoliaTaskType.DELETE; } diff --git a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskProcessor.cs b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskProcessor.cs index 689bf3f..05bec93 100644 --- a/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskProcessor.cs +++ b/src/Kentico.Xperience.Algolia/Indexing/DefaultAlgoliaTaskProcessor.cs @@ -54,7 +54,7 @@ public async Task ProcessAlgoliaTasks(IEnumerable queueIt deleteTasks.Add(queueItem); } } - deleteIds.AddRange(GetIdsToDelete(deleteTasks ?? new List()).Where(x => x is not null).Select(x => x ?? "")); + deleteIds.AddRange(GetIdsToDelete(deleteTasks ?? new List()).Where(x => x is not null).Select(x => x ?? string.Empty)); successfulOperations += await algoliaClient.DeleteRecords(deleteIds, group.Key, cancellationToken); successfulOperations += await algoliaClient.UpsertRecords(upsertData, group.Key, cancellationToken); diff --git a/src/Kentico.Xperience.Algolia/Indexing/IndexedItemModelExtensions.cs b/src/Kentico.Xperience.Algolia/Indexing/IndexedItemModelExtensions.cs index b645901..1797e45 100644 --- a/src/Kentico.Xperience.Algolia/Indexing/IndexedItemModelExtensions.cs +++ b/src/Kentico.Xperience.Algolia/Indexing/IndexedItemModelExtensions.cs @@ -35,6 +35,11 @@ public static bool IsIndexedByIndex(this IndexEventWebPageItemModel indexedItemM return false; } + if (!string.Equals(indexedItemModel.WebsiteChannelName, algoliaIndex.WebSiteChannelName)) + { + return false; + } + if (!algoliaIndex.LanguageNames.Exists(x => x == indexedItemModel.LanguageName)) { return false; diff --git a/src/Kentico.Xperience.Algolia/Kentico.Xperience.Algolia.csproj b/src/Kentico.Xperience.Algolia/Kentico.Xperience.Algolia.csproj index 349940f..3d378d2 100644 --- a/src/Kentico.Xperience.Algolia/Kentico.Xperience.Algolia.csproj +++ b/src/Kentico.Xperience.Algolia/Kentico.Xperience.Algolia.csproj @@ -1,57 +1,57 @@  - - Xperience by Kentico Algolia Search - $(Product) - Kentico.Xperience.Algolia - Enables the creation of Algolia search indexes and the indexing of Xperience website channel pages and reusable content items. - https://github.com/kentico/xperience-by-kentico-algolia - - - - kentico - Kentico.Xperience.Algolia - $(NoWarn);S1075 - latest - - - disable - - - - - - - - - - - - - - xperience-integrations-algolia - - - - - - - - - - - - xperience-integrations-algolia - - - - - - - - - - - - - + + Xperience by Kentico Algolia Search + $(Product) + Kentico.Xperience.Algolia + Enables the creation of Algolia search indexes and the indexing of Xperience website channel pages and reusable content items. + https://github.com/kentico/xperience-by-kentico-algolia + + + + kentico + Kentico.Xperience.Algolia + $(NoWarn);S1075 + latest + + + disable + + + + + + + + + + + + + + xperience-integrations-algolia + + + + + + + + + + + + xperience-integrations-algolia + + + + + + + + + + + + + diff --git a/src/Kentico.Xperience.Algolia/Search/AlgoliaSearchResultModel.cs b/src/Kentico.Xperience.Algolia/Search/AlgoliaSearchResultModel.cs index 50e0bcb..3cf7e7f 100644 --- a/src/Kentico.Xperience.Algolia/Search/AlgoliaSearchResultModel.cs +++ b/src/Kentico.Xperience.Algolia/Search/AlgoliaSearchResultModel.cs @@ -2,9 +2,9 @@ public class AlgoliaSearchResultModel { - public string Url { get; set; } = ""; - public string ContentTypeName { get; set; } = ""; - public string LanguageName { get; set; } = ""; + public string Url { get; set; } = string.Empty; + public string ContentTypeName { get; set; } = string.Empty; + public string LanguageName { get; set; } = string.Empty; public Guid ItemGuid { get; set; } - public string ObjectID { get; set; } = ""; + public string ObjectID { get; set; } = string.Empty; } diff --git a/src/Kentico.Xperience.Algolia/packages.lock.json b/src/Kentico.Xperience.Algolia/packages.lock.json index 5b80905..bbf5c9b 100644 --- a/src/Kentico.Xperience.Algolia/packages.lock.json +++ b/src/Kentico.Xperience.Algolia/packages.lock.json @@ -13,30 +13,30 @@ }, "Kentico.Xperience.Admin": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "0PZqIlNEjpE5GHPtTMHzd5KkO428oRJlYEDx2YmLLYkm+UDMsRIwaS91UtmZTP5FYlDzv7yq0zgB4hqbcdsZTA==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "B1vIV5IO5CdFCQeB1G1tO6We54hwZO1HJFwDs79uniA7sioqx+LOYHNkhprbvRibhDN1eDXMgeIWgG2l0BRoPA==", "dependencies": { "Kentico.Aira.Client": "1.0.25", - "Kentico.Xperience.WebApp": "[29.0.0]", - "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.29", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29" + "Kentico.Xperience.WebApp": "[29.5.0]", + "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.33", + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33" } }, "Kentico.Xperience.WebApp": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "LXTK6WPoEThc+K2cSGa3GbKg1Zute0tjELazK6JURnGEF7xdoRiVE8ty6WeWFxmK6Cd+FwId10Q49C6SXlLL2A==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "3wGJZRGyyO4iDJTeeB8KSa+nZaFMPJhCxXhlxPHJ+0ukaJiJL09MhbJO5oDu1xCyZX59jv4te2IVbAmlvIKDDw==", "dependencies": { "CommandLineParser": "2.9.1", - "HotChocolate.AspNetCore": "13.9.0", - "HotChocolate.Data": "13.9.0", - "HtmlSanitizer": "8.0.843", - "Kentico.Xperience.Core": "[29.0.0]", + "HotChocolate.AspNetCore": "13.9.12", + "HotChocolate.Data": "13.9.12", + "HtmlSanitizer": "8.1.870", + "Kentico.Xperience.Core": "[29.5.0]", "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29", - "Microsoft.Extensions.Localization": "6.0.29" + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33", + "Microsoft.Extensions.Localization": "6.0.33" } }, "SonarAnalyzer.CSharp": { @@ -64,10 +64,11 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "resolved": "1.38.0", + "contentHash": "IuEgCoVA0ef7E4pQtpC3+TkPbzaoQfa77HlfJDmfuaJUCVJmn7fT0izamZiryW5sYUFKizsftIxMkXKbgIcPMQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.ClientModel": "1.0.0", "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", @@ -78,12 +79,12 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "resolved": "1.11.4", + "contentHash": "Sf4BoE6Q3jTgFkgBkx7qztYOFELBCo+wQgpYDwal/qJ1unBH73ywPztIJKXBXORRzAeNijsuxhk94h0TIMvfYg==", "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Azure.Core": "1.38.0", + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", @@ -92,16 +93,16 @@ }, "BananaCakePop.Middleware": { "type": "Transitive", - "resolved": "13.0.0", - "contentHash": "6Zj/vfmnCXLjBG7WNdtOgZZ5ZDR3Sy1FQSshZUonIYs3OdzozmsFmqPXMd9XJ0QE9aAildgVGq/lDLpLrMI4Yw==", + "resolved": "16.0.3", + "contentHash": "gwWk5ykS1uum2/++x3UnGhmjs+4itxce1lW5YnKdb8JeG4QxAMzSWVGh3B1ehiKJNAuvNtbfBwp2BAQvOsq02g==", "dependencies": { - "Yarp.ReverseProxy": "2.0.1" + "Yarp.ReverseProxy": "2.1.0" } }, "BouncyCastle.Cryptography": { "type": "Transitive", - "resolved": "2.3.0", - "contentHash": "IaVIiYxZLaBulveGDRUx/pBoW/Rc8QeXGF5u2E8xL8RWhVKCgfmtX9NUyGRbnSqnbFQU2zyP3MkXIdH+jUuQBw==" + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" }, "CommandLineParser": { "type": "Transitive", @@ -110,8 +111,8 @@ }, "GreenDonut": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "T8ZYTsm0S48hi89d2symCvUEJoBkg5F+rfU+HFtkEOc7WLZsIBDStnfF3c890Vxjmx/P1tFpY5StDNTM+C6fIw==", + "resolved": "13.9.12", + "contentHash": "w/nOY3tM8nVmjI1Gyhv5/JVk3VyD7itRhz1Ul0A8C4MHavsEyNFaMA7J+lwBFKwSRsW4R52F0BhUVbomIDA5uQ==", "dependencies": { "Microsoft.Extensions.ObjectPool": "6.0.0", "System.Diagnostics.DiagnosticSource": "6.0.0", @@ -120,170 +121,170 @@ }, "HotChocolate": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "aGBAW6d9Oj1MfmKJF482yYdJ8G87yJ0rVFxU9l7lA1dg1xjc5XALLQO9jCPz4GCpQLetuAhHdkZ713imJ6WCPw==", + "resolved": "13.9.12", + "contentHash": "eRHrmy5rNq9rcPrIsWvoEw5BNMDntCkzGa044fpfwKayAvSvzhsMRNRtrY351jGlg5779n3fSsabwofPu3haYw==", "dependencies": { - "HotChocolate.Authorization": "13.9.0", - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0", - "HotChocolate.Types.Mutations": "13.9.0", - "HotChocolate.Types.OffsetPagination": "13.9.0", - "HotChocolate.Validation": "13.9.0" + "HotChocolate.Authorization": "13.9.12", + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12", + "HotChocolate.Types.Mutations": "13.9.12", + "HotChocolate.Types.OffsetPagination": "13.9.12", + "HotChocolate.Validation": "13.9.12" } }, "HotChocolate.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "mb3IPL8V4NRL2FUefZP20fSwIMOnE7uCMLiM4d5Y5cjljYaMUVzUJnvdW9C1tUfbodP49Llk9WnBCR6S9fr8mQ==", + "resolved": "13.9.12", + "contentHash": "zCDFmDV0lzDJQd7KvLthQ/d9x0TsVIKLXG3t/v0SgcQBYXnMvBeV094d+3cx44xE3T4lU4DpDeRTgD3rLLA+Dw==", "dependencies": { - "HotChocolate.Language": "13.9.0", + "HotChocolate.Language": "13.9.12", "Microsoft.Bcl.AsyncInterfaces": "6.0.0", "System.Collections.Immutable": "6.0.0" } }, "HotChocolate.AspNetCore": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "RnxUdKEYOmsjzNPss473CYOug/9GIt8qlS9j8HxtZrW5TASM/9S7pDb7FthcDj4ag/D7wAwme3YxsqxH+iw5Bg==", + "resolved": "13.9.12", + "contentHash": "lv4vBVGFfTOofb/T7Fm+i0rJgyS5ZCBkCmryCcNAOw3YYpt8dL67Mms8+oIEPes04N9Wbimev+1pyxmBh5SpZg==", "dependencies": { - "BananaCakePop.Middleware": "13.0.0", - "HotChocolate": "13.9.0", - "HotChocolate.Subscriptions.InMemory": "13.9.0", - "HotChocolate.Transport.Sockets": "13.9.0", - "HotChocolate.Types.Scalars.Upload": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0" + "BananaCakePop.Middleware": "16.0.3", + "HotChocolate": "13.9.12", + "HotChocolate.Subscriptions.InMemory": "13.9.12", + "HotChocolate.Transport.Sockets": "13.9.12", + "HotChocolate.Types.Scalars.Upload": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12" } }, "HotChocolate.Authorization": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6CPA39zObNuMUmkmQ6J3zqmalukhjCiJS/klSEDPpwTtrn9HS/3edsh/7oiKzmUh6PNVKGed0lwkSdDP+DGZDQ==", + "resolved": "13.9.12", + "contentHash": "LuTW5qZhD0bpZqQ1sTZJav+u6jc4JO7DltKhGM1nFWsOEPxMAx9OgyehQfuAoiGp0CPKHUI+M/LxDbXu1HFJog==", "dependencies": { - "HotChocolate.Execution": "13.9.0" + "HotChocolate.Execution": "13.9.12" } }, "HotChocolate.Data": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "eZI9pIipsJsqdacj55krmxx24cUTCearQ/q9wT4aa6vQ/5GwuwWJ0ZIqdcp1qPjd+BsmJixrQBbi6/OgnFXIGw==", + "resolved": "13.9.12", + "contentHash": "NFsErsZVyMZntDrA6TPHvCgLCaOQ9QhZvmQmnVqcozLQvfCLuS6cSGwdN5zy+DKYa+yTaMG5DK7uKcxVWT//Sg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12" } }, "HotChocolate.Execution": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "zO1aG5qx5lzbZu/iKR56g+zeOgCCCa5pICwxijd1qEap+7J5q0YsME9RByw8wYPH+tNsXCvDcKaeAEcashB4cg==", + "resolved": "13.9.12", + "contentHash": "UsuKiq7ynoqa9LvOjUHJAb4XTtnreFmjT3unhU6wz5cVeJU02eqbIQQyiOPDlv/SEk75XxJ1EjiuXZ/sKzcsag==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0", - "HotChocolate.Validation": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12", + "HotChocolate.Validation": "13.9.12", "Microsoft.Extensions.DependencyInjection": "6.0.0", "System.Threading.Channels": "6.0.0" } }, "HotChocolate.Execution.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "flySLPDyTtM4051tI3mh5Ue0fGrKFDuW3w0ebWmW2qjfuF4jgQzd3pK3ZxfkxAfpxQXyPaVn/Q7fae+fYQxeCg==", + "resolved": "13.9.12", + "contentHash": "o65we+xKpSpn/z5uqeTT3SW8+JEu4tufMxRCXXe38K504+WNy1yuuf3DpmwKBP0I3zeXMaWOsLLFcqzYKMAMXA==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" } }, "HotChocolate.Fetching": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "pIw7VlEABejQGLRnJGnO7iPdT40AHklf0psJp5zNXrq0IX+Vq7hRRqON73nubZv5Ofhh8fV3kugqYFKvzcptoA==", + "resolved": "13.9.12", + "contentHash": "dl098a0FSo2z0k3WwHdrlCeAn4fwFGOC2oQnkWjNGmTZAIuUaOrT1zoxLgFGJ/FLSUdB58jgYAiW+tD4zVE1+Q==", "dependencies": { - "GreenDonut": "13.9.0", - "HotChocolate.Types": "13.9.0" + "GreenDonut": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Language": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "M8q0XHQm8Gtab+wKgYXfVPxScjdDE+INify5yaj6g1ZDkV3sLIeX+muu1WebrNO3DgmuAi6o3aW770Ucw7k/dw==", + "resolved": "13.9.12", + "contentHash": "rohvOiAmZ9Wo8cLjnm5UwtrYrHfLm0YNKAqD7ZqK8QBqv3DTqlZTs3WMaJdkG6BLdZR/l8dK/g1Bl3BGhqSBJA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0", - "HotChocolate.Language.Utf8": "13.9.0", - "HotChocolate.Language.Visitors": "13.9.0", - "HotChocolate.Language.Web": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12", + "HotChocolate.Language.Utf8": "13.9.12", + "HotChocolate.Language.Visitors": "13.9.12", + "HotChocolate.Language.Web": "13.9.12" } }, "HotChocolate.Language.SyntaxTree": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "+vwrQ0qOiKn/yUBHn53030hQmqj45C1g0WI8sip50CPnkgs3bAPnDInUvrR3IiHbRn5spAonO4tFPtMDdJrEMA==", + "resolved": "13.9.12", + "contentHash": "rEmQ0OFW+LjTtYZNenFW9IKWTPJny8ACl1XnPULcGF22mgtuxItLwGJRfceRaAKqpAV2g7oLdFfLYmjqeJc3Tw==", "dependencies": { "Microsoft.Extensions.ObjectPool": "6.0.0" } }, "HotChocolate.Language.Utf8": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "IEWNYGvtwejf7+j+Xci25FaYets2UD8wkfzQ5dUCW47c1rnTAyuRdTiO8T8x6LYuZ7+SLg7UTBYgjv4ybwAUgA==", + "resolved": "13.9.12", + "contentHash": "JfsKnk734a0PxEFo9XGHiAiXNKI5qV1X0mAMcqRetljaiLGKKwYM/1ndvz3JS/gvVP/oltBaRKNKk1pWO9desg==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Visitors": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "j6mPBkfVo2fopWYLoczXCoog4PJ+KwbHItSgHfPfI1kDBcNcy9XY4oxth3Uau1uBbfHYIFjnuVc+FrGb1f9KAQ==", + "resolved": "13.9.12", + "contentHash": "I2T8u0gRY0TxmjLm+EYjIreihp7oJQLhRXOs8p3y7BZAmJNxfeuc6EkMn8VDca1EQeiroNmC9UTawtJNV7QNyQ==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Web": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "GI5ufbNVEoKygSC09owVnCvw1Ma2KzOtm1l6uen3wKshAdOKB4gmSVCjzf71pNL2Nt6cL4IHa70ClqjECmu9qg==", + "resolved": "13.9.12", + "contentHash": "/1HpNKOImaJcy6XLDPQaWqIE1H4Dmu4ST2Sl9lPE9EwDfYe6gBv3dS9mQ7jteyQQ7az05QhotXl2zDHD/Zx7lg==", "dependencies": { - "HotChocolate.Language.Utf8": "13.9.0" + "HotChocolate.Language.Utf8": "13.9.12" } }, "HotChocolate.Subscriptions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "P3ason65NwSzkB2W9myV/pRIm4IMIWXH3RPCtpHVKx22Xw3hRJRJhjLBQZ5LCk5v3+7kKhXNBTbFNpbMyvez3Q==", + "resolved": "13.9.12", + "contentHash": "2VnYGlN9E7e5kGV76JU4Z/5sOag0wgUh694qwx4aPG1Lc5hPQDOL2BIk9jX7PmftHDmbxpNT3ZBvTSJXvGIoPQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0" + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12" } }, "HotChocolate.Subscriptions.InMemory": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "rj5U1Cd2QsjNnSNNdlSopYLtXh0kTZ1NlA1B3v02YFtj4Zu9le6QkGsl3oUljUUq46vSkkrT9ISj+e5wTCcw/Q==", + "resolved": "13.9.12", + "contentHash": "yQxVqqLUdMcl7yvU4qVhIrsRA1WIb1pkiKsXuD3FQxxucW9M4qqqklx91tY33AwIGnBGva7UCnofNxHg2FRbYg==", "dependencies": { - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Subscriptions": "13.9.0", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Subscriptions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0" } }, "HotChocolate.Transport.Sockets": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "4hPlhS2bgqT/tYCZfPtbGtPAaedULKgTbFKkTsjigrDhJcVxBA36Gr3yGM6S3NEw2JdIgiwugYV1log9zXkEjA==", + "resolved": "13.9.12", + "contentHash": "7VWxYdWBKhNA1LxBIba7okMvQDcaGzHlYhkmBtPGKtfg7sKqOrF6TrwlJg0peLnN8luG7TfW8Fmz8cbD7teEdA==", "dependencies": { "System.IO.Pipelines": "6.0.0" } }, "HotChocolate.Types": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "VGPZePNC4sBlz/iY4x90zIRxW62MWzWNcl2yjLS3JcW+0W8KuKxh99dFLxL0WY/+Eoe8PUecmoob+FrVEvPzpg==", + "resolved": "13.9.12", + "contentHash": "bTPnQZ0zolwj3E37ma2NPS5SxX6jj2OTQj9bszonB+92t0BQLOuX2wlgz0ux7XSmdC+ch7reCxJcrJEnPDs2QQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Types.Shared": "13.9.0", - "HotChocolate.Utilities": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Types.Shared": "13.9.12", + "HotChocolate.Utilities": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", "Microsoft.Extensions.ObjectPool": "6.0.0", "System.ComponentModel.Annotations": "5.0.0", @@ -292,74 +293,74 @@ }, "HotChocolate.Types.CursorPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2+w6tLrdjo+d/aIKyoNW1L/OH/p+FACMwGWHk1P4MwAspqaF7zjy71qTeNks+8QbRwG8uMleey/0sbr8sWpC6w==", + "resolved": "13.9.12", + "contentHash": "gjYxrEgQlcYTIcLMRUbF4/++C5c87OP7JU+f+YP6+BPID+r9tfEjC0U5KuRgbSg83t5jtgK1RpMLrbdTOUUGJg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Mutations": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "NX1zLkb7t19Om5RYubmkA6yRCtBbca454rqSGKSVBYjDrsiA6+4ZDvmS9Kjbw8F+cPm3VqShenrIIgfW8bzCXQ==", + "resolved": "13.9.12", + "contentHash": "Uvm+FfZISLM5+/vYuq4Rphns1UrfhiCfoLmdUtjMIPq4jVVl4unLxfcy1GrXdHVoBO7bOL1+gHl96e9S422+6w==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.OffsetPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "LIAaSVRS6FJCssP+s4ooLajhQ1/QfES78twX4OgZFJ9/UZMxXlU3K/IWeB2aXcJNkehfIZLgoiROnouB7ATepw==", + "resolved": "13.9.12", + "contentHash": "ipcyM/APH4J5oUFSE+TMYlCZ0n3lVvvap4eOHSXiriHlNM9/deLy5CooAlMmBkFbMsiFR8XcD9Ebc7od/xwm+g==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Scalars.Upload": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "hisB6PGGgsekz3a8YJwKgvbZHED98eph9+TMPg5A500tyvrZS00fbdpjRcN+rcTKAxhJ5evzHB2Fo1m62Dyo4w==", + "resolved": "13.9.12", + "contentHash": "3cAHgOwyl0O6qznO7SyjYsUa/RdnSK1JnKxPkQ4lk5Y3pDpl4iLLKuGtReoS+n74h5WLE88U3RPR4x6JcWMDlw==", "dependencies": { - "HotChocolate.Types": "13.9.0" + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Shared": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2lhdbXU/GltPQWO9r8qePZSzDo9ryFs8Wv0aF7aQgEq3dLvwer6OpvnZhIYmGua6bXXebA1PzBAEaaxPpLx3Wg==", + "resolved": "13.9.12", + "contentHash": "zWDYduCtLFxGqMV3vJ5lMfUv4h9ebU8dLwtG1Irtv5W5zOze0S+U6C0853hzDwL8/o6Torb5knQj56n78WBnAA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Utilities": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6zqwjROYxtuzAYjh31JnYKgM/MySRWEq4DHO64oSPFRJQ8NDgg7EvUU771yLt/6T7kUh+S6k25hVnmUipFtEnQ==" + "resolved": "13.9.12", + "contentHash": "Bo7aY9qaZ+8rcpDZFz9V03oVu4IWHmVgxlCDbMLYx1VJWOOyJA7pQb25ILxYVzScadn+lMkLy+4iq55GetLMhw==" }, "HotChocolate.Utilities.DependencyInjection": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "o1ijY8Rk0IUAo8QZYhfQ8s4/3z78JS9tyXGHzA963gkzTSJPehD4960CAmWlyC19FdE1i2KiTnYLhNOwNoL6+A==", + "resolved": "13.9.12", + "contentHash": "iSTJZCLfpg7l+ExXFQbWsPPvkAPL+JLU3UA1E6avgTEzPvMpzo9I1c5mA2ItyoOrmTewKSWmnQBlv25oEFQF6g==", "dependencies": { "Microsoft.Extensions.DependencyInjection": "6.0.0" } }, "HotChocolate.Validation": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "gC7/YfOcOOmT+zV/V45CubYhK3lZI7+SmNYLGXQ1ko4cwjVRh3PzSJMAaKw3naWDcbjXbEyWwdYc0dLuoVBNEA==", + "resolved": "13.9.12", + "contentHash": "7DyCifF5kBD2hbrsFoQX+nVYMURaHDzAt8gFm3+Ubedqx91cV39iP/Mam1qgx3gh/shaKYSRQFw4Ao8TTpFj2Q==", "dependencies": { - "HotChocolate.Types": "13.9.0", + "HotChocolate.Types": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", "Microsoft.Extensions.Options": "6.0.0" } }, "HtmlSanitizer": { "type": "Transitive", - "resolved": "8.0.843", - "contentHash": "XfmHK4rFz9PPN0gcv7J7pc+MRpcni1mrnO04mwA+9/1zIHLgdOvLJeDwWnX5a+up4tioPvGreB+p+KljLJ32wg==", + "resolved": "8.1.870", + "contentHash": "bQWYaKg8PrlgnhM9sPALl0UorpjWQkPTQiSTVyvm8imqF9lCLqBmtC0adUDi8xUYcdg6SJC+aHCw1MOjcg+Wnw==", "dependencies": { "AngleSharp": "[0.17.1]", "AngleSharp.Css": "[0.17.0]", @@ -380,19 +381,19 @@ }, "Kentico.Xperience.Core": { "type": "Transitive", - "resolved": "29.0.0", - "contentHash": "jG0gkDLE4H7ZNEdxdyZEzPxoAMlfx24oVdPeRa8RCUriOhBtleNREInbR9kYoMWwo456EaUaf3RPngArmZdy1g==", + "resolved": "29.5.0", + "contentHash": "RfcGWuhZSVDfmuUwl26svb9DZ/FWnhlNTr4q120uC7tuj7v/o3PH2iCtWCsDxkosGuN8f6c4FfO7cTnEPgmgWg==", "dependencies": { "AngleSharp": "0.17.1", - "MailKit": "4.5.0", - "Microsoft.Data.SqlClient": "5.2.0", + "MailKit": "4.7.1.1", + "Microsoft.Data.SqlClient": "5.2.2", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.Configuration": "6.0.1", "Microsoft.Extensions.Configuration.Binder": "6.0.0", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.FileProviders.Physical": "6.0.0", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization": "6.0.29", + "Microsoft.Extensions.Localization": "6.0.33", "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", "Mono.Cecil": "0.11.5", "Newtonsoft.Json": "13.0.3", @@ -401,16 +402,17 @@ }, "MailKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "EaXHODUdIV5oPdWvBJGazwaEpKt1LI/H/S//EEozANYCsfOSKHntX+Skk2kW616lSQp+fkRTmSjk0CYxEuOyEA==", + "resolved": "4.7.1.1", + "contentHash": "Y3okmIxu8g/ZcoJiE2i+dCeKgnNyddsXmcJslZnCPGVPP0aRyeVINHV1h97V+OVMdqjQI6O12J2p8Duwq5UEqQ==", "dependencies": { - "MimeKit": "4.5.0" + "MimeKit": "4.7.1", + "System.Formats.Asn1": "8.0.1" } }, "Microsoft.AspNetCore.SpaServices.Extensions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "2LeomoSAHbVBEffWwZS4cFLAQsPw2UK4gfNcajssV/cMM5/i61d8LwAdTcGHVmgF5e0zOz/25B06fk3iymD4VA==", + "resolved": "6.0.33", + "contentHash": "YFWk3bkKKVLQ1Q8jnTbjuzIIpIVoua4iw152wBNIH50gBZEi0xubmf0vxfgjXKoRs0xIgOBnjunvaMa8Of1e3w==", "dependencies": { "Microsoft.Extensions.FileProviders.Physical": "6.0.0" } @@ -420,14 +422,22 @@ "resolved": "6.0.0", "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, + "Microsoft.Bcl.TimeProvider": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "f5Kr5JepAbiGo7uDmhgvMqhntwxqXNn6/IpTBSSI4cuHhgnJGrLxFRhMjVpRkLPp6zJXO0/G0l3j9p9zSJxa+w==", + "dependencies": { + "Microsoft.Bcl.AsyncInterfaces": "6.0.0" + } + }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "resolved": "5.2.2", + "contentHash": "mtoeRMh7F/OA536c/Cnh8L4H0uLSKB5kSmoi54oN7Fp0hNJDy22IqyMhaMH4PkDCqI7xL//Fvg9ldtuPHG0h5g==", "dependencies": { - "Azure.Identity": "1.10.3", + "Azure.Identity": "1.11.4", "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client": "4.61.3", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", @@ -509,8 +519,8 @@ }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "ih7lIqCUXsG4+CNNcPs67TBOe3Yd/HMdBBVP3BhvdZkJEUilhvUK69FB7ZPsiZKel08GkOh2qFXqZsWWPa/lPQ==", + "resolved": "6.0.33", + "contentHash": "A5HxR46JT3B81XtfYY1/vr4RvICcue7/7lkOjrTMhGX0RdDXqQHXL1NpeYB27S1CLlsjuJn2fF1LSeGRnYJbgg==", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" } @@ -553,19 +563,19 @@ }, "Microsoft.Extensions.Localization": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "cZ5Tx6NtTZFzk+PWW2icApat7agQiMIFIsohsmHmz/scKRfAI/5XTa9lpZMwKowQBZm+ap0RwAJmQ2/5xoL+VQ==", + "resolved": "6.0.33", + "contentHash": "o4I6H5vdDoILQvHJXvVdo33ts4zTb4FXcdc+Et1FYG0dao9GLrDQ3HXwgV8yU2M/JeEJJnsQvUwtaANJFDnjQQ==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization.Abstractions": "6.0.29", + "Microsoft.Extensions.Localization.Abstractions": "6.0.33", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" } }, "Microsoft.Extensions.Localization.Abstractions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "4HVhh+V/7H2VMgFI8EP1kLgLpeRqm1kQOlXjHk4MHCVD5/pgWOTTbLEz9pdXymQQf/eRg1vNK8tG2MZstBHhlw==" + "resolved": "6.0.33", + "contentHash": "Hbq0a3DswFjen1K6hDljNENpy6bDbA/s2qsQ5M9kqa6fB3JVKWggAdqwx2GJG4+SGkZKOWkOZxQ1QVqavWaF5g==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", @@ -620,19 +630,19 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "resolved": "4.61.3", + "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "resolved": "4.61.3", + "contentHash": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", + "Microsoft.Identity.Client": "4.61.3", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -695,10 +705,11 @@ }, "MimeKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "OYn8b8b66J4mgtDzoImepiUtdkJOAVGoTj/ghzJ+az4wVixA5L5Z8GmgFhRvQ1btAIwZh/d9zvZLCALndQdz5w==", + "resolved": "4.7.1", + "contentHash": "Qoj4aVvhX14A1FNvaJ33hzOP4VZI2j+Mr38I9wSGcjMq4BYDtWLJG89aJ9nRW2cNfH6Czjwyp7+Mh++xv3AZvg==", "dependencies": { - "BouncyCastle.Cryptography": "2.3.0", + "BouncyCastle.Cryptography": "2.4.0", + "System.Formats.Asn1": "8.0.1", "System.Security.Cryptography.Pkcs": "8.0.0" } }, @@ -717,6 +728,15 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", + "dependencies": { + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, "System.CodeDom": { "type": "Transitive", "resolved": "8.0.0", @@ -762,8 +782,8 @@ }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" }, "System.IdentityModel.Tokens.Jwt": { "type": "Transitive", @@ -774,15 +794,6 @@ "Microsoft.IdentityModel.Tokens": "7.3.1" } }, - "System.IO.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "System.IO.Hashing": { "type": "Transitive", "resolved": "7.0.0", @@ -852,11 +863,6 @@ "System.Windows.Extensions": "6.0.0" } }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, "System.Text.Encoding.CodePages": { "type": "Transitive", "resolved": "6.0.0", @@ -902,9 +908,11 @@ }, "Yarp.ReverseProxy": { "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "op7vBwONPFeR1PYxeLw+RLqSodODDX8RWd0OinLGMVIq6yi1q9mv1j56ImuyZgiAToksiC0Dc7jbRUZ9I+jvFA==", + "resolved": "2.1.0", + "contentHash": "VgRuCBxmh5ND4VuFhvIN3AAeoxFhYkS2hNINk6AVCrOVTlpk7OwdrTXi8NHACfqfhDL+/oYCZrF9RxN+yiYnEg==", "dependencies": { + "Microsoft.Bcl.TimeProvider": "8.0.0", + "System.Collections.Immutable": "8.0.0", "System.IO.Hashing": "7.0.0" } } diff --git a/tests/Kentico.Xperience.Algolia.Tests/Indexing/IndexedItemModelExtensionsTests.cs b/tests/Kentico.Xperience.Algolia.Tests/Indexing/IndexedItemModelExtensionsTests.cs index b8249bb..24bcfe6 100644 --- a/tests/Kentico.Xperience.Algolia.Tests/Indexing/IndexedItemModelExtensionsTests.cs +++ b/tests/Kentico.Xperience.Algolia.Tests/Indexing/IndexedItemModelExtensionsTests.cs @@ -154,6 +154,7 @@ public void IsIndexedByIndex_Will_Return_True_When_The_Matching_Index_Has_An_Exa var sut = GetDefaultIndexEventWebPageItemModel(); sut.ContentTypeName = contentTypes[0].ContentTypeName; sut.WebPageItemTreePath = exactPaths.First().AliasPath; + sut.WebsiteChannelName = "channel"; sut.IsIndexedByIndex(log, index1.IndexName, "event").Should().BeTrue(); sut.IsIndexedByIndex(log, index2.IndexName, "event").Should().BeTrue(); diff --git a/tests/Kentico.Xperience.Algolia.Tests/Tests/IndexStoreTests.cs b/tests/Kentico.Xperience.Algolia.Tests/Tests/IndexStoreTests.cs index c3755de..21272ec 100644 --- a/tests/Kentico.Xperience.Algolia.Tests/Tests/IndexStoreTests.cs +++ b/tests/Kentico.Xperience.Algolia.Tests/Tests/IndexStoreTests.cs @@ -26,7 +26,6 @@ public void AddAndGetIndex() [Test] public void AddIndex_AlreadyExists() { - var fixture = new Fixture(); AlgoliaIndexStore.Instance.SetIndicies(new List()); AlgoliaIndexStore.Instance.AddIndex(MockDataProvider.Index); diff --git a/tests/Kentico.Xperience.Algolia.Tests/packages.lock.json b/tests/Kentico.Xperience.Algolia.Tests/packages.lock.json index ce6a576..09692c8 100644 --- a/tests/Kentico.Xperience.Algolia.Tests/packages.lock.json +++ b/tests/Kentico.Xperience.Algolia.Tests/packages.lock.json @@ -29,11 +29,11 @@ }, "Kentico.Xperience.Core.Tests": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "HvfqYoJIpdBki6IggsFvwgd5tnz7bs8nMbaui11cEKd0m+Zbnz8QKPL53GOwaYDKIHGuJPaPMrMRa+gIYcY97A==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "0sIjJ+q9Fm+PYZ9foW5mY44RdGVCv1Vvf9Q2Rvly4gSiHice8f1TJD7OHUajZUl7hcQuGpDrBzyzPPsm4MUvqA==", "dependencies": { - "Kentico.Xperience.Core": "[29.0.0]", + "Kentico.Xperience.Core": "[29.5.0]", "NUnit": "3.14.0", "Newtonsoft.Json": "13.0.3", "System.Configuration.ConfigurationManager": "8.0.0" @@ -41,18 +41,18 @@ }, "Kentico.Xperience.WebApp": { "type": "Direct", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "LXTK6WPoEThc+K2cSGa3GbKg1Zute0tjELazK6JURnGEF7xdoRiVE8ty6WeWFxmK6Cd+FwId10Q49C6SXlLL2A==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "3wGJZRGyyO4iDJTeeB8KSa+nZaFMPJhCxXhlxPHJ+0ukaJiJL09MhbJO5oDu1xCyZX59jv4te2IVbAmlvIKDDw==", "dependencies": { "CommandLineParser": "2.9.1", - "HotChocolate.AspNetCore": "13.9.0", - "HotChocolate.Data": "13.9.0", - "HtmlSanitizer": "8.0.843", - "Kentico.Xperience.Core": "[29.0.0]", + "HotChocolate.AspNetCore": "13.9.12", + "HotChocolate.Data": "13.9.12", + "HtmlSanitizer": "8.1.870", + "Kentico.Xperience.Core": "[29.5.0]", "Microsoft.Extensions.Caching.Memory": "6.0.1", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29", - "Microsoft.Extensions.Localization": "6.0.29" + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33", + "Microsoft.Extensions.Localization": "6.0.33" } }, "Microsoft.NET.Test.Sdk": { @@ -117,10 +117,11 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.35.0", - "contentHash": "hENcx03Jyuqv05F4RBEPbxz29UrM3Nbhnr6Wl6NQpoU9BCIbL3XLentrxDCTrH54NLS11Exxi/o8MYgT/cnKFA==", + "resolved": "1.38.0", + "contentHash": "IuEgCoVA0ef7E4pQtpC3+TkPbzaoQfa77HlfJDmfuaJUCVJmn7fT0izamZiryW5sYUFKizsftIxMkXKbgIcPMQ==", "dependencies": { "Microsoft.Bcl.AsyncInterfaces": "1.1.1", + "System.ClientModel": "1.0.0", "System.Diagnostics.DiagnosticSource": "6.0.1", "System.Memory.Data": "1.0.2", "System.Numerics.Vectors": "4.5.0", @@ -131,12 +132,12 @@ }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.10.3", - "contentHash": "l1Xm2MWOF2Mzcwuarlw8kWQXLZk3UeB55aQXVyjj23aBfDwOZ3gu5GP2kJ6KlmZeZv2TCzw7x4L3V36iNr3gww==", + "resolved": "1.11.4", + "contentHash": "Sf4BoE6Q3jTgFkgBkx7qztYOFELBCo+wQgpYDwal/qJ1unBH73ywPztIJKXBXORRzAeNijsuxhk94h0TIMvfYg==", "dependencies": { - "Azure.Core": "1.35.0", - "Microsoft.Identity.Client": "4.56.0", - "Microsoft.Identity.Client.Extensions.Msal": "4.56.0", + "Azure.Core": "1.38.0", + "Microsoft.Identity.Client": "4.61.3", + "Microsoft.Identity.Client.Extensions.Msal": "4.61.3", "System.Memory": "4.5.4", "System.Security.Cryptography.ProtectedData": "4.7.0", "System.Text.Json": "4.7.2", @@ -145,16 +146,16 @@ }, "BananaCakePop.Middleware": { "type": "Transitive", - "resolved": "13.0.0", - "contentHash": "6Zj/vfmnCXLjBG7WNdtOgZZ5ZDR3Sy1FQSshZUonIYs3OdzozmsFmqPXMd9XJ0QE9aAildgVGq/lDLpLrMI4Yw==", + "resolved": "16.0.3", + "contentHash": "gwWk5ykS1uum2/++x3UnGhmjs+4itxce1lW5YnKdb8JeG4QxAMzSWVGh3B1ehiKJNAuvNtbfBwp2BAQvOsq02g==", "dependencies": { - "Yarp.ReverseProxy": "2.0.1" + "Yarp.ReverseProxy": "2.1.0" } }, "BouncyCastle.Cryptography": { "type": "Transitive", - "resolved": "2.3.0", - "contentHash": "IaVIiYxZLaBulveGDRUx/pBoW/Rc8QeXGF5u2E8xL8RWhVKCgfmtX9NUyGRbnSqnbFQU2zyP3MkXIdH+jUuQBw==" + "resolved": "2.4.0", + "contentHash": "SwXsAV3sMvAU/Nn31pbjhWurYSjJ+/giI/0n6tCrYoupEK34iIHCuk3STAd9fx8yudM85KkLSVdn951vTng/vQ==" }, "Castle.Core": { "type": "Transitive", @@ -179,8 +180,8 @@ }, "GreenDonut": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "T8ZYTsm0S48hi89d2symCvUEJoBkg5F+rfU+HFtkEOc7WLZsIBDStnfF3c890Vxjmx/P1tFpY5StDNTM+C6fIw==", + "resolved": "13.9.12", + "contentHash": "w/nOY3tM8nVmjI1Gyhv5/JVk3VyD7itRhz1Ul0A8C4MHavsEyNFaMA7J+lwBFKwSRsW4R52F0BhUVbomIDA5uQ==", "dependencies": { "Microsoft.Extensions.ObjectPool": "8.0.0", "System.Diagnostics.DiagnosticSource": "8.0.0", @@ -189,169 +190,169 @@ }, "HotChocolate": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "aGBAW6d9Oj1MfmKJF482yYdJ8G87yJ0rVFxU9l7lA1dg1xjc5XALLQO9jCPz4GCpQLetuAhHdkZ713imJ6WCPw==", + "resolved": "13.9.12", + "contentHash": "eRHrmy5rNq9rcPrIsWvoEw5BNMDntCkzGa044fpfwKayAvSvzhsMRNRtrY351jGlg5779n3fSsabwofPu3haYw==", "dependencies": { - "HotChocolate.Authorization": "13.9.0", - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0", - "HotChocolate.Types.Mutations": "13.9.0", - "HotChocolate.Types.OffsetPagination": "13.9.0", - "HotChocolate.Validation": "13.9.0" + "HotChocolate.Authorization": "13.9.12", + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12", + "HotChocolate.Types.Mutations": "13.9.12", + "HotChocolate.Types.OffsetPagination": "13.9.12", + "HotChocolate.Validation": "13.9.12" } }, "HotChocolate.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "mb3IPL8V4NRL2FUefZP20fSwIMOnE7uCMLiM4d5Y5cjljYaMUVzUJnvdW9C1tUfbodP49Llk9WnBCR6S9fr8mQ==", + "resolved": "13.9.12", + "contentHash": "zCDFmDV0lzDJQd7KvLthQ/d9x0TsVIKLXG3t/v0SgcQBYXnMvBeV094d+3cx44xE3T4lU4DpDeRTgD3rLLA+Dw==", "dependencies": { - "HotChocolate.Language": "13.9.0", + "HotChocolate.Language": "13.9.12", "System.Collections.Immutable": "8.0.0" } }, "HotChocolate.AspNetCore": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "RnxUdKEYOmsjzNPss473CYOug/9GIt8qlS9j8HxtZrW5TASM/9S7pDb7FthcDj4ag/D7wAwme3YxsqxH+iw5Bg==", + "resolved": "13.9.12", + "contentHash": "lv4vBVGFfTOofb/T7Fm+i0rJgyS5ZCBkCmryCcNAOw3YYpt8dL67Mms8+oIEPes04N9Wbimev+1pyxmBh5SpZg==", "dependencies": { - "BananaCakePop.Middleware": "13.0.0", - "HotChocolate": "13.9.0", - "HotChocolate.Subscriptions.InMemory": "13.9.0", - "HotChocolate.Transport.Sockets": "13.9.0", - "HotChocolate.Types.Scalars.Upload": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0" + "BananaCakePop.Middleware": "16.0.3", + "HotChocolate": "13.9.12", + "HotChocolate.Subscriptions.InMemory": "13.9.12", + "HotChocolate.Transport.Sockets": "13.9.12", + "HotChocolate.Types.Scalars.Upload": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12" } }, "HotChocolate.Authorization": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6CPA39zObNuMUmkmQ6J3zqmalukhjCiJS/klSEDPpwTtrn9HS/3edsh/7oiKzmUh6PNVKGed0lwkSdDP+DGZDQ==", + "resolved": "13.9.12", + "contentHash": "LuTW5qZhD0bpZqQ1sTZJav+u6jc4JO7DltKhGM1nFWsOEPxMAx9OgyehQfuAoiGp0CPKHUI+M/LxDbXu1HFJog==", "dependencies": { - "HotChocolate.Execution": "13.9.0" + "HotChocolate.Execution": "13.9.12" } }, "HotChocolate.Data": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "eZI9pIipsJsqdacj55krmxx24cUTCearQ/q9wT4aa6vQ/5GwuwWJ0ZIqdcp1qPjd+BsmJixrQBbi6/OgnFXIGw==", + "resolved": "13.9.12", + "contentHash": "NFsErsZVyMZntDrA6TPHvCgLCaOQ9QhZvmQmnVqcozLQvfCLuS6cSGwdN5zy+DKYa+yTaMG5DK7uKcxVWT//Sg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types.CursorPagination": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types.CursorPagination": "13.9.12" } }, "HotChocolate.Execution": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "zO1aG5qx5lzbZu/iKR56g+zeOgCCCa5pICwxijd1qEap+7J5q0YsME9RByw8wYPH+tNsXCvDcKaeAEcashB4cg==", + "resolved": "13.9.12", + "contentHash": "UsuKiq7ynoqa9LvOjUHJAb4XTtnreFmjT3unhU6wz5cVeJU02eqbIQQyiOPDlv/SEk75XxJ1EjiuXZ/sKzcsag==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Fetching": "13.9.0", - "HotChocolate.Types": "13.9.0", - "HotChocolate.Utilities.DependencyInjection": "13.9.0", - "HotChocolate.Validation": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Fetching": "13.9.12", + "HotChocolate.Types": "13.9.12", + "HotChocolate.Utilities.DependencyInjection": "13.9.12", + "HotChocolate.Validation": "13.9.12", "Microsoft.Extensions.DependencyInjection": "8.0.0", "System.Threading.Channels": "8.0.0" } }, "HotChocolate.Execution.Abstractions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "flySLPDyTtM4051tI3mh5Ue0fGrKFDuW3w0ebWmW2qjfuF4jgQzd3pK3ZxfkxAfpxQXyPaVn/Q7fae+fYQxeCg==", + "resolved": "13.9.12", + "contentHash": "o65we+xKpSpn/z5uqeTT3SW8+JEu4tufMxRCXXe38K504+WNy1yuuf3DpmwKBP0I3zeXMaWOsLLFcqzYKMAMXA==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "HotChocolate.Fetching": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "pIw7VlEABejQGLRnJGnO7iPdT40AHklf0psJp5zNXrq0IX+Vq7hRRqON73nubZv5Ofhh8fV3kugqYFKvzcptoA==", + "resolved": "13.9.12", + "contentHash": "dl098a0FSo2z0k3WwHdrlCeAn4fwFGOC2oQnkWjNGmTZAIuUaOrT1zoxLgFGJ/FLSUdB58jgYAiW+tD4zVE1+Q==", "dependencies": { - "GreenDonut": "13.9.0", - "HotChocolate.Types": "13.9.0" + "GreenDonut": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Language": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "M8q0XHQm8Gtab+wKgYXfVPxScjdDE+INify5yaj6g1ZDkV3sLIeX+muu1WebrNO3DgmuAi6o3aW770Ucw7k/dw==", + "resolved": "13.9.12", + "contentHash": "rohvOiAmZ9Wo8cLjnm5UwtrYrHfLm0YNKAqD7ZqK8QBqv3DTqlZTs3WMaJdkG6BLdZR/l8dK/g1Bl3BGhqSBJA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0", - "HotChocolate.Language.Utf8": "13.9.0", - "HotChocolate.Language.Visitors": "13.9.0", - "HotChocolate.Language.Web": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12", + "HotChocolate.Language.Utf8": "13.9.12", + "HotChocolate.Language.Visitors": "13.9.12", + "HotChocolate.Language.Web": "13.9.12" } }, "HotChocolate.Language.SyntaxTree": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "+vwrQ0qOiKn/yUBHn53030hQmqj45C1g0WI8sip50CPnkgs3bAPnDInUvrR3IiHbRn5spAonO4tFPtMDdJrEMA==", + "resolved": "13.9.12", + "contentHash": "rEmQ0OFW+LjTtYZNenFW9IKWTPJny8ACl1XnPULcGF22mgtuxItLwGJRfceRaAKqpAV2g7oLdFfLYmjqeJc3Tw==", "dependencies": { "Microsoft.Extensions.ObjectPool": "8.0.0" } }, "HotChocolate.Language.Utf8": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "IEWNYGvtwejf7+j+Xci25FaYets2UD8wkfzQ5dUCW47c1rnTAyuRdTiO8T8x6LYuZ7+SLg7UTBYgjv4ybwAUgA==", + "resolved": "13.9.12", + "contentHash": "JfsKnk734a0PxEFo9XGHiAiXNKI5qV1X0mAMcqRetljaiLGKKwYM/1ndvz3JS/gvVP/oltBaRKNKk1pWO9desg==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Visitors": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "j6mPBkfVo2fopWYLoczXCoog4PJ+KwbHItSgHfPfI1kDBcNcy9XY4oxth3Uau1uBbfHYIFjnuVc+FrGb1f9KAQ==", + "resolved": "13.9.12", + "contentHash": "I2T8u0gRY0TxmjLm+EYjIreihp7oJQLhRXOs8p3y7BZAmJNxfeuc6EkMn8VDca1EQeiroNmC9UTawtJNV7QNyQ==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Language.Web": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "GI5ufbNVEoKygSC09owVnCvw1Ma2KzOtm1l6uen3wKshAdOKB4gmSVCjzf71pNL2Nt6cL4IHa70ClqjECmu9qg==", + "resolved": "13.9.12", + "contentHash": "/1HpNKOImaJcy6XLDPQaWqIE1H4Dmu4ST2Sl9lPE9EwDfYe6gBv3dS9mQ7jteyQQ7az05QhotXl2zDHD/Zx7lg==", "dependencies": { - "HotChocolate.Language.Utf8": "13.9.0" + "HotChocolate.Language.Utf8": "13.9.12" } }, "HotChocolate.Subscriptions": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "P3ason65NwSzkB2W9myV/pRIm4IMIWXH3RPCtpHVKx22Xw3hRJRJhjLBQZ5LCk5v3+7kKhXNBTbFNpbMyvez3Q==", + "resolved": "13.9.12", + "contentHash": "2VnYGlN9E7e5kGV76JU4Z/5sOag0wgUh694qwx4aPG1Lc5hPQDOL2BIk9jX7PmftHDmbxpNT3ZBvTSJXvGIoPQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Execution.Abstractions": "13.9.0" + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Execution.Abstractions": "13.9.12" } }, "HotChocolate.Subscriptions.InMemory": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "rj5U1Cd2QsjNnSNNdlSopYLtXh0kTZ1NlA1B3v02YFtj4Zu9le6QkGsl3oUljUUq46vSkkrT9ISj+e5wTCcw/Q==", + "resolved": "13.9.12", + "contentHash": "yQxVqqLUdMcl7yvU4qVhIrsRA1WIb1pkiKsXuD3FQxxucW9M4qqqklx91tY33AwIGnBGva7UCnofNxHg2FRbYg==", "dependencies": { - "HotChocolate.Execution.Abstractions": "13.9.0", - "HotChocolate.Subscriptions": "13.9.0", + "HotChocolate.Execution.Abstractions": "13.9.12", + "HotChocolate.Subscriptions": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0" } }, "HotChocolate.Transport.Sockets": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "4hPlhS2bgqT/tYCZfPtbGtPAaedULKgTbFKkTsjigrDhJcVxBA36Gr3yGM6S3NEw2JdIgiwugYV1log9zXkEjA==", + "resolved": "13.9.12", + "contentHash": "7VWxYdWBKhNA1LxBIba7okMvQDcaGzHlYhkmBtPGKtfg7sKqOrF6TrwlJg0peLnN8luG7TfW8Fmz8cbD7teEdA==", "dependencies": { "System.IO.Pipelines": "8.0.0" } }, "HotChocolate.Types": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "VGPZePNC4sBlz/iY4x90zIRxW62MWzWNcl2yjLS3JcW+0W8KuKxh99dFLxL0WY/+Eoe8PUecmoob+FrVEvPzpg==", + "resolved": "13.9.12", + "contentHash": "bTPnQZ0zolwj3E37ma2NPS5SxX6jj2OTQj9bszonB+92t0BQLOuX2wlgz0ux7XSmdC+ch7reCxJcrJEnPDs2QQ==", "dependencies": { - "HotChocolate.Abstractions": "13.9.0", - "HotChocolate.Types.Shared": "13.9.0", - "HotChocolate.Utilities": "13.9.0", + "HotChocolate.Abstractions": "13.9.12", + "HotChocolate.Types.Shared": "13.9.12", + "HotChocolate.Utilities": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "Microsoft.Extensions.ObjectPool": "8.0.0", "System.ComponentModel.Annotations": "5.0.0", @@ -360,74 +361,74 @@ }, "HotChocolate.Types.CursorPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2+w6tLrdjo+d/aIKyoNW1L/OH/p+FACMwGWHk1P4MwAspqaF7zjy71qTeNks+8QbRwG8uMleey/0sbr8sWpC6w==", + "resolved": "13.9.12", + "contentHash": "gjYxrEgQlcYTIcLMRUbF4/++C5c87OP7JU+f+YP6+BPID+r9tfEjC0U5KuRgbSg83t5jtgK1RpMLrbdTOUUGJg==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Mutations": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "NX1zLkb7t19Om5RYubmkA6yRCtBbca454rqSGKSVBYjDrsiA6+4ZDvmS9Kjbw8F+cPm3VqShenrIIgfW8bzCXQ==", + "resolved": "13.9.12", + "contentHash": "Uvm+FfZISLM5+/vYuq4Rphns1UrfhiCfoLmdUtjMIPq4jVVl4unLxfcy1GrXdHVoBO7bOL1+gHl96e9S422+6w==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.OffsetPagination": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "LIAaSVRS6FJCssP+s4ooLajhQ1/QfES78twX4OgZFJ9/UZMxXlU3K/IWeB2aXcJNkehfIZLgoiROnouB7ATepw==", + "resolved": "13.9.12", + "contentHash": "ipcyM/APH4J5oUFSE+TMYlCZ0n3lVvvap4eOHSXiriHlNM9/deLy5CooAlMmBkFbMsiFR8XcD9Ebc7od/xwm+g==", "dependencies": { - "HotChocolate.Execution": "13.9.0", - "HotChocolate.Types": "13.9.0" + "HotChocolate.Execution": "13.9.12", + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Scalars.Upload": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "hisB6PGGgsekz3a8YJwKgvbZHED98eph9+TMPg5A500tyvrZS00fbdpjRcN+rcTKAxhJ5evzHB2Fo1m62Dyo4w==", + "resolved": "13.9.12", + "contentHash": "3cAHgOwyl0O6qznO7SyjYsUa/RdnSK1JnKxPkQ4lk5Y3pDpl4iLLKuGtReoS+n74h5WLE88U3RPR4x6JcWMDlw==", "dependencies": { - "HotChocolate.Types": "13.9.0" + "HotChocolate.Types": "13.9.12" } }, "HotChocolate.Types.Shared": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "2lhdbXU/GltPQWO9r8qePZSzDo9ryFs8Wv0aF7aQgEq3dLvwer6OpvnZhIYmGua6bXXebA1PzBAEaaxPpLx3Wg==", + "resolved": "13.9.12", + "contentHash": "zWDYduCtLFxGqMV3vJ5lMfUv4h9ebU8dLwtG1Irtv5W5zOze0S+U6C0853hzDwL8/o6Torb5knQj56n78WBnAA==", "dependencies": { - "HotChocolate.Language.SyntaxTree": "13.9.0" + "HotChocolate.Language.SyntaxTree": "13.9.12" } }, "HotChocolate.Utilities": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "6zqwjROYxtuzAYjh31JnYKgM/MySRWEq4DHO64oSPFRJQ8NDgg7EvUU771yLt/6T7kUh+S6k25hVnmUipFtEnQ==" + "resolved": "13.9.12", + "contentHash": "Bo7aY9qaZ+8rcpDZFz9V03oVu4IWHmVgxlCDbMLYx1VJWOOyJA7pQb25ILxYVzScadn+lMkLy+4iq55GetLMhw==" }, "HotChocolate.Utilities.DependencyInjection": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "o1ijY8Rk0IUAo8QZYhfQ8s4/3z78JS9tyXGHzA963gkzTSJPehD4960CAmWlyC19FdE1i2KiTnYLhNOwNoL6+A==", + "resolved": "13.9.12", + "contentHash": "iSTJZCLfpg7l+ExXFQbWsPPvkAPL+JLU3UA1E6avgTEzPvMpzo9I1c5mA2ItyoOrmTewKSWmnQBlv25oEFQF6g==", "dependencies": { "Microsoft.Extensions.DependencyInjection": "8.0.0" } }, "HotChocolate.Validation": { "type": "Transitive", - "resolved": "13.9.0", - "contentHash": "gC7/YfOcOOmT+zV/V45CubYhK3lZI7+SmNYLGXQ1ko4cwjVRh3PzSJMAaKw3naWDcbjXbEyWwdYc0dLuoVBNEA==", + "resolved": "13.9.12", + "contentHash": "7DyCifF5kBD2hbrsFoQX+nVYMURaHDzAt8gFm3+Ubedqx91cV39iP/Mam1qgx3gh/shaKYSRQFw4Ao8TTpFj2Q==", "dependencies": { - "HotChocolate.Types": "13.9.0", + "HotChocolate.Types": "13.9.12", "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "Microsoft.Extensions.Options": "8.0.0" } }, "HtmlSanitizer": { "type": "Transitive", - "resolved": "8.0.843", - "contentHash": "XfmHK4rFz9PPN0gcv7J7pc+MRpcni1mrnO04mwA+9/1zIHLgdOvLJeDwWnX5a+up4tioPvGreB+p+KljLJ32wg==", + "resolved": "8.1.870", + "contentHash": "bQWYaKg8PrlgnhM9sPALl0UorpjWQkPTQiSTVyvm8imqF9lCLqBmtC0adUDi8xUYcdg6SJC+aHCw1MOjcg+Wnw==", "dependencies": { "AngleSharp": "[0.17.1]", "AngleSharp.Css": "[0.17.0]", @@ -448,19 +449,19 @@ }, "Kentico.Xperience.Core": { "type": "Transitive", - "resolved": "29.0.0", - "contentHash": "jG0gkDLE4H7ZNEdxdyZEzPxoAMlfx24oVdPeRa8RCUriOhBtleNREInbR9kYoMWwo456EaUaf3RPngArmZdy1g==", + "resolved": "29.5.0", + "contentHash": "RfcGWuhZSVDfmuUwl26svb9DZ/FWnhlNTr4q120uC7tuj7v/o3PH2iCtWCsDxkosGuN8f6c4FfO7cTnEPgmgWg==", "dependencies": { "AngleSharp": "0.17.1", - "MailKit": "4.5.0", - "Microsoft.Data.SqlClient": "5.2.0", + "MailKit": "4.7.1.1", + "Microsoft.Data.SqlClient": "5.2.2", "Microsoft.Extensions.Caching.Memory": "6.0.1", "Microsoft.Extensions.Configuration": "6.0.1", "Microsoft.Extensions.Configuration.Binder": "6.0.0", "Microsoft.Extensions.DependencyInjection": "6.0.1", "Microsoft.Extensions.FileProviders.Physical": "6.0.0", "Microsoft.Extensions.Hosting.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization": "6.0.29", + "Microsoft.Extensions.Localization": "6.0.33", "Microsoft.Extensions.Options.ConfigurationExtensions": "6.0.0", "Mono.Cecil": "0.11.5", "Newtonsoft.Json": "13.0.3", @@ -469,16 +470,17 @@ }, "MailKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "EaXHODUdIV5oPdWvBJGazwaEpKt1LI/H/S//EEozANYCsfOSKHntX+Skk2kW616lSQp+fkRTmSjk0CYxEuOyEA==", + "resolved": "4.7.1.1", + "contentHash": "Y3okmIxu8g/ZcoJiE2i+dCeKgnNyddsXmcJslZnCPGVPP0aRyeVINHV1h97V+OVMdqjQI6O12J2p8Duwq5UEqQ==", "dependencies": { - "MimeKit": "4.5.0" + "MimeKit": "4.7.1", + "System.Formats.Asn1": "8.0.1" } }, "Microsoft.AspNetCore.SpaServices.Extensions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "2LeomoSAHbVBEffWwZS4cFLAQsPw2UK4gfNcajssV/cMM5/i61d8LwAdTcGHVmgF5e0zOz/25B06fk3iymD4VA==", + "resolved": "6.0.33", + "contentHash": "YFWk3bkKKVLQ1Q8jnTbjuzIIpIVoua4iw152wBNIH50gBZEi0xubmf0vxfgjXKoRs0xIgOBnjunvaMa8Of1e3w==", "dependencies": { "Microsoft.Extensions.FileProviders.Physical": "6.0.0" } @@ -495,12 +497,12 @@ }, "Microsoft.Data.SqlClient": { "type": "Transitive", - "resolved": "5.2.0", - "contentHash": "3alfyqRN3ELRtdvU1dGtLBRNQqprr3TJ0WrUJfMISPwg1nPUN2P3Lelah68IKWuV27Ceb7ig95hWNHFTSXfxMg==", + "resolved": "5.2.2", + "contentHash": "mtoeRMh7F/OA536c/Cnh8L4H0uLSKB5kSmoi54oN7Fp0hNJDy22IqyMhaMH4PkDCqI7xL//Fvg9ldtuPHG0h5g==", "dependencies": { - "Azure.Identity": "1.10.3", + "Azure.Identity": "1.11.4", "Microsoft.Data.SqlClient.SNI.runtime": "5.2.0", - "Microsoft.Identity.Client": "4.56.0", + "Microsoft.Identity.Client": "4.61.3", "Microsoft.IdentityModel.JsonWebTokens": "6.35.0", "Microsoft.IdentityModel.Protocols.OpenIdConnect": "6.35.0", "Microsoft.SqlServer.Server": "1.0.0", @@ -581,8 +583,8 @@ }, "Microsoft.Extensions.FileProviders.Embedded": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "ih7lIqCUXsG4+CNNcPs67TBOe3Yd/HMdBBVP3BhvdZkJEUilhvUK69FB7ZPsiZKel08GkOh2qFXqZsWWPa/lPQ==", + "resolved": "6.0.33", + "contentHash": "A5HxR46JT3B81XtfYY1/vr4RvICcue7/7lkOjrTMhGX0RdDXqQHXL1NpeYB27S1CLlsjuJn2fF1LSeGRnYJbgg==", "dependencies": { "Microsoft.Extensions.FileProviders.Abstractions": "6.0.0" } @@ -625,19 +627,19 @@ }, "Microsoft.Extensions.Localization": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "cZ5Tx6NtTZFzk+PWW2icApat7agQiMIFIsohsmHmz/scKRfAI/5XTa9lpZMwKowQBZm+ap0RwAJmQ2/5xoL+VQ==", + "resolved": "6.0.33", + "contentHash": "o4I6H5vdDoILQvHJXvVdo33ts4zTb4FXcdc+Et1FYG0dao9GLrDQ3HXwgV8yU2M/JeEJJnsQvUwtaANJFDnjQQ==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Localization.Abstractions": "6.0.29", + "Microsoft.Extensions.Localization.Abstractions": "6.0.33", "Microsoft.Extensions.Logging.Abstractions": "6.0.4", "Microsoft.Extensions.Options": "6.0.0" } }, "Microsoft.Extensions.Localization.Abstractions": { "type": "Transitive", - "resolved": "6.0.29", - "contentHash": "4HVhh+V/7H2VMgFI8EP1kLgLpeRqm1kQOlXjHk4MHCVD5/pgWOTTbLEz9pdXymQQf/eRg1vNK8tG2MZstBHhlw==" + "resolved": "6.0.33", + "contentHash": "Hbq0a3DswFjen1K6hDljNENpy6bDbA/s2qsQ5M9kqa6fB3JVKWggAdqwx2GJG4+SGkZKOWkOZxQ1QVqavWaF5g==" }, "Microsoft.Extensions.Logging": { "type": "Transitive", @@ -689,19 +691,19 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "rr4zbidvHy9r4NvOAs5hdd964Ao2A0pAeFBJKR95u1CJAVzbd1p6tPTXUZ+5ld0cfThiVSGvz6UHwY6JjraTpA==", + "resolved": "4.61.3", + "contentHash": "naJo/Qm35Caaoxp5utcw+R8eU8ZtLz2ALh8S+gkekOYQ1oazfCQMWVT4NJ/FnHzdIJlm8dMz0oMpMGCabx5odA==", "dependencies": { - "Microsoft.IdentityModel.Abstractions": "6.22.0" + "Microsoft.IdentityModel.Abstractions": "6.35.0", + "System.Diagnostics.DiagnosticSource": "6.0.1" } }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.56.0", - "contentHash": "H12YAzEGK55vZ+QpxUzozhW8ZZtgPDuWvgA0JbdIR9UhMUplj29JhIgE2imuH8W2Nw9D8JKygR1uxRFtpSNcrg==", + "resolved": "4.61.3", + "contentHash": "PWnJcznrSGr25MN8ajlc2XIDW4zCFu0U6FkpaNLEWLgd1NgFCp5uDY3mqLDgM8zCN8hqj8yo5wHYfLB2HjcdGw==", "dependencies": { - "Microsoft.Identity.Client": "4.56.0", - "System.IO.FileSystem.AccessControl": "5.0.0", + "Microsoft.Identity.Client": "4.61.3", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -754,8 +756,8 @@ }, "Microsoft.NETCore.Platforms": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" + "resolved": "1.1.0", + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" }, "Microsoft.NETCore.Targets": { "type": "Transitive", @@ -797,10 +799,11 @@ }, "MimeKit": { "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "OYn8b8b66J4mgtDzoImepiUtdkJOAVGoTj/ghzJ+az4wVixA5L5Z8GmgFhRvQ1btAIwZh/d9zvZLCALndQdz5w==", + "resolved": "4.7.1", + "contentHash": "Qoj4aVvhX14A1FNvaJ33hzOP4VZI2j+Mr38I9wSGcjMq4BYDtWLJG89aJ9nRW2cNfH6Czjwyp7+Mh++xv3AZvg==", "dependencies": { - "BouncyCastle.Cryptography": "2.3.0", + "BouncyCastle.Cryptography": "2.4.0", + "System.Formats.Asn1": "8.0.1", "System.Security.Cryptography.Pkcs": "8.0.0" } }, @@ -990,6 +993,15 @@ "resolved": "4.5.1", "contentHash": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==" }, + "System.ClientModel": { + "type": "Transitive", + "resolved": "1.0.0", + "contentHash": "I3CVkvxeqFYjIVEP59DnjbeoGNfo/+SZrCLpRz2v/g0gpCHaEMPtWSY0s9k/7jR1rAsLNg2z2u1JRB76tPjnIw==", + "dependencies": { + "System.Memory.Data": "1.0.2", + "System.Text.Json": "4.7.2" + } + }, "System.CodeDom": { "type": "Transitive", "resolved": "8.0.0", @@ -1095,8 +1107,8 @@ }, "System.Formats.Asn1": { "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "AJukBuLoe3QeAF+mfaRKQb2dgyrvt340iMBHYv+VdBzCUM06IxGlvl0o/uPOS7lHnXPN6u8fFRHSHudx5aTi8w==" + "resolved": "8.0.1", + "contentHash": "XqKba7Mm/koKSjKMfW82olQdmfbI5yqeoLV/tidRp7fbh5rmHAQ5raDI/7SU0swTzv+jgqtUGkzmFxuUg0it1A==" }, "System.Globalization": { "type": "Transitive", @@ -1206,15 +1218,6 @@ "System.Threading.Tasks": "4.3.0" } }, - "System.IO.FileSystem.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "SxHB3nuNrpptVk+vZ/F+7OHEpoHUIKKMl02bUmYHQr1r+glbZQxs7pRtsf4ENO29TVm2TH3AEeep2fJcy92oYw==", - "dependencies": { - "System.Security.AccessControl": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "System.IO.FileSystem.Primitives": { "type": "Transitive", "resolved": "4.3.0", @@ -1529,15 +1532,6 @@ "System.Runtime.Extensions": "4.3.0" } }, - "System.Security.AccessControl": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.Security.Principal.Windows": "5.0.0" - } - }, "System.Security.Cryptography.Algorithms": { "type": "Transitive", "resolved": "4.3.0", @@ -1695,11 +1689,6 @@ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" } }, - "System.Security.Principal.Windows": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==" - }, "System.Text.Encoding": { "type": "Transitive", "resolved": "4.3.0", @@ -1832,8 +1821,8 @@ }, "Yarp.ReverseProxy": { "type": "Transitive", - "resolved": "2.0.1", - "contentHash": "op7vBwONPFeR1PYxeLw+RLqSodODDX8RWd0OinLGMVIq6yi1q9mv1j56ImuyZgiAToksiC0Dc7jbRUZ9I+jvFA==", + "resolved": "2.1.0", + "contentHash": "VgRuCBxmh5ND4VuFhvIN3AAeoxFhYkS2hNINk6AVCrOVTlpk7OwdrTXi8NHACfqfhDL+/oYCZrF9RxN+yiYnEg==", "dependencies": { "System.IO.Hashing": "7.0.0" } @@ -1842,8 +1831,8 @@ "type": "Project", "dependencies": { "Algolia.Search": "[6.16.0, )", - "Kentico.Xperience.Admin": "[29.0.0, )", - "Kentico.Xperience.WebApp": "[29.0.0, )" + "Kentico.Xperience.Admin": "[29.5.0, )", + "Kentico.Xperience.WebApp": "[29.5.0, )" } }, "Algolia.Search": { @@ -1857,14 +1846,14 @@ }, "Kentico.Xperience.Admin": { "type": "CentralTransitive", - "requested": "[29.0.0, )", - "resolved": "29.0.0", - "contentHash": "0PZqIlNEjpE5GHPtTMHzd5KkO428oRJlYEDx2YmLLYkm+UDMsRIwaS91UtmZTP5FYlDzv7yq0zgB4hqbcdsZTA==", + "requested": "[29.5.0, )", + "resolved": "29.5.0", + "contentHash": "B1vIV5IO5CdFCQeB1G1tO6We54hwZO1HJFwDs79uniA7sioqx+LOYHNkhprbvRibhDN1eDXMgeIWgG2l0BRoPA==", "dependencies": { "Kentico.Aira.Client": "1.0.25", - "Kentico.Xperience.WebApp": "[29.0.0]", - "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.29", - "Microsoft.Extensions.FileProviders.Embedded": "6.0.29" + "Kentico.Xperience.WebApp": "[29.5.0]", + "Microsoft.AspNetCore.SpaServices.Extensions": "6.0.33", + "Microsoft.Extensions.FileProviders.Embedded": "6.0.33" } } }