From ee5b84acfd993387e463d17d40ddabeb9cf41cee Mon Sep 17 00:00:00 2001 From: Stoyan Dimitrov Date: Thu, 27 Oct 2022 15:54:55 +0300 Subject: [PATCH] Upgrade to 14.3 --- AssemblyInfoShare/SharedAssemblyInfo.cs | Bin 2380 -> 2380 bytes FeatherWidgets.sln | 24 +- .nuget/NuGet.Config => NuGet.Config | 0 .nuget/NuGet.targets => NuGet.targets | 0 README.md | 4 +- .../Mvc/Controllers/BlogController.cs | 23 +- .../Mvc/Controllers/BlogPostController.cs | 11 +- .../Mvc/Scripts/Blog/designerview-simple.js | 23 +- .../Scripts/BlogPost/designerview-simple.js | 21 +- .../Mvc/StringResources/BlogListResources.cs | 15 + .../Mvc/StringResources/BlogPostResources.cs | 15 + .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Blogs.csproj | 35 +- .../packages.config | 12 +- .../Mvc/Scripts/Card/designerview-simple.js | 2 +- .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Card.csproj | 38 +- .../packages.config | 12 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ...elerik.Sitefinity.Frontend.Comments.csproj | 32 +- .../packages.config | 8 +- .../Mvc/Controllers/ContentBlockController.cs | 7 + .../Mvc/Views/web.config | 442 +++++++++++++++ ...ik.Sitefinity.Frontend.ContentBlock.csproj | 30 +- .../packages.config | 8 +- .../Controllers/DynamicContentController.cs | 12 +- .../DynamicContent/designerview-simple.js | 21 +- .../DynamicContentResources.cs | 15 + .../Mvc/Views/web.config | 442 +++++++++++++++ .../MvcWidgetInstaller.cs | 4 +- ....Sitefinity.Frontend.DynamicContent.csproj | 40 +- .../packages.config | 12 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ....Sitefinity.Frontend.EmailCampaigns.csproj | 36 +- .../packages.config | 12 +- .../Mvc/Controllers/EventController.cs | 12 +- .../Mvc/Scripts/Event/designerview-simple.js | 22 +- .../Mvc/StringResources/EventResources.cs | 15 + .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Events.csproj | 41 +- .../packages.config | 12 +- .../Initializer.cs | 114 ---- .../Mvc/Controllers/CaptchaController.cs | 8 + .../Controllers/CheckboxesFieldController.cs | 8 + .../DropdownListFieldController.cs | 8 + .../Controllers/EmailTextFieldController.cs | 8 + .../Mvc/Controllers/FileFieldController.cs | 8 + .../Mvc/Controllers/HiddenFieldController.cs | 8 + .../MultipleChoiceFieldController.cs | 8 + .../Controllers/NavigationFieldController.cs | 8 + .../Mvc/Controllers/PageBreakController.cs | 8 + .../ParagraphTextFieldController.cs | 8 + .../Controllers/SectionHeaderController.cs | 8 + .../Mvc/Controllers/SubmitButtonController.cs | 7 + .../Mvc/Controllers/TextFieldController.cs | 8 + .../Mvc/Models/FormModel.cs | 2 +- .../CheckboxesField/designerview-simple.js | 42 +- .../DropdownListField/designerview-simple.js | 26 +- .../designerview-simple.js | 46 +- .../DesignerView.Simple.cshtml | 8 +- .../DesignerView.Simple.cshtml | 10 +- .../DesignerView.Simple.cshtml | 8 +- .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Forms.csproj | 53 +- .../packages.config | 14 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ...elerik.Sitefinity.Frontend.Identity.csproj | 43 +- .../packages.config | 16 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ...efinity.Frontend.InlineClientAssets.csproj | 30 +- .../packages.config | 8 +- .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Lists.csproj | 38 +- .../packages.config | 12 +- .../Scripts/Document/designerview-simple.js | 4 + .../Mvc/Scripts/Image/designerview-simple.js | 11 +- .../Mvc/Scripts/Video/designerview-simple.js | 4 + .../Mvc/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.Media.csproj | 38 +- .../packages.config | 12 +- .../Mvc/Models/Breadcrumb/BreadcrumbModel.cs | 62 +-- .../Mvc/Views/web.config | 442 +++++++++++++++ ...erik.Sitefinity.Frontend.Navigation.csproj | 36 +- .../packages.config | 12 +- .../MVC/Controllers/NewsController.cs | 14 +- .../MVC/Scripts/News/designerview-simple.js | 21 +- .../MVC/Views/News/List.NewsList.cshtml | 4 +- .../MVC/Views/web.config | 442 +++++++++++++++ .../Telerik.Sitefinity.Frontend.News.csproj | 48 +- .../packages.config | 20 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ...erik.Sitefinity.Frontend.Publishing.csproj | 32 +- .../packages.config | 8 +- .../Controllers/RecommendationsController.cs | 215 ++++++++ .../Recommendations/recommendations.js | 94 ++++ .../Recommendations/Recommendations.cshtml | 18 + .../Views/Recommendations/Sample.Index.cshtml | 11 + .../Properties/AssemblyInfo.cs | Bin 0 -> 3266 bytes ...Sitefinity.Frontend.Recommendations.csproj | 90 +++ .../app.config | 11 + .../packages.config | 19 + .../Mvc/Controllers/FacetsController.cs | 520 ++++++++++++++++++ .../Controllers/SearchResultsController.cs | 28 +- .../Mvc/Models/FacetElementViewModel.cs | 25 + .../Mvc/Models/FacetWidgetFieldModel.cs | 27 + .../Mvc/Models/FacetableFieldSettings.cs | 25 + .../Mvc/Models/FacetsWidgetViewModel.cs | 58 ++ .../Mvc/Models/ISearchBoxModel.cs | 5 + .../Mvc/Models/ISearchResultsModel.cs | 5 +- .../Mvc/Models/SearchBoxModel.cs | 3 + .../Mvc/Models/SearchFacetsViewModel.cs | 57 ++ .../Mvc/Models/SearchResultsModel.cs | 79 ++- .../Mvc/Scripts/Facets/facets-widget.js | 359 ++++++++++++ .../Mvc/Scripts/Facets/facets-widget.min.js | 2 + .../Scripts/Facets/facets-widget.min.js.map | 1 + .../Mvc/Scripts/Facets/query-string-utils.js | 64 +++ .../Scripts/Facets/query-string-utils.min.js | 2 + .../Facets/query-string-utils.min.js.map | 1 + .../Mvc/Scripts/SearchBox/Search-box.js | 9 + .../Mvc/Scripts/SearchBox/Search-box.min.js | 2 +- .../Scripts/SearchBox/Search-box.min.js.map | 2 +- .../Scripts/SearchResults/Search-results.js | 89 ++- .../SearchResults/Search-results.min.js | 2 +- .../SearchResults/Search-results.min.js.map | 2 +- .../StringResources/SearchWidgetsResources.cs | 83 ++- .../Mvc/Views/Facets/Facets.cshtml | 68 +++ .../Mvc/Views/SearchBox/SearchBox.cshtml | 1 + .../Views/SearchResults/SearchResults.cshtml | 22 +- .../Mvc/Views/web.config | 442 +++++++++++++++ .../Properties/AssemblyInfo.cs | Bin 1254 -> 1398 bytes .../Services/FilterModel.cs | 9 + .../Services/FilterParameter.cs | 18 + .../SearchFacetsQueryStringProcessor.cs | 298 ++++++++++ .../Telerik.Sitefinity.Frontend.Search.csproj | 70 ++- Telerik.Sitefinity.Frontend.Search/app.config | 11 + .../packages.config | 13 +- .../Mvc/Views/web.config | 442 +++++++++++++++ ...erik.Sitefinity.Frontend.Taxonomies.csproj | 36 +- .../packages.config | 12 +- 139 files changed, 10726 insertions(+), 727 deletions(-) rename .nuget/NuGet.Config => NuGet.Config (100%) rename .nuget/NuGet.targets => NuGet.targets (100%) create mode 100644 Telerik.Sitefinity.Frontend.Blogs/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Card/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Comments/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.EmailCampaigns/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Events/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Forms/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Identity/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.InlineClientAssets/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Lists/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Media/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Navigation/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.News/MVC/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Publishing/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/MVC/Controllers/RecommendationsController.cs create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/MVC/Scripts/Recommendations/recommendations.js create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Recommendations.cshtml create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Sample.Index.cshtml create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/Properties/AssemblyInfo.cs create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/Telerik.Sitefinity.Frontend.Recommendations.csproj create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/app.config create mode 100644 Telerik.Sitefinity.Frontend.Recommendations/packages.config create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/FacetsController.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetElementViewModel.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetWidgetFieldModel.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetableFieldSettings.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetsWidgetViewModel.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchFacetsViewModel.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.js create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.min.js create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.min.js.map create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.js create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.min.js create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.min.js.map create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Views/Facets/Facets.cshtml create mode 100644 Telerik.Sitefinity.Frontend.Search/Mvc/Views/web.config create mode 100644 Telerik.Sitefinity.Frontend.Search/Services/FilterModel.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Services/FilterParameter.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/Services/SearchFacetsQueryStringProcessor.cs create mode 100644 Telerik.Sitefinity.Frontend.Search/app.config create mode 100644 Telerik.Sitefinity.Frontend.Taxonomies/Mvc/Views/web.config diff --git a/AssemblyInfoShare/SharedAssemblyInfo.cs b/AssemblyInfoShare/SharedAssemblyInfo.cs index 2594cc7f975ed3acab58763daab33dad955a63b6..aff95ed1e6d1f42b4b0dfcdb8e718359dd9ccd35 100644 GIT binary patch delta 46 tcmX>jbVg{yB@T9D20aD~27}2rIU=Q?Yz6}$)B|EA22F-o23`g(1^@+92t)t? delta 46 tcmX>jbVg{yB@T8Y20aFI2FuAeIU=Q?Yz6}$)B|EA22F-o23`g(1^@=H2vPt5 diff --git a/FeatherWidgets.sln b/FeatherWidgets.sln index cfcb8522d..0aa93c090 100644 --- a/FeatherWidgets.sln +++ b/FeatherWidgets.sln @@ -1,17 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28010.2041 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend.ContentBlock", "Telerik.Sitefinity.Frontend.ContentBlock\Telerik.Sitefinity.Frontend.ContentBlock.csproj", "{827B5C1E-619A-4080-A7F1-10D103C38CFD}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{5EEBCA3A-43FA-4A20-98D2-F47E2CDD56E4}" - ProjectSection(SolutionItems) = preProject - .nuget\NuGet.Config = .nuget\NuGet.Config - .nuget\NuGet.exe = .nuget\NuGet.exe - .nuget\NuGet.targets = .nuget\NuGet.targets - EndProjectSection -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend.Navigation", "Telerik.Sitefinity.Frontend.Navigation\Telerik.Sitefinity.Frontend.Navigation.csproj", "{FC694955-3DF4-4A35-AD3E-A6954D6243B1}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend.News", "Telerik.Sitefinity.Frontend.News\Telerik.Sitefinity.Frontend.News.csproj", "{574042A9-61AA-4EAC-83D2-79CD19AA8BD4}" @@ -44,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend.Events", "Telerik.Sitefinity.Frontend.Events\Telerik.Sitefinity.Frontend.Events.csproj", "{3D2B45EF-A016-4821-8BA0-BADADE614080}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Telerik.Sitefinity.Frontend.Recommendations", "Telerik.Sitefinity.Frontend.Recommendations\Telerik.Sitefinity.Frontend.Recommendations.csproj", "{78C09666-AF19-4920-9DBA-930694586127}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -136,8 +131,17 @@ Global {3D2B45EF-A016-4821-8BA0-BADADE614080}.Release Pro|Any CPU.ActiveCfg = Release|Any CPU {3D2B45EF-A016-4821-8BA0-BADADE614080}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D2B45EF-A016-4821-8BA0-BADADE614080}.Release|Any CPU.Build.0 = Release|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Release Pro|Any CPU.ActiveCfg = Release|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Release Pro|Any CPU.Build.0 = Release|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Release|Any CPU.ActiveCfg = Release|Any CPU + {78C09666-AF19-4920-9DBA-930694586127}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE - EndGlobalSection + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B8E1E267-0F87-46BF-83AA-809C5BF1D55C} + EndGlobalSection EndGlobal diff --git a/.nuget/NuGet.Config b/NuGet.Config similarity index 100% rename from .nuget/NuGet.Config rename to NuGet.Config diff --git a/.nuget/NuGet.targets b/NuGet.targets similarity index 100% rename from .nuget/NuGet.targets rename to NuGet.targets diff --git a/README.md b/README.md index 7e50c5dab..b6109bdbe 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -The Feather Project +The Feather Project ======= This repository contains custom MVC widgets which are part of [Project Feather](http://projectfeather.sitefinity.com). @@ -46,7 +46,7 @@ This repository contains custom MVC widgets which are part of [Project Feather]( This project has been released under the Apache License, version 2.0, the text of which is included below. This license applies ONLY to the project-specific source of each repository and does not extend to Telerik Sitefinity CMS itself, or any other 3rd party libraries used in a repository. For licensing information about Telerik Sitefinity CMS, see the [License Agreements page](http://www.sitefinity.com/purchase/license-agreement) at [Sitefinity.com](http://www.sitefinity.com/). -Copyright © 2005-2017 Telerik AD +Copyright © 2005-2017 Telerik AD Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogController.cs b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogController.cs index 9e6ab3fa2..396c0e3c8 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogController.cs +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogController.cs @@ -2,15 +2,19 @@ using System.ComponentModel; using System.Linq; using System.Web.Mvc; +using Telerik.Sitefinity.Abstractions; using Telerik.Sitefinity.Blogs.Model; using Telerik.Sitefinity.Frontend.Blogs.Mvc.Models.Blog; using Telerik.Sitefinity.Frontend.Blogs.Mvc.StringResources; using Telerik.Sitefinity.Frontend.Mvc.Helpers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; +using Telerik.Sitefinity.Frontend.Mvc.Models; +using Telerik.Sitefinity.Localization; using Telerik.Sitefinity.Modules.Pages.Configuration; using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Personalization; +using Telerik.Sitefinity.Security.Sanitizers; using Telerik.Sitefinity.Services; namespace Telerik.Sitefinity.Frontend.Blogs.Mvc.Controllers @@ -124,7 +128,15 @@ public ActionResult Index(int? page) var fullTemplateName = this.listTemplateNamePrefix + this.ListTemplateName; if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) - return this.Details((Blog)viewModel.Items.First().DataItem); + { + var itemViewModel = viewModel.Items.FirstOrDefault(); + + if (itemViewModel == null) + return this.HandleInvalidDetailsAction(Res.Get().BlogListDetailViewDesignerResponseMessage); + + return this.Details((Blog)itemViewModel.DataItem); + } + if (SystemManager.CurrentHttpContext != null) { @@ -144,7 +156,7 @@ public ActionResult Index(int? page) /// The . /// public ActionResult Details(Blog item) - { + { var fullTemplateName = this.detailTemplateNamePrefix + this.DetailTemplateName; if (item != null) @@ -182,7 +194,12 @@ protected override void HandleUnknownAction(string actionName) private void InitializeListViewBag(string redirectPageUrl) { this.ViewBag.CurrentPageUrl = SystemManager.CurrentHttpContext != null ? this.GetCurrentPageUrl() : string.Empty; - this.ViewBag.RedirectPageUrlTemplate = this.ViewBag.CurrentPageUrl + redirectPageUrl; + + var redirectPageUrlTemplate = this.ViewBag.CurrentPageUrl + redirectPageUrl; + var sanitizer = ObjectFactory.Resolve(); + redirectPageUrlTemplate = sanitizer.SanitizeUrl(redirectPageUrlTemplate); + + this.ViewBag.RedirectPageUrlTemplate = redirectPageUrlTemplate; this.ViewBag.ItemsPerPage = this.Model.ItemsPerPage; this.ViewBag.DetailPageMode = this.DetailPageMode; this.ViewBag.DetailsPageId = this.DetailsPageId; diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogPostController.cs b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogPostController.cs index 7d82c6d4c..6c172a713 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogPostController.cs +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Controllers/BlogPostController.cs @@ -13,6 +13,8 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Routing; +using Telerik.Sitefinity.Frontend.Mvc.Models; +using Telerik.Sitefinity.Localization; using Telerik.Sitefinity.Modules.Blogs; using Telerik.Sitefinity.Modules.Pages; using Telerik.Sitefinity.Modules.Pages.Configuration; @@ -170,7 +172,14 @@ public ActionResult Index(int? page) var fullTemplateName = this.listTemplateNamePrefix + this.ListTemplateName; if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) - return this.Details((BlogPost)viewModel.Items.First().DataItem); + { + var itemViewModel = viewModel.Items.FirstOrDefault(); + + if (itemViewModel == null) + return this.HandleInvalidDetailsAction(Res.Get().BlogPostDetailViewDesignerResponseMessage); + + return this.Details((BlogPost)itemViewModel.DataItem); + } this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); if (viewModel.ContentType != null) diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/Blog/designerview-simple.js b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/Blog/designerview-simple.js index 697bca452..e65072229 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/Blog/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/Blog/designerview-simple.js @@ -42,6 +42,18 @@ true ); + $scope.$watch( + 'properties.SelectionMode.PropertyValue', + function (newSelectionModeValue, oldSelectionModeValue) { + if (newSelectionModeValue !== oldSelectionModeValue) { + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase() && newSelectionModeValue !== "SelectedItems") { + $scope.properties.ContentViewDisplayMode.PropertyValue = "Automatic"; + } + } + }, + true + ); + propertyService.get() .then(function (data) { if (data && data.Items) { @@ -85,6 +97,10 @@ if ($scope.properties.SortExpression.PropertyValue === "AsSetManually") { $scope.properties.SortExpression.PropertyValue = "PublicationDate DESC"; } + + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase()) { + $scope.properties.SelectionMode.PropertyValue = "SelectedItems"; + } } // Set MaxPostsAge to 1 if not used @@ -95,12 +111,7 @@ // Set MinPostsCount to 0 if not used if ($scope.properties.SelectionMode.PropertyValue !== 'FilteredItems' || $scope.properties.FilteredSelectionMode.PropertyValue === 'MaxPostsAge') { $scope.properties.MinPostsCount.PropertyValue = 0; - } - - if ($scope.properties.ContentViewDisplayMode.PropertyValue === 'Detail' && - ($scope.properties.SelectionMode.PropertyValue !== 'SelectedItems' || $scope.blogSelector.selectedItemsIds.length !== 1)) { - $scope.properties.ContentViewDisplayMode.PropertyValue = 'Automatic'; - } + } }); }) .finally(function () { diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/BlogPost/designerview-simple.js b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/BlogPost/designerview-simple.js index 4f0e999cd..ac595617c 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/BlogPost/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Scripts/BlogPost/designerview-simple.js @@ -85,6 +85,18 @@ true ); + $scope.$watch( + 'properties.SelectionMode.PropertyValue', + function (newSelectionModeValue, oldSelectionModeValue) { + if (newSelectionModeValue !== oldSelectionModeValue) { + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase() && newSelectionModeValue !== "SelectedItems") { + $scope.properties.ContentViewDisplayMode.PropertyValue = "Automatic"; + } + } + }, + true + ); + $scope.updateSortOption = function (newSortOption) { if ($scope.properties && newSortOption !== "Custom") { $scope.properties.SortExpression.PropertyValue = newSortOption; @@ -144,16 +156,15 @@ if ($scope.properties.SortExpression.PropertyValue === "AsSetManually") { $scope.properties.SortExpression.PropertyValue = "PublicationDate DESC"; } + + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase()) { + $scope.properties.SelectionMode.PropertyValue = "SelectedItems"; + } } if ($scope.properties.SelectionMode.PropertyValue !== "FilteredItems") { $scope.properties.SerializedAdditionalFilters.PropertyValue = null; } - - if ($scope.properties.ContentViewDisplayMode.PropertyValue === 'Detail' && - ($scope.properties.SelectionMode.PropertyValue !== 'SelectedItems' || $scope.blogPostSelector.selectedItemsIds.length !== 1)) { - $scope.properties.ContentViewDisplayMode.PropertyValue = 'Automatic'; - } }); }) .finally(function () { diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogListResources.cs b/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogListResources.cs index 8aacecf0c..1e4bc135c 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogListResources.cs +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogListResources.cs @@ -620,6 +620,21 @@ public string BlogsList } } + /// + /// Gets External Link Label: Work with revision history + /// + [ResourceEntry("BlogListDetailViewDesignerResponseMessage", + Value = "A blog was not selected or has been deleted. Please select another one.", + Description = "Detail View Designer Label: Response message", + LastModified = "2022/06/10")] + public string BlogListDetailViewDesignerResponseMessage + { + get + { + return this["BlogListDetailViewDesignerResponseMessage"]; + } + } + #endregion } } \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogPostResources.cs b/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogPostResources.cs index 182744894..71377d027 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogPostResources.cs +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/StringResources/BlogPostResources.cs @@ -636,6 +636,21 @@ public string BlogPostsViewDescription } } + /// + /// Gets External Link Label: Work with revision history + /// + [ResourceEntry("BlogPostDetailViewDesignerResponseMessage", + Value = "A blog post was not selected or has been deleted. Please select another one.", + Description = "Detail View Designer Label: Response message", + LastModified = "2022/06/10")] + public string BlogPostDetailViewDesignerResponseMessage + { + get + { + return this["BlogPostDetailViewDesignerResponseMessage"]; + } + } + #endregion } } \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Blogs/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Blogs/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Blogs/Telerik.Sitefinity.Frontend.Blogs.csproj b/Telerik.Sitefinity.Frontend.Blogs/Telerik.Sitefinity.Frontend.Blogs.csproj index b944a0c25..ff6ba77ba 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/Telerik.Sitefinity.Frontend.Blogs.csproj +++ b/Telerik.Sitefinity.Frontend.Blogs/Telerik.Sitefinity.Frontend.Blogs.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -64,7 +74,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -79,8 +89,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -145,9 +155,6 @@ - - PublicKey.snk - @@ -168,42 +175,40 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - diff --git a/Telerik.Sitefinity.Frontend.Blogs/packages.config b/Telerik.Sitefinity.Frontend.Blogs/packages.config index ec92b5062..dcea84a84 100644 --- a/Telerik.Sitefinity.Frontend.Blogs/packages.config +++ b/Telerik.Sitefinity.Frontend.Blogs/packages.config @@ -7,15 +7,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Card/Mvc/Scripts/Card/designerview-simple.js b/Telerik.Sitefinity.Frontend.Card/Mvc/Scripts/Card/designerview-simple.js index 9189f2b56..b50813406 100644 --- a/Telerik.Sitefinity.Frontend.Card/Mvc/Scripts/Card/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Card/Mvc/Scripts/Card/designerview-simple.js @@ -17,7 +17,7 @@ $scope.properties = propertyService.toAssociativeArray(data.Items); var isPageSelectMode = $scope.properties.IsPageSelectMode.PropertyValue; - $scope.properties.IsPageSelectMode.PropertyValue = isPageSelectMode.toLowerCase() === "true"; + $scope.properties.IsPageSelectMode.PropertyValue = typeof isPageSelectMode === "boolean" ? isPageSelectMode : isPageSelectMode.toLowerCase() === "true"; }, function (errorData) { $scope.feedback.showError = true; diff --git a/Telerik.Sitefinity.Frontend.Card/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Card/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Card/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Card/Telerik.Sitefinity.Frontend.Card.csproj b/Telerik.Sitefinity.Frontend.Card/Telerik.Sitefinity.Frontend.Card.csproj index c5a095278..7c89381aa 100644 --- a/Telerik.Sitefinity.Frontend.Card/Telerik.Sitefinity.Frontend.Card.csproj +++ b/Telerik.Sitefinity.Frontend.Card/Telerik.Sitefinity.Frontend.Card.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + True @@ -63,7 +73,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -78,8 +88,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -134,9 +144,6 @@ - - PublicKey.snk - @@ -150,42 +157,37 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Card/packages.config b/Telerik.Sitefinity.Frontend.Card/packages.config index ec92b5062..dcea84a84 100644 --- a/Telerik.Sitefinity.Frontend.Card/packages.config +++ b/Telerik.Sitefinity.Frontend.Card/packages.config @@ -7,15 +7,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Comments/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Comments/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Comments/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Comments/Telerik.Sitefinity.Frontend.Comments.csproj b/Telerik.Sitefinity.Frontend.Comments/Telerik.Sitefinity.Frontend.Comments.csproj index 4d9c5d58d..e81bd9e1c 100644 --- a/Telerik.Sitefinity.Frontend.Comments/Telerik.Sitefinity.Frontend.Comments.csproj +++ b/Telerik.Sitefinity.Frontend.Comments/Telerik.Sitefinity.Frontend.Comments.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -131,9 +141,6 @@ - - PublicKey.snk - @@ -164,31 +171,31 @@ - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Services.Comments.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Services.Comments.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -199,12 +206,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Comments/packages.config b/Telerik.Sitefinity.Frontend.Comments/packages.config index f9663a375..10196ffcc 100644 --- a/Telerik.Sitefinity.Frontend.Comments/packages.config +++ b/Telerik.Sitefinity.Frontend.Comments/packages.config @@ -9,8 +9,8 @@ - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Controllers/ContentBlockController.cs b/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Controllers/ContentBlockController.cs index d37bdc32c..f5c00a720 100644 --- a/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Controllers/ContentBlockController.cs +++ b/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Controllers/ContentBlockController.cs @@ -34,6 +34,13 @@ namespace Telerik.Sitefinity.Frontend.ContentBlock.Mvc.Controllers ResourceClassId = nameof(ContentBlockResources), SectionName = ToolboxesConfig.ContentToolboxSectionName, CssClass = ContentBlockController.WidgetIconCssClass)] + [ControllerToolboxItem( + Name = "MvcInstructionalTextField", + Toolbox = "FormControls", + SectionName = "Common", + Title = "Content block", + CssClass = "sfInstructionIcn sfMvcIcn", + Ordinal = 0.19f)] [Localization(typeof(ContentBlockResources))] public class ContentBlockController : Controller, IHasContainerType, diff --git a/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.ContentBlock/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.ContentBlock/Telerik.Sitefinity.Frontend.ContentBlock.csproj b/Telerik.Sitefinity.Frontend.ContentBlock/Telerik.Sitefinity.Frontend.ContentBlock.csproj index e500adf6a..927383526 100644 --- a/Telerik.Sitefinity.Frontend.ContentBlock/Telerik.Sitefinity.Frontend.ContentBlock.csproj +++ b/Telerik.Sitefinity.Frontend.ContentBlock/Telerik.Sitefinity.Frontend.ContentBlock.csproj @@ -47,6 +47,18 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + ..\FxCop\Feather.ruleset + false + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -133,9 +145,6 @@ - - PublicKey.snk - @@ -150,37 +159,36 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - diff --git a/Telerik.Sitefinity.Frontend.ContentBlock/packages.config b/Telerik.Sitefinity.Frontend.ContentBlock/packages.config index 8d00a877a..02d3f565a 100644 --- a/Telerik.Sitefinity.Frontend.ContentBlock/packages.config +++ b/Telerik.Sitefinity.Frontend.ContentBlock/packages.config @@ -9,8 +9,8 @@ - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Controllers/DynamicContentController.cs b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Controllers/DynamicContentController.cs index aa1a050b9..0267e8150 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Controllers/DynamicContentController.cs +++ b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Controllers/DynamicContentController.cs @@ -170,7 +170,15 @@ public virtual ActionResult Index(int? page) var fullTemplateName = this.listTemplateNamePrefix + this.ListTemplateName; if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) - return this.Details((Telerik.Sitefinity.DynamicModules.Model.DynamicContent)viewModel.Items.First().DataItem); + { + var itemViewModel = viewModel.Items.FirstOrDefault(); + + if (itemViewModel == null) + return this.HandleInvalidDetailsAction(Res.Get().DynamicContentDetailViewDesignerResponseMessage); + + return this.Details((Telerik.Sitefinity.DynamicModules.Model.DynamicContent)itemViewModel.DataItem); + + } this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); if (viewModel.ContentType != null) @@ -322,7 +330,7 @@ public virtual ActionResult RelatedData(IDataItem relatedItem, int? page) /// /// Renders appropriate list view depending on the /// - /// The item which details will be displayed. + /// The item view model. /// /// The . /// diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Scripts/DynamicContent/designerview-simple.js b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Scripts/DynamicContent/designerview-simple.js index 437339e76..afd9f7d59 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Scripts/DynamicContent/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Scripts/DynamicContent/designerview-simple.js @@ -85,6 +85,18 @@ true ); + $scope.$watch( + 'properties.SelectionMode.PropertyValue', + function (newSelectionModeValue, oldSelectionModeValue) { + if (newSelectionModeValue !== oldSelectionModeValue) { + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase() && newSelectionModeValue !== "SelectedItems") { + $scope.properties.ContentViewDisplayMode.PropertyValue = "Automatic"; + } + } + }, + true + ); + $scope.updateSortOption = function (newSortOption) { if (newSortOption !== "Custom") { $scope.properties.SortExpression.PropertyValue = newSortOption; @@ -153,12 +165,11 @@ if ($scope.properties.SortExpression.PropertyValue === "AsSetManually") { $scope.properties.SortExpression.PropertyValue = "PublicationDate DESC"; } + + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase()) { + $scope.properties.SelectionMode.PropertyValue = "SelectedItems"; + } } - - if ($scope.properties.ContentViewDisplayMode.PropertyValue === 'Detail' && - ($scope.properties.SelectionMode.PropertyValue !== 'SelectedItems' || $scope.itemSelector.selectedItemsIds.length !== 1)) { - $scope.properties.ContentViewDisplayMode.PropertyValue = 'Automatic'; - } }); }) .finally(function () { diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/StringResources/DynamicContentResources.cs b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/StringResources/DynamicContentResources.cs index dff7bff04..e125c7ecb 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/StringResources/DynamicContentResources.cs +++ b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/StringResources/DynamicContentResources.cs @@ -644,5 +644,20 @@ public string AsSetInAdvancedMode return this["AsSetInAdvancedMode"]; } } + + /// + /// Gets External Link Label: Work with revision history + /// + [ResourceEntry("DynamicContentDetailViewDesignerResponseMessage", + Value = "An item was not selected or has been deleted. Please select another one.", + Description = "Detail View Designer Label: Response message", + LastModified = "2022/06/10")] + public string DynamicContentDetailViewDesignerResponseMessage + { + get + { + return this["DynamicContentDetailViewDesignerResponseMessage"]; + } + } } } diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.DynamicContent/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/MvcWidgetInstaller.cs b/Telerik.Sitefinity.Frontend.DynamicContent/MvcWidgetInstaller.cs index 19045cb5e..68ff032e6 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/MvcWidgetInstaller.cs +++ b/Telerik.Sitefinity.Frontend.DynamicContent/MvcWidgetInstaller.cs @@ -156,12 +156,12 @@ private static void UnregisterToolboxItem(string contentTypeName) { var itemToDelete = section.Tools.FirstOrDefault(e => e.Name == MvcWidgetInstaller.GetToolboxItemName(contentTypeName)); - if (itemToDelete != null) + if (itemToDelete != null && itemToDelete.Source == ConfigSource.Database) { section.Tools.Remove(itemToDelete); } - if (!section.Tools.Any()) + if (!section.Tools.Any() && section.Source == ConfigSource.Database) { pageControls.Sections.Remove(section); } diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/Telerik.Sitefinity.Frontend.DynamicContent.csproj b/Telerik.Sitefinity.Frontend.DynamicContent/Telerik.Sitefinity.Frontend.DynamicContent.csproj index 98a92eba4..aa9b8acd9 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/Telerik.Sitefinity.Frontend.DynamicContent.csproj +++ b/Telerik.Sitefinity.Frontend.DynamicContent/Telerik.Sitefinity.Frontend.DynamicContent.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -61,7 +71,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -76,8 +86,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -184,9 +194,6 @@ - - PublicKey.snk - Designer @@ -211,45 +218,40 @@ - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Services.Events.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Services.Events.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.DynamicContent/packages.config b/Telerik.Sitefinity.Frontend.DynamicContent/packages.config index 500c14c04..638055e69 100644 --- a/Telerik.Sitefinity.Frontend.DynamicContent/packages.config +++ b/Telerik.Sitefinity.Frontend.DynamicContent/packages.config @@ -7,15 +7,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.EmailCampaigns/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.EmailCampaigns/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.EmailCampaigns/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.EmailCampaigns/Telerik.Sitefinity.Frontend.EmailCampaigns.csproj b/Telerik.Sitefinity.Frontend.EmailCampaigns/Telerik.Sitefinity.Frontend.EmailCampaigns.csproj index 1654b61f2..09fca4058 100644 --- a/Telerik.Sitefinity.Frontend.EmailCampaigns/Telerik.Sitefinity.Frontend.EmailCampaigns.csproj +++ b/Telerik.Sitefinity.Frontend.EmailCampaigns/Telerik.Sitefinity.Frontend.EmailCampaigns.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\AntiXSS.4.3.0\lib\net40\AntiXssLibrary.dll @@ -69,7 +79,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -85,8 +95,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -151,9 +161,6 @@ - - PublicKey.snk - @@ -173,38 +180,33 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.EmailCampaigns/packages.config b/Telerik.Sitefinity.Frontend.EmailCampaigns/packages.config index cc34b8dbc..14b04585c 100644 --- a/Telerik.Sitefinity.Frontend.EmailCampaigns/packages.config +++ b/Telerik.Sitefinity.Frontend.EmailCampaigns/packages.config @@ -7,15 +7,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Events/Mvc/Controllers/EventController.cs b/Telerik.Sitefinity.Frontend.Events/Mvc/Controllers/EventController.cs index b680a403a..7fc2e80b6 100644 --- a/Telerik.Sitefinity.Frontend.Events/Mvc/Controllers/EventController.cs +++ b/Telerik.Sitefinity.Frontend.Events/Mvc/Controllers/EventController.cs @@ -11,6 +11,9 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; +using Telerik.Sitefinity.Frontend.Mvc.Models; +using Telerik.Sitefinity.Localization; +using Telerik.Sitefinity.Modules.Lists.Web.Services.Data; using Telerik.Sitefinity.Modules.Pages.Configuration; using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Personalization; @@ -155,7 +158,14 @@ public ActionResult Index(int? page) var fullTemplateName = EventController.ListTemplateNamePrefix + this.ListTemplateName; if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) - return this.Details((Event)viewModel.Items.First().DataItem); + { + var itemViewModel = viewModel.Items.FirstOrDefault(); + + if (itemViewModel == null) + return this.HandleInvalidDetailsAction(Res.Get().EventsDetailViewDesignerResponseMessage); + + return this.Details((Event)itemViewModel.DataItem); + } this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); if (viewModel.ContentType != null) diff --git a/Telerik.Sitefinity.Frontend.Events/Mvc/Scripts/Event/designerview-simple.js b/Telerik.Sitefinity.Frontend.Events/Mvc/Scripts/Event/designerview-simple.js index 1e130fbb9..b6d51d2cc 100644 --- a/Telerik.Sitefinity.Frontend.Events/Mvc/Scripts/Event/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Events/Mvc/Scripts/Event/designerview-simple.js @@ -76,6 +76,18 @@ true ); + $scope.$watch( + 'properties.SelectionMode.PropertyValue', + function (newSelectionModeValue, oldSelectionModeValue) { + if (newSelectionModeValue !== oldSelectionModeValue) { + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase() && newSelectionModeValue !== "SelectedItems") { + $scope.properties.ContentViewDisplayMode.PropertyValue = "Automatic"; + } + } + }, + true + ); + $scope.updateSortOption = function (newSortOption) { if (newSortOption !== "Custom") { $scope.selectedSortOption = newSortOption; @@ -138,17 +150,15 @@ $scope.properties.SortExpression.PropertyValue = 'EventStart ASC'; $scope.selectedSortOption = 'EventStart ASC'; } + + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase()) { + $scope.properties.SelectionMode.PropertyValue = "SelectedItems"; + } } else { $scope.properties.SerializedAdditionalFilters.PropertyValue = null; $scope.properties.SerializedNarrowSelectionFilters.PropertyValue = null; } - - if ($scope.properties.ContentViewDisplayMode.PropertyValue === 'Detail' && - ($scope.properties.SelectionMode.PropertyValue !== 'SelectedItems' || $scope.eventSelector.selectedItemsIds.length !== 1)) { - $scope.properties.ContentViewDisplayMode.PropertyValue = 'Automatic'; - } - }); }) .finally(function () { diff --git a/Telerik.Sitefinity.Frontend.Events/Mvc/StringResources/EventResources.cs b/Telerik.Sitefinity.Frontend.Events/Mvc/StringResources/EventResources.cs index a14d2e0e3..7d6bc87ec 100644 --- a/Telerik.Sitefinity.Frontend.Events/Mvc/StringResources/EventResources.cs +++ b/Telerik.Sitefinity.Frontend.Events/Mvc/StringResources/EventResources.cs @@ -979,6 +979,21 @@ public string EventsViewDescription } } + /// + /// Gets External Link Label: Work with revision history + /// + [ResourceEntry("EventsDetailViewDesignerResponseMessage", + Value = "An event was not selected or has been deleted. Please select another one.", + Description = "Detail View Designer Label: Response message", + LastModified = "2022/06/10")] + public string EventsDetailViewDesignerResponseMessage + { + get + { + return this["EventsDetailViewDesignerResponseMessage"]; + } + } + /// /// The title of the calendar widget /// diff --git a/Telerik.Sitefinity.Frontend.Events/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Events/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Events/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Events/Telerik.Sitefinity.Frontend.Events.csproj b/Telerik.Sitefinity.Frontend.Events/Telerik.Sitefinity.Frontend.Events.csproj index a38411f51..5798e9d26 100644 --- a/Telerik.Sitefinity.Frontend.Events/Telerik.Sitefinity.Frontend.Events.csproj +++ b/Telerik.Sitefinity.Frontend.Events/Telerik.Sitefinity.Frontend.Events.csproj @@ -43,6 +43,15 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -63,7 +72,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -78,8 +87,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -150,9 +159,6 @@ - - PublicKey.snk - @@ -186,39 +192,39 @@ - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Services.Events.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Services.Events.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.RecurrentRules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.RecurrentRules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -226,12 +232,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Events/packages.config b/Telerik.Sitefinity.Frontend.Events/packages.config index 931d32daa..530ca92ff 100644 --- a/Telerik.Sitefinity.Frontend.Events/packages.config +++ b/Telerik.Sitefinity.Frontend.Events/packages.config @@ -8,15 +8,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Initializer.cs b/Telerik.Sitefinity.Frontend.Forms/Initializer.cs index f1b73b968..d94115a8e 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Initializer.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Initializer.cs @@ -59,64 +59,11 @@ private static void Bootstrapper_Initialized(object sender, ExecutedEventArgs e) VirtualPathManager.AddVirtualFileResolver(FormsVirtualRazorResolver.Path + "*", "MvcFormsResolver"); Initializer.UnregisterTemplatableControl(); - Initializer.AddFieldsToToolbox(); ObjectFactory.Container.RegisterType(); } } - private static void AddFieldsToToolbox() - { - var toolboxesConfig = Config.Get(); - - var section = Initializer.GetFormsToolboxSection(toolboxesConfig); - if (section == null) - return; - - ConfigManager configManager = null; - var items = new List>>() - { - new KeyValuePair>("MvcTextField", () => new ToolboxItemInfo("Textbox", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.TextFieldController", "sfTextboxIcn sfMvcIcn")), - new KeyValuePair>("MvcPageBreak", () => new ToolboxItemInfo("Page break", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.PageBreakController", "sfPageBreakIcn sfMvcIcn")), - new KeyValuePair>("MvcNavigationField", () => new ToolboxItemInfo("Form navigation", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.NavigationFieldController", "sfFormNavIcn sfMvcIcn")), - new KeyValuePair>("MvcMultipleChoiceField", () => new ToolboxItemInfo("Multiple choice", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.MultipleChoiceFieldController", "sfMultipleChoiceIcn sfMvcIcn")), - new KeyValuePair>("MvcCheckboxesField", () => new ToolboxItemInfo("Checkboxes", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.CheckboxesFieldController", "sfCheckboxesIcn sfMvcIcn")), - new KeyValuePair>("MvcParagraphTextField", () => new ToolboxItemInfo("Paragraph textbox", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.ParagraphTextFieldController", "sfParagraphboxIcn sfMvcIcn")), - new KeyValuePair>("MvcDropdownListField", () => new ToolboxItemInfo("Dropdown list", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.DropdownListFieldController", "sfDropdownIcn sfMvcIcn")), - new KeyValuePair>("MvcEmailTextField", () => new ToolboxItemInfo("Email", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.EmailTextFieldController", "sfTextboxIcn sfMvcIcn")), - new KeyValuePair>("MvcSectionHeaderField", () => new ToolboxItemInfo("Section header", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.SectionHeaderController", "sfSectionHeaderIcn sfMvcIcn")), - new KeyValuePair>("MvcInstructionalTextField", () => new ToolboxItemInfo("Content block", "Telerik.Sitefinity.Frontend.ContentBlock.Mvc.Controllers.ContentBlockController", "sfInstructionIcn sfMvcIcn")), - new KeyValuePair>("MvcFileField", () => new ToolboxItemInfo("File upload", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.FileFieldController", "sfFileUploadIcn sfMvcIcn")), - new KeyValuePair>("MvcCaptchaField", () => new ToolboxItemInfo("CAPTCHA", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.CaptchaController", "sfCaptchaIcn sfMvcIcn")), - new KeyValuePair>("MvcHiddenField", () => new ToolboxItemInfo("Hidden field", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.HiddenFieldController", "sfTextboxIcn sfMvcIcn")), - new KeyValuePair>("MvcSubmitButton", () => new ToolboxItemInfo("Submit button", "Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers.SubmitButtonController", "sfSubmitBtnIcn sfMvcIcn")), - }; - - foreach (var item in items) - { - if (!section.Tools.Contains(item.Key)) - { - if (configManager == null) - { - configManager = ConfigManager.GetManager(); - - toolboxesConfig = configManager.GetSection(); - section = Initializer.GetFormsToolboxSection(toolboxesConfig); - } - - RegisterToolboxItem(section, item.Key, item.Value()); - } - } - - if (configManager != null) - { - using (new ElevatedModeRegion(configManager)) - { - configManager.SaveSection(toolboxesConfig); - } - } - } - private static void UnregisterTemplatableControl() { ControlTemplates.UnregisterTemplatableControl(new ControlTemplateInfo() { ControlType = typeof(FormController), AreaName = "Form" }); @@ -130,67 +77,6 @@ private static void RegisteringFormScriptsHandler(IScriptsRegisteringEvent @even @event.Scripts.Add(new ScriptReference(string.Format("~/Frontend-Assembly/{0}/Mvc/Scripts/Form/form.js", typeof(Initializer).Assembly.GetName().Name))); } } - - private static void RegisterToolboxItem(ToolboxSection section, string name, ToolboxItemInfo item) - { - if (!section.Tools.Contains(name)) - { - var toolboxItem = new ToolboxItem(section.Tools) - { - Name = name, - Ordinal = 0.5f, - Title = item.Title, - Description = string.Empty, - ControlType = typeof(MvcControllerProxy).FullName, - ControllerType = item.ControllerType, - CssClass = item.CssClass, - Parameters = new NameValueCollection() - { - { "ControllerName", item.ControllerType } - } - }; - - section.Tools.Add(toolboxItem); - } - } - - private static ToolboxSection GetFormsToolboxSection(ToolboxesConfig toolboxesConfig) - { - var formsControls = toolboxesConfig.Toolboxes[FormsConstants.FormControlsToolboxName]; - var sectionName = FormsConstants.CommonSectionName; - ToolboxSection section = formsControls.Sections.Where(e => e.Name == sectionName).FirstOrDefault(); - - return section; - } - - internal class ToolboxItemInfo - { - public ToolboxItemInfo(string title, string controllerType, string cssClass) - { - this.Title = title; - this.ControllerType = controllerType; - this.CssClass = cssClass; - } - - public string Title - { - get; - private set; - } - - public string ControllerType - { - get; - private set; - } - - public string CssClass - { - get; - private set; - } - } - #endregion } } \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CaptchaController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CaptchaController.cs index 1705f238f..2990630cc 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CaptchaController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CaptchaController.cs @@ -7,6 +7,7 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI; using Telerik.Sitefinity.Web.UI.Fields.Enums; @@ -18,6 +19,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers [FormControlDisplayMode(FormControlDisplayMode.Write)] [Localization(typeof(FieldResources))] [IndexRenderMode(IndexRenderModes.NoOutput)] + [ControllerToolboxItem( + Name = "MvcCaptchaField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "CAPTCHA", + CssClass = "sfCaptchaIcn sfMvcIcn", + Ordinal = 0.21f)] public class CaptchaController : FormElementControllerBase, ICaptchaFormField { /// diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CheckboxesFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CheckboxesFieldController.cs index 55c9ca15a..605a6d9df 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CheckboxesFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/CheckboxesFieldController.cs @@ -11,6 +11,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -20,6 +21,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.LongText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcCheckboxesField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Checkboxes", + CssClass = "sfCheckboxesIcn sfMvcIcn", + Ordinal = 0.14f)] public class CheckboxesFieldController : FormFieldControllerBase, ISupportRules, ICheckboxFormField { public CheckboxesFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/DropdownListFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/DropdownListFieldController.cs index d16f8cd94..fa6528ec3 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/DropdownListFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/DropdownListFieldController.cs @@ -11,6 +11,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -20,6 +21,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcDropdownListField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Dropdown list", + CssClass = "sfDropdownIcn sfMvcIcn", + Ordinal = 0.16f)] public class DropdownListFieldController : FormFieldControllerBase, ISupportRules, IDropDownFormField { public DropdownListFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/EmailTextFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/EmailTextFieldController.cs index db7e4cf15..05a4e7348 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/EmailTextFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/EmailTextFieldController.cs @@ -13,6 +13,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -22,6 +23,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcEmailTextField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Email", + CssClass = "sfTextboxIcn sfMvcIcn", + Ordinal = 0.17f)] public class EmailTextFieldController : FormFieldControllerBase, ISupportRules, ITextField { public EmailTextFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/FileFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/FileFieldController.cs index 0a74ef684..8d6750b9d 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/FileFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/FileFieldController.cs @@ -12,6 +12,7 @@ using Telerik.Sitefinity.Modules.Forms; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers { @@ -21,6 +22,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers [FormControlDisplayMode(FormControlDisplayMode.Write)] [DatabaseMapping(UserFriendlyDataType.FileUpload)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcFileField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "File upload", + CssClass = "sfFileUploadIcn sfMvcIcn", + Ordinal = 0.2f)] public class FileFieldController : FormFieldControllerBase, IRequireLibrary, ISupportRules, IFileFormField { /// diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/HiddenFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/HiddenFieldController.cs index 7c684f1ad..e2019415b 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/HiddenFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/HiddenFieldController.cs @@ -8,6 +8,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -18,6 +19,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers [FormControlDisplayMode(FormControlDisplayMode.Write)] [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcHiddenField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Hidden field", + CssClass = "sfTextboxIcn sfMvcIcn", + Ordinal = 0.22f)] public class HiddenFieldController : FormFieldControllerBase, IHiddenFormField { public HiddenFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/MultipleChoiceFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/MultipleChoiceFieldController.cs index 00c0a42da..a1f14c595 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/MultipleChoiceFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/MultipleChoiceFieldController.cs @@ -11,6 +11,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -20,6 +21,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcMultipleChoiceField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Multiple choice", + CssClass = "sfMultipleChoiceIcn sfMvcIcn", + Ordinal = 0.13f)] public class MultipleChoiceFieldController : FormFieldControllerBase, ISupportRules, IMultipleChoiceFormField { public MultipleChoiceFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/NavigationFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/NavigationFieldController.cs index a280da006..24ef9e3ec 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/NavigationFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/NavigationFieldController.cs @@ -16,6 +16,7 @@ using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; using Telerik.Sitefinity.Modules.Pages.Web.Services.Model; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Pages.Model; using Telerik.Sitefinity.Services; using Telerik.Sitefinity.Utilities.TypeConverters; @@ -28,6 +29,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// This class represents the controller of the MVC forms Navigation field. /// [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcNavigationField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Form navigation", + CssClass = "sfFormNavIcn sfMvcIcn", + Ordinal = 0.12f)] public class NavigationFieldController : FormElementControllerBase, IZoneEditorReloader, IFormNavigation { diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/PageBreakController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/PageBreakController.cs index 5f7566662..b4b624ec6 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/PageBreakController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/PageBreakController.cs @@ -9,6 +9,7 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI; using Telerik.Sitefinity.Web.UI.Fields.Enums; @@ -18,6 +19,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// This class represents the controller of the MVC forms PageBreak field. /// [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcPageBreak", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Page break", + CssClass = "sfPageBreakIcn sfMvcIcn", + Ordinal = 0.11f)] public class PageBreakController : FormElementControllerBase, IFormPageBreak, IHasDependentControls { public PageBreakController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/ParagraphTextFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/ParagraphTextFieldController.cs index eb5886f6f..0a4557e02 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/ParagraphTextFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/ParagraphTextFieldController.cs @@ -11,6 +11,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -20,6 +21,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.LongText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcParagraphTextField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Paragraph textbox", + CssClass = "sfParagraphboxIcn sfMvcIcn", + Ordinal = 0.15f)] public class ParagraphTextFieldController : FormFieldControllerBase, ISupportRules, IParagraphFormField { public ParagraphTextFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SectionHeaderController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SectionHeaderController.cs index 6b3ce9f3f..ed1c324dc 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SectionHeaderController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SectionHeaderController.cs @@ -13,6 +13,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Utilities; using Telerik.Sitefinity.Web.UI.Fields.Enums; @@ -23,6 +24,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcSectionHeaderField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Section header", + CssClass = "sfSectionHeaderIcn sfMvcIcn", + Ordinal = 0.18f)] public class SectionHeaderController : FormElementControllerBase, ISupportRules, ISectionHeaderFormField { /// diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SubmitButtonController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SubmitButtonController.cs index fc2bd2b3c..8b5544871 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SubmitButtonController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/SubmitButtonController.cs @@ -7,6 +7,7 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -17,6 +18,12 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers [FormControlDisplayMode(FormControlDisplayMode.Write)] [Localization(typeof(FieldResources))] [IndexRenderMode(IndexRenderModes.NoOutput)] + [ControllerToolboxItem( + Name = "MvcSubmitButton", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Submit button", + CssClass = "sfSubmitBtnIcn sfMvcIcn")] public class SubmitButtonController : FormElementControllerBase, ISubmitFormField { public SubmitButtonController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/TextFieldController.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/TextFieldController.cs index b2956a458..a14bcd0b3 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/TextFieldController.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Controllers/TextFieldController.cs @@ -12,6 +12,7 @@ using Telerik.Sitefinity.Model; using Telerik.Sitefinity.Modules.Forms.Web.UI.Fields; using Telerik.Sitefinity.Modules.Pages.Web.Services; +using Telerik.Sitefinity.Mvc; using Telerik.Sitefinity.Web.UI.Fields.Enums; namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers @@ -21,6 +22,13 @@ namespace Telerik.Sitefinity.Frontend.Forms.Mvc.Controllers /// [DatabaseMapping(UserFriendlyDataType.ShortText)] [Localization(typeof(FieldResources))] + [ControllerToolboxItem( + Name = "MvcTextField", + Toolbox = FormsConstants.FormControlsToolboxName, + SectionName = FormsConstants.CommonSectionName, + Title = "Textbox", + CssClass = "sfTextboxIcn sfMvcIcn", + Ordinal = 0.1f)] public class TextFieldController : FormFieldControllerBase, ISupportRules, ITextField { public TextFieldController() diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Models/FormModel.cs b/Telerik.Sitefinity.Frontend.Forms/Mvc/Models/FormModel.cs index 35acabcbf..15aa0115f 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Models/FormModel.cs +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Models/FormModel.cs @@ -69,7 +69,7 @@ public FormModel() public CustomConfirmationMode CustomConfirmationMode { get; set; } /// - public string CustomConfirmationMessage + public virtual string CustomConfirmationMessage { get { diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/CheckboxesField/designerview-simple.js b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/CheckboxesField/designerview-simple.js index 1983e8658..83f7f1b4a 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/CheckboxesField/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/CheckboxesField/designerview-simple.js @@ -4,6 +4,7 @@ simpleViewModule.controller('SimpleCtrl', ['$scope', 'propertyService', '$q', function ($scope, propertyService, $q) { $scope.feedback.showLoadingIndicator = true; $scope.currentItems = []; + $scope.lastUniqueIndex = 0; $scope.defaultValue = null; $scope.$watch('properties.Model.ValidatorDefinition.Required.PropertyValue', function (newValue, oldValue) { @@ -16,7 +17,7 @@ .then(function (data) { if (data && data.Items) { $scope.properties = propertyService.toHierarchyArray(data.Items); - $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue); + $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue).map(function (item) { return { key: $scope.lastUniqueIndex++, value: item }; }); $scope.defaultValue = $scope.properties.Model.MetaField.DefaultValue.PropertyValue; } }) @@ -30,11 +31,15 @@ $scope.feedback.savingHandlers.push(function () { var deferred = $q.defer(); - while ($scope.currentItems.indexOf('') > -1 && $scope.currentItems.length > 1) { - $scope.currentItems.splice($scope.currentItems.indexOf(''), 1); + while (arrayContainsEmptyValue($scope.currentItems) && $scope.currentItems.length > 1) { + var indexOfEmptyValue = getIndexOfEmptyValueInArray($scope.currentItems); + + if (indexOfEmptyValue !== null) { + $scope.currentItems.splice(indexOfEmptyValue, 1); + } } - if ($scope.currentItems.indexOf('') === -1) { - $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems); + if (!arrayContainsEmptyValue($scope.currentItems)) { + $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems.map(function (e) { return e.value; })); $scope.properties.Model.MetaField.DefaultValue.PropertyValue = $scope.defaultValue; deferred.resolve(); } @@ -55,6 +60,10 @@ $scope.currentItems.splice(e.newIndex, 0, element); }; + $scope.getTrackByValue = function (index) { + return $scope.currentItems[index].key; + }; + $scope.itemClicked = function (ev) { ev.target.focus(); }; @@ -75,7 +84,8 @@ }; $scope.addItem = function () { - $scope.currentItems.push(''); + $scope.lastUniqueIndex += 1; + $scope.currentItems.push({ key: $scope.lastUniqueIndex, value: null }); }; $scope.sortableOptions = { @@ -91,5 +101,25 @@ axis: "y", autoScroll: true }; + + function arrayContainsEmptyValue(choices) { + for (var i = 0; i < choices.length; i++) { + if (choices[i].value === null || choices[i].value === '') { + return true; + } + } + + return false; + } + + function getIndexOfEmptyValueInArray(choices) { + for (var i = 0; i < choices.length; i++) { + if (choices[i].value === null || choices[i].value === '') { + return i; + } + } + + return null; + } }]); })(); \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/DropdownListField/designerview-simple.js b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/DropdownListField/designerview-simple.js index 52a447b2b..60667f94c 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/DropdownListField/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/DropdownListField/designerview-simple.js @@ -4,13 +4,14 @@ simpleViewModule.controller('SimpleCtrl', ['$scope', 'propertyService', '$q', function ($scope, propertyService, $q) { $scope.feedback.showLoadingIndicator = true; $scope.currentItems = []; + $scope.lastUniqueIndex = 0; $scope.defaultValue = null; propertyService.get() .then(function (data) { if (data && data.Items) { $scope.properties = propertyService.toHierarchyArray(data.Items); - $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue); + $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue).map(function (item) { return { key: $scope.lastUniqueIndex++, value: item }; }); $scope.defaultValue = $scope.properties.Model.MetaField.DefaultValue.PropertyValue; } }) @@ -24,8 +25,8 @@ $scope.feedback.savingHandlers.push(function () { var deferred = $q.defer(); - if ($scope.currentItems.indexOf('') === -1) { - $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems); + if (!arrayContainsEmptyValue($scope.currentItems)) { + $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems.map(function (e) { return e.value; })); $scope.properties.Model.MetaField.DefaultValue.PropertyValue = $scope.defaultValue; deferred.resolve(); } @@ -48,6 +49,10 @@ $scope.changeRequired(); }; + $scope.getTrackByValue = function (index) { + return $scope.currentItems[index].key; + }; + $scope.itemClicked = function (ev) { ev.target.focus(); }; @@ -65,12 +70,13 @@ }; $scope.addItem = function () { - $scope.currentItems.push(''); + $scope.lastUniqueIndex += 1; + $scope.currentItems.push({key: $scope.lastUniqueIndex, value: null}); }; $scope.changeRequired = function () { if ($scope.properties.Model.ValidatorDefinition.Required.PropertyValue === 'True' && $scope.currentItems.length) { - $scope.setDefault($scope.currentItems[0]); + $scope.setDefault($scope.currentItems[0].value); } }; @@ -87,5 +93,15 @@ axis: "y", autoScroll: true }; + + function arrayContainsEmptyValue(choices) { + for (var i = 0; i < choices.length; i++) { + if (choices[i].value === null || choices[i].value === '') { + return true; + } + } + + return false; + } }]); })(); \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/MultipleChoiceField/designerview-simple.js b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/MultipleChoiceField/designerview-simple.js index 0357c8b31..1d4334133 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/MultipleChoiceField/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Scripts/MultipleChoiceField/designerview-simple.js @@ -4,6 +4,7 @@ simpleViewModule.controller('SimpleCtrl', ['$scope', 'propertyService', '$q', function ($scope, propertyService, $q) { $scope.feedback.showLoadingIndicator = true; $scope.currentItems = []; + $scope.lastUniqueIndex = 0; $scope.defaultValue = null; $scope.$watch( @@ -26,12 +27,12 @@ .then(function (data) { if (data && data.Items) { $scope.properties = propertyService.toHierarchyArray(data.Items); - $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue); + $scope.currentItems = JSON.parse($scope.properties.Model.SerializedChoices.PropertyValue).map(function (item) { return { key: $scope.lastUniqueIndex++, value: item }; }); $scope.defaultValue = $scope.properties.Model.MetaField.DefaultValue.PropertyValue; for (var i = 0; i < $scope.currentItems.length; i++) { - if ($scope.currentItems[i].length > 255) { - $scope.currentItems[i] = $scope.currentItems[i].substring(0, 255); + if ($scope.currentItems[i].value.length > 255) { + $scope.currentItems[i].value = $scope.currentItems[i].value.substring(0, 255); } } } @@ -46,11 +47,15 @@ $scope.feedback.savingHandlers.push(function () { var deferred = $q.defer(); - while ($scope.currentItems.indexOf('') > -1 && $scope.currentItems.length > 1) { - $scope.currentItems.splice($scope.currentItems.indexOf(''), 1); + while (arrayContainsEmptyValue($scope.currentItems) && $scope.currentItems.length > 1) { + var indexOfEmptyValue = getIndexOfEmptyValueInArray($scope.currentItems); + + if (indexOfEmptyValue !== null) { + $scope.currentItems.splice(indexOfEmptyValue, 1); + } } - if ($scope.currentItems.indexOf('') === -1) { - $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems); + if (!arrayContainsEmptyValue($scope.currentItems)) { + $scope.properties.Model.SerializedChoices.PropertyValue = JSON.stringify($scope.currentItems.map(function (e) { return e.value; })); $scope.properties.Model.MetaField.DefaultValue.PropertyValue = $scope.defaultValue; deferred.resolve(); } @@ -71,6 +76,10 @@ $scope.currentItems.splice(e.newIndex, 0, element); }; + $scope.getTrackByValue = function (index) { + return $scope.currentItems[index].key; + }; + $scope.itemClicked = function (ev) { ev.target.focus(); }; @@ -93,7 +102,8 @@ }; $scope.addItem = function () { - $scope.currentItems.push(''); + $scope.lastUniqueIndex += 1; + $scope.currentItems.push({ key: $scope.lastUniqueIndex, value: null }); }; $scope.sortableOptions = { @@ -109,5 +119,25 @@ axis: "y", autoScroll: true }; + + function arrayContainsEmptyValue(choices) { + for (var i = 0; i < choices.length; i++) { + if (choices[i].value === null || choices[i].value === '') { + return true; + } + } + + return false; + } + + function getIndexOfEmptyValueInArray(choices) { + for (var i = 0; i < choices.length; i++) { + if (choices[i].value === null || choices[i].value === '') { + return i; + } + } + + return null; + } }]); })(); \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/CheckboxesField/DesignerView.Simple.cshtml b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/CheckboxesField/DesignerView.Simple.cshtml index 57edf260f..bec8c45cd 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/CheckboxesField/DesignerView.Simple.cshtml +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/CheckboxesField/DesignerView.Simple.cshtml @@ -16,16 +16,16 @@ @Html.Resource("Choices")
-
+
- +
- +
- +
diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/DropdownListField/DesignerView.Simple.cshtml b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/DropdownListField/DesignerView.Simple.cshtml index 26f52305f..dd3fef930 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/DropdownListField/DesignerView.Simple.cshtml +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/DropdownListField/DesignerView.Simple.cshtml @@ -17,19 +17,19 @@
-
+
- +
- @Html.Resource("Default") - @Html.Resource("MakeDefault") + @Html.Resource("Default") + @Html.Resource("MakeDefault")
- +
diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/MultipleChoiceField/DesignerView.Simple.cshtml b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/MultipleChoiceField/DesignerView.Simple.cshtml index 6cd44cba8..522820e49 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/MultipleChoiceField/DesignerView.Simple.cshtml +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/MultipleChoiceField/DesignerView.Simple.cshtml @@ -18,16 +18,16 @@ @Html.Resource("Choices")
-
+
- +
- +
- +
diff --git a/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Forms/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Forms/Telerik.Sitefinity.Frontend.Forms.csproj b/Telerik.Sitefinity.Frontend.Forms/Telerik.Sitefinity.Frontend.Forms.csproj index ca4d823ba..adb0d7969 100644 --- a/Telerik.Sitefinity.Frontend.Forms/Telerik.Sitefinity.Frontend.Forms.csproj +++ b/Telerik.Sitefinity.Frontend.Forms/Telerik.Sitefinity.Frontend.Forms.csproj @@ -43,6 +43,15 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + True @@ -61,7 +70,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -78,8 +87,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -121,17 +130,17 @@ ..\packages\Telerik.DataAccess.Core.2020.0.428.1\lib\net40\Telerik.OpenAccess.Runtime.dll - - ..\packages\Telerik.Web.UI.2022.1.302.45\lib\net45\Telerik.Web.Design.dll + + ..\packages\Telerik.Web.UI.2022.2.622.45\lib\net45\Telerik.Web.Design.dll - - ..\packages\Telerik.Web.UI.2022.1.302.45\lib\net45\Telerik.Web.Spreadsheet.dll + + ..\packages\Telerik.Web.UI.2022.2.622.45\lib\net45\Telerik.Web.Spreadsheet.dll - - ..\packages\Telerik.Web.UI.2022.1.302.45\lib\net45\Telerik.Web.UI.dll + + ..\packages\Telerik.Web.UI.2022.2.622.45\lib\net45\Telerik.Web.UI.dll - - ..\packages\Telerik.Web.UI.2022.1.302.45\lib\net45\Telerik.Web.UI.Skins.dll + + ..\packages\Telerik.Web.UI.2022.2.622.45\lib\net45\Telerik.Web.UI.Skins.dll @@ -234,9 +243,6 @@ - - PublicKey.snk - @@ -366,31 +372,31 @@ - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Services.Events.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Services.Events.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -406,12 +412,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Forms/packages.config b/Telerik.Sitefinity.Frontend.Forms/packages.config index d4fcd4884..2c44dca67 100644 --- a/Telerik.Sitefinity.Frontend.Forms/packages.config +++ b/Telerik.Sitefinity.Frontend.Forms/packages.config @@ -7,16 +7,16 @@ - + - + - - - - - + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Identity/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Identity/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Identity/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Identity/Telerik.Sitefinity.Frontend.Identity.csproj b/Telerik.Sitefinity.Frontend.Identity/Telerik.Sitefinity.Frontend.Identity.csproj index 9a4f2a99a..8b36b8a25 100644 --- a/Telerik.Sitefinity.Frontend.Identity/Telerik.Sitefinity.Frontend.Identity.csproj +++ b/Telerik.Sitefinity.Frontend.Identity/Telerik.Sitefinity.Frontend.Identity.csproj @@ -45,10 +45,19 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + - - ..\packages\Microsoft.Owin.3.1.0\lib\net45\Microsoft.Owin.dll - True + + ..\packages\Microsoft.Owin.4.2.2\lib\net45\Microsoft.Owin.dll ..\packages\Microsoft.Owin.Host.SystemWeb.3.1.0\lib\net45\Microsoft.Owin.Host.SystemWeb.dll @@ -72,7 +81,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -90,8 +99,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -230,9 +239,6 @@ - - PublicKey.snk - @@ -271,31 +277,31 @@ - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Services.Events.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Services.Events.dll True - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -306,12 +312,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Identity/packages.config b/Telerik.Sitefinity.Frontend.Identity/packages.config index 09d0c0f70..da2f257ef 100644 --- a/Telerik.Sitefinity.Frontend.Identity/packages.config +++ b/Telerik.Sitefinity.Frontend.Identity/packages.config @@ -4,20 +4,20 @@ - + - - + + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.InlineClientAssets/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.InlineClientAssets/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.InlineClientAssets/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.InlineClientAssets/Telerik.Sitefinity.Frontend.InlineClientAssets.csproj b/Telerik.Sitefinity.Frontend.InlineClientAssets/Telerik.Sitefinity.Frontend.InlineClientAssets.csproj index 95eb55d01..582a0c2bf 100644 --- a/Telerik.Sitefinity.Frontend.InlineClientAssets/Telerik.Sitefinity.Frontend.InlineClientAssets.csproj +++ b/Telerik.Sitefinity.Frontend.InlineClientAssets/Telerik.Sitefinity.Frontend.InlineClientAssets.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -129,9 +139,6 @@ - - PublicKey.snk - @@ -149,38 +156,33 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.InlineClientAssets/packages.config b/Telerik.Sitefinity.Frontend.InlineClientAssets/packages.config index 8da6aa668..11921a3c0 100644 --- a/Telerik.Sitefinity.Frontend.InlineClientAssets/packages.config +++ b/Telerik.Sitefinity.Frontend.InlineClientAssets/packages.config @@ -8,8 +8,8 @@ - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Lists/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Lists/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Lists/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Lists/Telerik.Sitefinity.Frontend.Lists.csproj b/Telerik.Sitefinity.Frontend.Lists/Telerik.Sitefinity.Frontend.Lists.csproj index a332804ff..b5b993d81 100644 --- a/Telerik.Sitefinity.Frontend.Lists/Telerik.Sitefinity.Frontend.Lists.csproj +++ b/Telerik.Sitefinity.Frontend.Lists/Telerik.Sitefinity.Frontend.Lists.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -61,7 +71,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -76,8 +86,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -141,9 +151,6 @@ - - PublicKey.snk - Designer @@ -157,31 +164,31 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -190,12 +197,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Lists/packages.config b/Telerik.Sitefinity.Frontend.Lists/packages.config index 5477ebc46..c0f308f00 100644 --- a/Telerik.Sitefinity.Frontend.Lists/packages.config +++ b/Telerik.Sitefinity.Frontend.Lists/packages.config @@ -6,15 +6,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Document/designerview-simple.js b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Document/designerview-simple.js index 6fe3b6c4c..acf659301 100644 --- a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Document/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Document/designerview-simple.js @@ -8,6 +8,10 @@ $scope.feedback.showLoadingIndicator = true; $scope.$watch('properties.Id.PropertyValue', function (newVal, oldVal) { + // If controller returns Empty guid - no image is selected + if ($scope.properties && newVal === serviceHelper.emptyGuid()) { + $scope.properties.Id.PropertyValue = undefined; + } // Cancel is selected with no document selected - close the designer if (newVal === null) { $scope.$parent.cancel(); diff --git a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Image/designerview-simple.js b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Image/designerview-simple.js index 7b96b81c6..72593f3cc 100644 --- a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Image/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Image/designerview-simple.js @@ -26,7 +26,8 @@ if ($scope.properties && newVal && newVal.item && newVal.item.Id) { // update the title and the alt text only when the widget is new and no image is loaded // or when replacing the exisitng image - if (($scope.properties.Id.PropertyId === serviceHelper.emptyGuid()) || + if (($scope.properties.Id.PropertyValue === serviceHelper.emptyGuid()) || + ($scope.properties.Id.PropertyValue !== newVal.item.Id) || (oldVal.item.Id && oldVal.item.Id !== newVal.item.Id)) { if (newVal.item.Title && newVal.item.Title.Value) { $scope.properties.Title.PropertyValue = newVal.item.Title.Value; @@ -37,6 +38,9 @@ } } + $scope.properties.Title.PropertyValue = $scope.properties.Title.PropertyValue || newVal.item.Title.Value; + $scope.properties.AlternativeText.PropertyValue = $scope.properties.AlternativeText.PropertyValue || newVal.item.AlternativeText.Value; + $scope.properties.ThumbnailName.PropertyValue = newVal.thumbnail ? newVal.thumbnail.name : null; $scope.properties.ThumbnailUrl.PropertyValue = newVal.thumbnail ? newVal.thumbnail.url : null; $scope.properties.CustomSize.PropertyValue = JSON.stringify(newVal.customSize); @@ -100,8 +104,9 @@ if (data && data.Items) { $scope.properties = propertyService.toAssociativeArray(data.Items); - if ($scope.properties.Id.PropertyValue !== serviceHelper.emptyGuid()) { - mediaService.images.getById($scope.properties.Id.PropertyValue, $scope.properties.ProviderName.PropertyValue).then(function (data) { + var propertyValue = $scope.properties.Id.PropertyValue; + if (propertyValue && propertyValue !== serviceHelper.emptyGuid()) { + mediaService.images.getById(propertyValue, $scope.properties.ProviderName.PropertyValue).then(function (data) { if (!data || !data.Item || !data.Item.Visible) { $scope.properties.Id.PropertyValue = serviceHelper.emptyGuid(); } diff --git a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Video/designerview-simple.js b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Video/designerview-simple.js index 25219acfb..15c52e753 100644 --- a/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Video/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.Media/Mvc/Scripts/Video/designerview-simple.js @@ -9,6 +9,10 @@ $scope.videoModel = {}; $scope.$watch('properties.Id.PropertyValue', function (newVal, oldVal) { + // If controller returns Empty guid - no image is selected + if ($scope.properties && newVal === serviceHelper.emptyGuid()) { + $scope.properties.Id.PropertyValue = undefined; + } // Cancel is selected with no document selected - close the designer if (newVal === null) { $scope.$parent.cancel(); diff --git a/Telerik.Sitefinity.Frontend.Media/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Media/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Media/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Media/Telerik.Sitefinity.Frontend.Media.csproj b/Telerik.Sitefinity.Frontend.Media/Telerik.Sitefinity.Frontend.Media.csproj index 5147f36ed..ed5b1642d 100644 --- a/Telerik.Sitefinity.Frontend.Media/Telerik.Sitefinity.Frontend.Media.csproj +++ b/Telerik.Sitefinity.Frontend.Media/Telerik.Sitefinity.Frontend.Media.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -61,7 +71,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -76,8 +86,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -199,9 +209,6 @@ Code - - PublicKey.snk - @@ -241,31 +248,31 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -277,12 +284,7 @@ - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Media/packages.config b/Telerik.Sitefinity.Frontend.Media/packages.config index 5477ebc46..c0f308f00 100644 --- a/Telerik.Sitefinity.Frontend.Media/packages.config +++ b/Telerik.Sitefinity.Frontend.Media/packages.config @@ -6,15 +6,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Navigation/Mvc/Models/Breadcrumb/BreadcrumbModel.cs b/Telerik.Sitefinity.Frontend.Navigation/Mvc/Models/Breadcrumb/BreadcrumbModel.cs index a39fefd5a..1f1e83cb6 100644 --- a/Telerik.Sitefinity.Frontend.Navigation/Mvc/Models/Breadcrumb/BreadcrumbModel.cs +++ b/Telerik.Sitefinity.Frontend.Navigation/Mvc/Models/Breadcrumb/BreadcrumbModel.cs @@ -257,60 +257,16 @@ private Tuple> GetBreadcrumbDataSource() if (currentNode != null) { hasCurrentNode = true; - - var currentSite = SystemManager.CurrentContext.CurrentSite; - var rootNodeKey = currentSite.SiteMapRootNodeId.ToString(); - - string nodeKey = currentNode.Key; - - var homePageKey = currentSite.HomePageId; - var homePageNode = homePageKey != Guid.Empty ? (PageSiteNode)this.SiteMapProvider.FindSiteMapNodeFromKey(homePageKey.ToString()) : null; - - //// Gets the actual home page when the site is set to multilingual and the home page is split - homePageNode = (PageSiteNode)((SiteMapBase)this.SiteMapProvider).FindSiteMapNodeForSpecificLanguage(homePageNode, SystemManager.CurrentContext.Culture) ?? homePageNode; - - var showToSelectedNode = this.SelectedPageNode != null && this.BreadcrumbIncludeOption != BreadcrumbIncludeOption.CurrentPageFullPath; - var isSelectedPageNodeFound = false; - - while (!string.IsNullOrEmpty(nodeKey) && - string.Compare(nodeKey, rootNodeKey, StringComparison.OrdinalIgnoreCase) != 0) + breadcrumbDataSource = new BreadcrumbGenerator().Generate(new BreadcrumbGenerator.BreadcrumbInput() { - var node = (PageSiteNode)((SiteMapBase)this.SiteMapProvider).FindSiteMapNodeFromKey(nodeKey, false); - if (node != homePageNode && - node.IsAccessibleToUser(HttpContext.Current) && - !node.IsHidden()) - { - if (this.ShowGroupPages) - breadcrumbDataSource.Insert(0, node); - else if (!node.IsGroupPage) - breadcrumbDataSource.Insert(0, node); - } - - if (showToSelectedNode && node == this.SelectedPageNode) - { - isSelectedPageNodeFound = true; - break; - } - - nodeKey = node.ParentKey; - } - - if (!isSelectedPageNodeFound && this.BreadcrumbIncludeOption != BreadcrumbIncludeOption.CurrentPageFullPath) - breadcrumbDataSource.Clear(); - else if (homePageNode != null && homePageNode.Visible) - breadcrumbDataSource.Insert(0, homePageNode); - - if (breadcrumbDataSource.Count > 0) - { - //// remove the first element if we have to hide the home page - if (!this.ShowHomePageLink) - breadcrumbDataSource.RemoveAt(0); - - //// remove the last element if we have to hide the last page - var index = breadcrumbDataSource.Count - 1; - if (!this.ShowCurrentPageInTheEnd && index > -1) - breadcrumbDataSource.RemoveAt(index); - } + AddHomePageAtBeginning = this.ShowHomePageLink, + AddStartingPageAtEnd = this.ShowCurrentPageInTheEnd, + IncludeGroupPages = this.ShowGroupPages, + SiteMapProvider = (SiteMapBase)this.SiteMapProvider, + CurrentPageId = currentNode.Key, + StartingPageId = this.StartingPageId.ToString(), + ShowFullPath = this.BreadcrumbIncludeOption == BreadcrumbIncludeOption.CurrentPageFullPath + }); } return new Tuple>(hasCurrentNode, breadcrumbDataSource); diff --git a/Telerik.Sitefinity.Frontend.Navigation/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Navigation/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Navigation/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
+
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Navigation/Telerik.Sitefinity.Frontend.Navigation.csproj b/Telerik.Sitefinity.Frontend.Navigation/Telerik.Sitefinity.Frontend.Navigation.csproj index 39b7386e1..e5ecb0ce4 100644 --- a/Telerik.Sitefinity.Frontend.Navigation/Telerik.Sitefinity.Frontend.Navigation.csproj +++ b/Telerik.Sitefinity.Frontend.Navigation/Telerik.Sitefinity.Frontend.Navigation.csproj @@ -47,6 +47,18 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + ..\FxCop\Feather.ruleset + false + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -63,7 +75,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -78,8 +90,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -179,9 +191,6 @@ - - PublicKey.snk - @@ -206,31 +215,31 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True @@ -242,7 +251,6 @@ - diff --git a/Telerik.Sitefinity.Frontend.Navigation/packages.config b/Telerik.Sitefinity.Frontend.Navigation/packages.config index 5477ebc46..c0f308f00 100644 --- a/Telerik.Sitefinity.Frontend.Navigation/packages.config +++ b/Telerik.Sitefinity.Frontend.Navigation/packages.config @@ -6,15 +6,15 @@ - + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.News/MVC/Controllers/NewsController.cs b/Telerik.Sitefinity.Frontend.News/MVC/Controllers/NewsController.cs index ce6a5f192..03db834de 100644 --- a/Telerik.Sitefinity.Frontend.News/MVC/Controllers/NewsController.cs +++ b/Telerik.Sitefinity.Frontend.News/MVC/Controllers/NewsController.cs @@ -9,8 +9,11 @@ using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Routing; +using Telerik.Sitefinity.Frontend.Mvc.Models; using Telerik.Sitefinity.Frontend.News.Mvc.Models; using Telerik.Sitefinity.Frontend.News.Mvc.StringResources; +using Telerik.Sitefinity.Localization; +using Telerik.Sitefinity.Modules.News; using Telerik.Sitefinity.Modules.Pages; using Telerik.Sitefinity.Modules.Pages.Configuration; using Telerik.Sitefinity.Mvc; @@ -182,7 +185,14 @@ public ActionResult Index(int? page) var viewModel = this.Model.CreateListViewModel(taxonFilter, this.ExtractValidPage(page)); if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) - return this.Details((NewsItem)viewModel.Items.First().DataItem); + { + var itemViewModel = viewModel.Items.FirstOrDefault(); + + if (itemViewModel == null) + return this.HandleInvalidDetailsAction(Res.Get().NewsDetailViewDesignerResponseMessage); + + return this.Details((NewsItem)itemViewModel.DataItem); + } this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); if (viewModel.ContentType != null) @@ -239,7 +249,7 @@ public ActionResult Details(NewsItem newsItem) var page = this.HttpContext.CurrentHandler.GetPageHandler(); this.AddCanonicalUrlTagIfEnabled(page, newsItem); - + return this.View(fullTemplateName, viewModel); } diff --git a/Telerik.Sitefinity.Frontend.News/MVC/Scripts/News/designerview-simple.js b/Telerik.Sitefinity.Frontend.News/MVC/Scripts/News/designerview-simple.js index 6d3362d5a..d7da41228 100644 --- a/Telerik.Sitefinity.Frontend.News/MVC/Scripts/News/designerview-simple.js +++ b/Telerik.Sitefinity.Frontend.News/MVC/Scripts/News/designerview-simple.js @@ -59,6 +59,18 @@ true ); + $scope.$watch( + 'properties.SelectionMode.PropertyValue', + function (newSelectionModeValue, oldSelectionModeValue) { + if (newSelectionModeValue !== oldSelectionModeValue) { + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase() && newSelectionModeValue !== "SelectedItems") { + $scope.properties.ContentViewDisplayMode.PropertyValue = "Automatic"; + } + } + }, + true + ); + $scope.updateSortOption = function (newSortOption) { if (newSortOption !== "Custom") { $scope.properties.SortExpression.PropertyValue = newSortOption; @@ -120,11 +132,10 @@ if ($scope.properties.SortExpression.PropertyValue === "AsSetManually") { $scope.properties.SortExpression.PropertyValue = "PublicationDate DESC"; } - } - - if ($scope.properties.ContentViewDisplayMode.PropertyValue === 'Detail' && - ($scope.properties.SelectionMode.PropertyValue !== 'SelectedItems' || $scope.newsSelector.selectedItemsIds.length !== 1)) { - $scope.properties.ContentViewDisplayMode.PropertyValue = 'Automatic'; + + if ($scope.properties.ContentViewDisplayMode.PropertyValue.toLowerCase() === "Detail".toLowerCase()) { + $scope.properties.SelectionMode.PropertyValue = "SelectedItems"; + } } }); }) diff --git a/Telerik.Sitefinity.Frontend.News/MVC/Views/News/List.NewsList.cshtml b/Telerik.Sitefinity.Frontend.News/MVC/Views/News/List.NewsList.cshtml index 89fb774d2..ae23efff4 100644 --- a/Telerik.Sitefinity.Frontend.News/MVC/Views/News/List.NewsList.cshtml +++ b/Telerik.Sitefinity.Frontend.News/MVC/Views/News/List.NewsList.cshtml @@ -10,11 +10,11 @@ @foreach (var item in Model.Items) { var navigateUrl = HyperLinkHelpers.GetDetailPageUrl(item, ViewBag.DetailsPageId, ViewBag.OpenInSamePage, Model.UrlKeyPrefix); - +
  • @item.Fields.Title - +

    diff --git a/Telerik.Sitefinity.Frontend.News/MVC/Views/web.config b/Telerik.Sitefinity.Frontend.News/MVC/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.News/MVC/Views/web.config @@ -0,0 +1,442 @@ + + + + +
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.News/Telerik.Sitefinity.Frontend.News.csproj b/Telerik.Sitefinity.Frontend.News/Telerik.Sitefinity.Frontend.News.csproj index f4438afb1..478529067 100644 --- a/Telerik.Sitefinity.Frontend.News/Telerik.Sitefinity.Frontend.News.csproj +++ b/Telerik.Sitefinity.Frontend.News/Telerik.Sitefinity.Frontend.News.csproj @@ -47,6 +47,18 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + ..\FxCop\Feather.ruleset + false + false + ..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll @@ -66,19 +78,19 @@ False - ..\packages\ServiceStack.6.0.2\lib\net472\ServiceStack.dll + ..\packages\ServiceStack.6.1.0\lib\net472\ServiceStack.dll - ..\packages\ServiceStack.Client.6.0.2\lib\net472\ServiceStack.Client.dll + ..\packages\ServiceStack.Client.6.1.0\lib\net472\ServiceStack.Client.dll - ..\packages\ServiceStack.Common.6.0.2\lib\net472\ServiceStack.Common.dll + ..\packages\ServiceStack.Common.6.1.0\lib\net472\ServiceStack.Common.dll - ..\packages\ServiceStack.Interfaces.6.0.2\lib\net472\ServiceStack.Interfaces.dll + ..\packages\ServiceStack.Interfaces.6.1.0\lib\net472\ServiceStack.Interfaces.dll - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -98,8 +110,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -167,9 +179,6 @@ - - PublicKey.snk - @@ -181,42 +190,37 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.News/packages.config b/Telerik.Sitefinity.Frontend.News/packages.config index c17aa38f9..337e38691 100644 --- a/Telerik.Sitefinity.Frontend.News/packages.config +++ b/Telerik.Sitefinity.Frontend.News/packages.config @@ -7,22 +7,22 @@ - - - - - + + + + + - + - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Publishing/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Publishing/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Publishing/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Publishing/Telerik.Sitefinity.Frontend.Publishing.csproj b/Telerik.Sitefinity.Frontend.Publishing/Telerik.Sitefinity.Frontend.Publishing.csproj index af44ca58f..534ebe682 100644 --- a/Telerik.Sitefinity.Frontend.Publishing/Telerik.Sitefinity.Frontend.Publishing.csproj +++ b/Telerik.Sitefinity.Frontend.Publishing/Telerik.Sitefinity.Frontend.Publishing.csproj @@ -47,6 +47,18 @@ true + + true + full + false + bin\ + TRACE;DEBUG;CODE_ANALYSIS + prompt + 4 + false + ..\FxCop\Feather.ruleset + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -105,9 +117,6 @@ Properties\SharedAssemblyInfo.cs - - PublicKey.snk - @@ -129,38 +138,33 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Publishing/packages.config b/Telerik.Sitefinity.Frontend.Publishing/packages.config index 8da6aa668..11921a3c0 100644 --- a/Telerik.Sitefinity.Frontend.Publishing/packages.config +++ b/Telerik.Sitefinity.Frontend.Publishing/packages.config @@ -8,8 +8,8 @@ - - - - + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Recommendations/MVC/Controllers/RecommendationsController.cs b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Controllers/RecommendationsController.cs new file mode 100644 index 000000000..f933ee215 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Controllers/RecommendationsController.cs @@ -0,0 +1,215 @@ +using System; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Web.Mvc; +using Progress.Sitefinity.Renderer.Designers; +using Progress.Sitefinity.Renderer.Designers.Attributes; +using Telerik.Microsoft.Practices.Unity; +using Telerik.Sitefinity.Abstractions; +using Telerik.Sitefinity.Mvc; +using Telerik.Sitefinity.Services; +using Telerik.Sitefinity.Services.Recommendations; +using Telerik.Sitefinity.Web; +using Telerik.Sitefinity.Web.Services.Contracts.Operations.Pages.PropertyEditor.AttributeConfigurator.Attributes; +using Telerik.Sitefinity.Web.UI; + +namespace Telerik.Sitefinity.Frontend.Recommendations.Mvc.Controllers +{ + /// + /// This class represents the controller of Recommendations widget. + /// + [ControllerToolboxItem(Name = "Recommendations", Title = "Content recommendations", SectionName = "Marketing", CssClass = WidgetCssClassIcon)] + public class RecommendationsController : Controller, ICustomWidgetVisualizationExtended + { + /// + /// Gets or sets the conversion. + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Recommendation settings", 1)] + [DataType(customDataType: KnownFieldTypes.Choices)] + [Placeholder("Select")] + [Description("Recommendations aim to improve visitor conversions. Select a conversion defined in Sitefinity Insight that you want to improve. Sitefinity Insight AI will generate different content recommendations for each visitor that will likely influence that visitor to complete the conversion.")] + [DisplayName("Conversion to be improved")] + [Choice(ServiceUrl = "/Default.GetConversions()", ServiceWarningMessage = "No conversions are found in Sitefinity Insight.")] + public int Conversion { get; set; } + + /// + /// Gets or sets the view name. + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Display settings", 1)] + [ViewSelector(RegexFilter = "^(?!Sample).*(? + /// Gets or sets the header that will be displayed above the recommendations e.g. Read more + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Display settings", 2)] + [DefaultValue(DefaultHeader)] + public string Header { get; set; } + + /// + /// Gets or sets the CSS class of the button. + /// + [Category(PropertyCategory.Advanced)] + [DisplayName("CSS class")] + public string CssClass { get; set; } + + [Browsable(false)] + public int MaxNumberOfItems { get; set; } = 1; + + /// + /// Gets the empty link text. + /// + /// + /// The empty link text. + /// + [Browsable(false)] + public string EmptyLinkText + { + get + { + return "Configure recommendations"; + } + } + + /// + /// Gets a value indicating whether widget is empty. + /// + /// + /// true if widget has no image selected; otherwise, false. + /// + [Browsable(false)] + public bool IsEmpty + { + get + { + var recommendationsFeatureState = this.GetRecommendationsFeatureState(); + + return recommendationsFeatureState.HasInsight && !recommendationsFeatureState.LostConnectionToInsight && recommendationsFeatureState.IsContentRecommendationsFeatureEnabled && recommendationsFeatureState.HasValidConnectionForCurrentSite && this.Conversion <= 0; + } + } + + /// + /// Gets the widget CSS class that will be used in the page toolbox. + /// + /// + /// The widget CSS class that will be used in the page toolbox. + /// + [Browsable(false)] + public string WidgetCssClass + { + get + { + return WidgetCssClassIcon; + } + } + + /// + /// Renders appropriate list view depending on the + /// + /// The . + public ActionResult Index() + { + this.ViewBag.Header = this.Header ?? DefaultHeader; + this.ViewBag.MaxNumberOfItems = this.MaxNumberOfItems; + this.ViewBag.UniqueId = Guid.NewGuid(); + this.ViewBag.CssClass = this.CssClass; + this.ViewBag.SiteId = SystemManager.CurrentContext.CurrentSite.Id; + + var recommendationsFeatureState = this.GetRecommendationsFeatureState(); + + if (SystemManager.IsDesignMode) + { + return this.GetViewForDesignMode(recommendationsFeatureState); + } + + if (!recommendationsFeatureState.HasValidConnectionForCurrentSite || !recommendationsFeatureState.IsContentRecommendationsFeatureEnabled || !recommendationsFeatureState.ConversionExists || recommendationsFeatureState.LostConnectionToInsight || this.IsEmpty) + { + return new EmptyResult(); + } + + this.ViewBag.ConversionId = this.Conversion; + this.ViewBag.BaseUrl = UrlPath.GetDomainUrl(); + + return this.View(this.SfViewName ?? DefaultViewName); + } + + /// + /// Called when a request matches this controller, but no method with the specified action name is found in the controller. + /// + /// The name of the attempted action. + protected override void HandleUnknownAction(string actionName) + { + this.ActionInvoker.InvokeAction(this.ControllerContext, "Index"); + } + + private RecommendationsFeatureState GetRecommendationsFeatureState() + { + var recommendationsFeatureState = new RecommendationsFeatureState(); + if (ObjectFactory.Container.IsRegistered()) + { + var recommendationProvider = ObjectFactory.Container.Resolve(); + recommendationsFeatureState = recommendationProvider.GetRecommendationsFeatureState(this.Conversion); + recommendationsFeatureState.HasInsight = true; + } + + return recommendationsFeatureState; + } + + private ActionResult GetViewForDesignMode(RecommendationsFeatureState recommendationsFeatureState) + { + // No connected Insight or no sites set for tracking + if (!recommendationsFeatureState.HasValidConnectionForCurrentSite) + { + return new ContentResult() + { + Content = "This widget works only if there is an active connection to Sitefinity Insight. Configure a connection in Administration > Sitefinity Insight." + }; + } + + // Lost connection to Insight + if (recommendationsFeatureState.LostConnectionToInsight) + { + return new ContentResult() + { + Content = "No recommendations can be displayed because the connection to Sitefinity Insight has been lost. Try to restore the connection." + }; + } + + // Connected Insight but no Premium subscription + if (!recommendationsFeatureState.IsContentRecommendationsFeatureEnabled) + { + return new ContentResult() + { + Content = "Content recommendations are available only to Sitefinity Insight Premium subscriptions." + }; + } + + // Empty (no convesion selected) + if (this.IsEmpty) + { + return new EmptyResult(); + } + + // Deleted conversion + if (!recommendationsFeatureState.ConversionExists) + { + return new ContentResult() + { + Content = "The selected conversion is not found. No recommendations can be displayed." + }; + } + + ViewBag.IsPreviewMode = SystemManager.IsPreviewMode; + return this.View(DefaultDesignViewName); + } + + private const string WidgetCssClassIcon = "sfListitemsIcn sfMvcIcn"; + + private const string DefaultHeader = "Read more"; + private const string DefaultViewName = "Recommendations"; + private const string DefaultDesignViewName = "Sample.Index"; + private const string IncludeUnsafeInlineEvalContextItem = "sf-csp-include-unsafe-inline-eval"; + } +} diff --git a/Telerik.Sitefinity.Frontend.Recommendations/MVC/Scripts/Recommendations/recommendations.js b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Scripts/Recommendations/recommendations.js new file mode 100644 index 000000000..161157d58 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Scripts/Recommendations/recommendations.js @@ -0,0 +1,94 @@ +(function () { + function init() { + if (window.DataIntelligenceSubmitScript) { + recommendationFlow(); + } + else { + if (window.addEventListener) { + window.addEventListener('decclientready', recommendationFlow, false); + } + else if (window.attachEvent) { + window.attachEvent('decclientready', recommendationFlow); + } + } + } + + function recommendationFlow() { + var recommendationsMetadatas = document.getElementsByClassName("recommendations-metadata"); + for (var i = 0; i < recommendationsMetadatas.length; i++) { + var currentRecommendationMetadata = recommendationsMetadatas[i]; + var uniqueId = currentRecommendationMetadata.querySelector(".unique-id").value; + var baseUrl = currentRecommendationMetadata.querySelector(".base-url").value; + var conversionId = currentRecommendationMetadata.querySelector(".conversion-id").value; + var maxNumberOfItems = currentRecommendationMetadata.querySelector(".max-number-of-items").value; + var siteId = currentRecommendationMetadata.querySelector(".site-id").value; + + executeRecommendationFlow(baseUrl, parseInt(conversionId), uniqueId, parseInt(maxNumberOfItems), siteId); + } + } + + function executeRecommendationFlow(baseUrl, conversionId, widgetUniqueId, maxNumberOfItems, siteId) { + if (window.DataIntelligenceSubmitScript) { + var clientJourney = window.DataIntelligenceSubmitScript._client.recommenderClient.getClientJourney(); + if (clientJourney && clientJourney.length > 0) { + var data = { + conversionId: conversionId, + journeyJson: JSON.stringify(clientJourney) + }; + + var url = baseUrl + "/sf/system/Default.GetRecommendations()?sf_site=" + siteId; + getRecommendations(url, data).then(handleResponseData); + } + } + + function handleResponseData(data) { + var recommendations = data.value; + var recommendationsWrapper = document.getElementById("recommendations-wrapper-" + widgetUniqueId); + if (recommendations && recommendations.length > 0) { + recommendationsWrapper.removeAttribute("hidden"); + } + + for (var i = 0; i < recommendations.length; i++) { + if (i === maxNumberOfItems) { + break; + } + + var recommendation = recommendations[i]; + var recommendationUrl = window.DataIntelligenceSubmitScript._client.recommenderClient.prepareRecommendationUrl(recommendation.Url, conversionId); + var recommendationDivElement = document.createElement("div"); + var recommendationTitleElement = document.createElement("a"); + recommendationTitleElement.setAttribute("href", recommendationUrl); + recommendationTitleElement.innerText = recommendation.Title; + recommendationTitleElement.classList.add("fs-5"); + recommendationDivElement.appendChild(recommendationTitleElement); + + var recommendationsDiv = recommendationsWrapper.getElementsByClassName("content-recommendations")[0]; + recommendationsDiv.appendChild(recommendationTitleElement); + + window.DataIntelligenceSubmitScript._client.recommenderClient.trackRecommendationShown(recommendation, conversionId); + } + } + + function getRecommendations(url, data) { + var requestInfoObject = { + method: 'POST', + mode: 'cors', + cache: 'no-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json' + }, + redirect: 'follow', + referrerPolicy: 'no-referrer', + body: JSON.stringify(data) + }; + var responseJson = fetch(url, requestInfoObject).then(function handleResponse(response) { + return response.json(); + }); + + return responseJson; + } + } + + document.addEventListener("DOMContentLoaded", init); +})(); diff --git a/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Recommendations.cshtml b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Recommendations.cshtml new file mode 100644 index 000000000..bc44f34d0 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Recommendations.cshtml @@ -0,0 +1,18 @@ +@using Telerik.Sitefinity.Frontend.Mvc.Helpers; +@using Telerik.Sitefinity.Modules.Pages +@using System.Web.Mvc; + + + + + +@Html.Script(Url.WidgetContent("Mvc/Scripts/Recommendations/recommendations.js")) diff --git a/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Sample.Index.cshtml b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Sample.Index.cshtml new file mode 100644 index 000000000..551870024 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/MVC/Views/Recommendations/Sample.Index.cshtml @@ -0,0 +1,11 @@ +@if (!ViewBag.IsPreviewMode) +{ +

    + This is a sample recommendation. Actual recommendations are visible only on the public site for visitors who have interacted enough with the site. +

    +} + + diff --git a/Telerik.Sitefinity.Frontend.Recommendations/Properties/AssemblyInfo.cs b/Telerik.Sitefinity.Frontend.Recommendations/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..aa33e1a31b46ab44d543f932792cb9d505ec3bcf GIT binary patch literal 3266 zcmd6p+fEZv6o%KeiSID+1~pPSiHKJSfp~!$sU*gDQF>yarA??7}v^>{Xsr8Z#JYkO!9?5;IA zvoyQUx|;2?s&7O7rDuc%J-_ka>R5BPF2d_Mhe z^X^PB59~U`q8l>n*rZ+d2F#MxMQ>`z_t7UrU1qx-`Kj;46$$Z_pE={gI!1Sb2Lqy= zVntpEsa7j9LRXGN5jo`|W4y^sS!$yr30_FUZBeQP|Gu!I9KBsu?9IvQXdZ`rKDI|z z$HIMTNd2Rn^trsQio9m%ePUmiz;u9)41KDqA?Umxg>P9+>Pba7C3C9e0@Z!Bsl!zX z6O)Dyq29VYg?M>SeSHgT>b3tT1B%-aAC&?1l4DzxCia7xnvX(a8@9&1v2?!bAxABu zDP|bKWB1EbP8CP)Dr+cuON^>+R}X4OkavAMGKYEuA1+{gz*7(#S^o(3S`b0`}Q7gcCJ&^sgl)OV=Rl4#G~S@2_rdgjXFR0 z`UW-SJCBeyxFbsEox3q=Cr~^JRF3BvdLm~=7ORe26*D?A@wV7etQ%vc*#*M87_7?L zv#W?b&iR_SguakNNHp{f%+#g*wqnpyd{L*&NxMr_xJ6x+|wPWl2ui6$*b=@lO7S-Db zUzb(K#Kjyd*t)FFlxCppg*YiE(mn(AyGVPdmBWjBZu zywurb_QV@8t=LmrVN6`6{y)d3>(IN3OfUQu`ATl7<@vKmId7`)bt<)Ho7_88uC5w) oQLoiK@~`wBk~8fJ%i~rxRAU#Ll~1yxuoFqvz@AurG(A2227gN{3;+NC literal 0 HcmV?d00001 diff --git a/Telerik.Sitefinity.Frontend.Recommendations/Telerik.Sitefinity.Frontend.Recommendations.csproj b/Telerik.Sitefinity.Frontend.Recommendations/Telerik.Sitefinity.Frontend.Recommendations.csproj new file mode 100644 index 000000000..f7fde0dcc --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/Telerik.Sitefinity.Frontend.Recommendations.csproj @@ -0,0 +1,90 @@ + + + + + Debug + AnyCPU + {78C09666-AF19-4920-9DBA-930694586127} + Library + Properties + Telerik.Sitefinity.Frontend.Recommendations + Telerik.Sitefinity.Frontend.Recommendations + v4.8 + 512 + true + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + ..\packages\Progress.Sitefinity.Renderer.14.3.8000.269\lib\netstandard2.0\Progress.Sitefinity.Renderer.dll + + + + ..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll + + + + + + ..\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll + + + + + + + + + + + + + + + + + + + + + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll + True + + + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll + True + + + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll + True + + + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll + True + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Recommendations/app.config b/Telerik.Sitefinity.Frontend.Recommendations/app.config new file mode 100644 index 000000000..489867c14 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Recommendations/packages.config b/Telerik.Sitefinity.Frontend.Recommendations/packages.config new file mode 100644 index 000000000..062298074 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Recommendations/packages.config @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/FacetsController.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/FacetsController.cs new file mode 100644 index 000000000..df6074095 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/FacetsController.cs @@ -0,0 +1,520 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Web.Mvc; +using Progress.Sitefinity.Renderer.Designers; +using Progress.Sitefinity.Renderer.Designers.Attributes; +using Telerik.Sitefinity.Configuration; +using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; +using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; +using Telerik.Sitefinity.Frontend.Search.Mvc.Models; +using Telerik.Sitefinity.Frontend.Search.Mvc.StringResources; +using Telerik.Sitefinity.Frontend.Search.Services; +using Telerik.Sitefinity.Localization; +using Telerik.Sitefinity.Modules.Pages.PropertyPersisters; +using Telerik.Sitefinity.Mvc; +using Telerik.Sitefinity.Search; +using Telerik.Sitefinity.Search.Impl.Elasticsearch; +using Telerik.Sitefinity.Services; +using Telerik.Sitefinity.Services.Search; +using Telerik.Sitefinity.Services.Search.Configuration; +using Telerik.Sitefinity.Web; +using Telerik.Sitefinity.Web.UI; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Controllers +{ + /// + /// This class represents the controller of Facets widget. + /// + [ControllerToolboxItem( + Name = FacetsController.WidgetName, + Title = nameof(SearchWidgetsResources.FacetsWidgetTitle), + Description = nameof(SearchWidgetsResources.FacetsWidgDescription), + ResourceClassId = nameof(SearchWidgetsResources), + SectionName = "Search", + ModuleName = "Search", + Ordinal = 0.6f, + CssClass = FacetsController.WidgetIconCssClass)] + [Localization(typeof(SearchWidgetsResources))] + public class FacetsController : Controller, ICustomWidgetVisualizationExtended + { + /// + /// Initializes a new instance of the Facets Controller + /// + public FacetsController() + { + this.searchFacetsQueryStringPorcessor = new SearchFacetsQueryStringProcessor(); + this.SelectedFacets = new List(); + } + + /// + /// Renders appropriate view depending on the + /// + /// The current page + /// The search input + /// base 64 encoded filter + /// The language + /// The param used to filter search results per site when the index is for all sites. + /// The facet's widget view + public ActionResult Index(int? page, string searchQuery = null, string filter = null, string language = null, bool? resultsForAllSites = null) + { + HttpContext.Request.QueryStringGet(nameof(page)); + HttpContext.Request.QueryStringGet(nameof(searchQuery)); + HttpContext.Request.QueryStringGet(nameof(filter)); + HttpContext.Request.QueryStringGet(nameof(language)); + HttpContext.Request.QueryStringGet(nameof(resultsForAllSites)); + + if (this.ShouldShowEmptyWidgetView()) + { + return new EmptyResult(); + } + + if (!this.IsSearchModuleActivated()) + { + return this.Content(this.SearchModuleDeactivatedMessage); + } + + if (!this.SearchServiceSupportsFacets()) + { + return this.Content(this.FacetsNotSupportedMessage); + } + + var facetsViewModel = new FacetsWidgetViewModel(); + facetsViewModel.AppliedFiltersLabel = this.AppliedFiltersLabel; + facetsViewModel.ClearAllLabel = this.ClearAllLabel; + facetsViewModel.FilterResultsLabel = this.FilterResultsLabel; + facetsViewModel.ShowMoreLabel = this.ShowMoreLabel; + facetsViewModel.ShowLessLabel = this.ShowLessLabel; + facetsViewModel.IsShowMoreLessButtonActive = this.IsShowMoreLessButtonActive; + facetsViewModel.DisplayItemCount = this.DisplayItemCount; + + if (!string.IsNullOrEmpty(searchQuery)) + { + var selectedFacetableFields = this.SelectedFacets.SelectMany(x => x.FacetableFieldNames).Distinct().ToList(); + var facetableFieldsFromIndex = this.searchFacetsQueryStringPorcessor.GetFacetableFields(this.IndexCatalogue); + var facetableFieldsToBeUsed = selectedFacetableFields.Intersect(facetableFieldsFromIndex.Keys).ToList(); + + string decodedFilter = filter?.Base64Decode(); + var facets = this.searchFacetsQueryStringPorcessor.GetFacets(searchQuery, language, decodedFilter, this.IndexCatalogue, facetableFieldsToBeUsed, this.GetSearchFields(), resultsForAllSites); + facetsViewModel.SearchFacets = this.BuildFacetsViewModel(facets, facetableFieldsFromIndex); + var currentPageUrl = this.GetCurrentPageUrl(); + this.ViewBag.CurrentPageUrl = currentPageUrl; + } + + this.ViewBag.HasAnyFacetElements = this.HasAnyFacetElements(facetsViewModel.SearchFacets); + + return this.View(this.TemplateName, facetsViewModel); + } + + /// + /// Determines whether the search module is activated. + /// + /// + protected virtual bool IsSearchModuleActivated() + { + var module = SystemManager.GetModule(SearchModule.ModuleName); + return module != null; + } + + /// + /// Gets or sets the search indexes. + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Search facets setup", 0)] + [DisplayName("Search index")] + [Placeholder("Select search index")] + [Required(ErrorMessage = "Select search index")] + [DataType(customDataType: KnownFieldTypes.Choices)] + [Choice(ServiceUrl = "Default.GetFacetableIndexes", ServiceWarningMessage = "No search index with facetable fields has been created yet. To manage search indexes, go to Administration > Search indexes, or contact your administrator for assistance.")] + [Description("[{\"Type\":1,\"Chunks\":[{\"Value\":\"To display facetable fields on your site,\",\"Presentation\":[]},{\"Value\":\"select the same search index as the one\",\"Presentation\":[]},{\"Value\":\"selected in the Search box widget.\",\"Presentation\":[]}]}]")] + public string IndexCatalogue { get; set; } + + /// + /// Get or sets the additional fileds for facet widget + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Search facets setup", 0)] + [TableView(Reorderable = true, Selectable = false, MultipleSelect = false)] + [DisplayName("Set facetable fields")] + [ConditionalVisibility("{\"conditions\":[{\"fieldName\":\"IndexCatalogue\",\"operator\":\"NotEquals\",\"value\":null }]}")] + [PropertyPersistence(PersistAsJson = true)] + public IList SelectedFacets { get; set; } + + /// + /// Gets or sets the sort type. + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Search facets setup", 0)] + [DisplayName("Sort fields")] + [DataType(customDataType: KnownFieldTypes.Choices)] + [ConditionalVisibility("{\"conditions\":[{\"fieldName\":\"IndexCatalogue\",\"operator\":\"NotEquals\",\"value\":null }]}")] + [Choice(Choices = "[{\"Title\":\"As set manually\",\"Name\":\"0\",\"Value\":0,\"Icon\":\"ban\"},{\"Title\":\"Alphabetically\",\"Name\":\"2\",\"Value\":2,\"Icon\":null}]")] + public string SortType { get; set; } + + /// + /// Gets or sets whatever the facets display item count + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Search facets setup", 1)] + [DisplayName("Display item count")] + [DataType(customDataType: KnownFieldTypes.ChipChoice)] + [Choice("[{\"Title\":\"Yes\",\"Name\":\"Yes\",\"Value\":\"True\",\"Icon\":null},{\"Title\":\"No\",\"Name\":\"No\",\"Value\":\"False\",\"Icon\":null}]")] + [ConditionalVisibility("{\"conditions\":[{\"fieldName\":\"IndexCatalogue\",\"operator\":\"NotEquals\",\"value\":null }]}")] + public bool DisplayItemCount + { + get + { + return this.displayItemCount; + } + set + { + this.displayItemCount = value; + } + } + + /// + /// Gets or sets whatever the show more/less option is active or not + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Search facets setup", 1)] + [DisplayName("Collapse large facet lists")] + [DataType(customDataType: KnownFieldTypes.ChipChoice)] + [Choice("[{\"Title\":\"Yes\",\"Name\":\"Yes\",\"Value\":\"True\",\"Icon\":null},{\"Title\":\"No\",\"Name\":\"No\",\"Value\":\"False\",\"Icon\":null}]")] + [ConditionalVisibility("{\"conditions\":[{\"fieldName\":\"IndexCatalogue\",\"operator\":\"NotEquals\",\"value\":null }]}")] + [Description("[{\"Type\":1,\"Chunks\":[{\"Value\":\"Specifies whether to collapse facet lists on\",\"Presentation\":[]}, {\"Value\":\"your site with more than 10 entries. If 'No'\",\"Presentation\":[2]}, {\"Value\":\"is selected, all facets are displayed.\",\"Presentation\":[2]}]}]")] + public bool IsShowMoreLessButtonActive + { + get + { + return this.isShowMoreLessButtonActive; + } + set + { + this.isShowMoreLessButtonActive = value; + } + } + + /// + /// Gets or sets the name of the template that will be displayed. + /// + /// + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Display settings", 1)] + [DisplayName("Template")] + public string TemplateName + { + get + { + return this.templateName; + } + + set + { + this.templateName = value; + } + } + + /// + [Browsable(false)] + public string EmptyLinkText + { + get + { + return Res.Get().FacetWidgetEmptyResult; + } + } + + /// + [Browsable(false)] + public bool IsEmpty + { + get + { + return this.IsSearchModuleActivated() && this.SearchServiceSupportsFacets() && string.IsNullOrEmpty(this.IndexCatalogue); + } + } + + /// + /// Gets the facets widget not supported search service message + /// + /// The facets not supported message. + [Browsable(false)] + public virtual string FacetsNotSupportedMessage + { + get { return this.GetResource("FacetsNotSupportedMessage"); } + } + + /// + /// Gets the message shown when the newsletters module is deactivated. + /// + /// The newsletters module deactivated message. + [Browsable(false)] + public virtual string SearchModuleDeactivatedMessage + { + get { return this.GetResource("SearchModuleDeactivatedMessage"); } + } + + /// + /// Gets the resource. + /// + /// Name of the resource. + /// + protected virtual string GetResource(string resourceName) + { + return Res.Get(typeof(SearchWidgetsResources), resourceName); + } + + /// + [Category(PropertyCategory.Advanced)] + [DisplayName("CSS class")] + public string WidgetCssClass { get; set; } + + /// + /// Gets or sets the name of the fields that the search will be done by + /// + [Category(PropertyCategory.Advanced)] + [DisplayName("Search fields")] + [DefaultValue(FacetsController.DefaultSearchFieldNames)] + [Description("[{\"Type\":1,\"Chunks\":[{\"Value\":\"List of fields to be used in the search facets. These fields must be the same as those specified in the Search results widget.\",\"Presentation\":[]}]}]")] + public string SearchFields { get; set; } + + /// + /// Gets or sets the Search facets header + /// + [Category(PropertyCategory.Advanced)] + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Labels and messages", 0)] + [DisplayName("Search facets header")] + [DefaultValue(FacetsController.FilterResultsDefaultValue)] + public string FilterResultsLabel + { + get + { + if (string.IsNullOrEmpty(this.filterResultsLabel)) + { + return FacetsController.FilterResultsDefaultValue; + } + + return this.filterResultsLabel; + } + + set + { + filterResultsLabel = value; + } + } + + /// + /// Gets or sets the applied filters label + /// + [Category(PropertyCategory.Advanced)] + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Labels and messages", 1)] + [DisplayName("Search facets label")] + [DefaultValue(FacetsController.AppliedFiltersDefaultValue)] + public string AppliedFiltersLabel + { + get + { + if (string.IsNullOrEmpty(this.appliedFiltersLabel)) + { + return FacetsController.AppliedFiltersDefaultValue; + } + + return this.appliedFiltersLabel; + } + + set + { + this.appliedFiltersLabel = value; + } + } + + /// + /// Gets or sets the clear all label. + /// + [Category(PropertyCategory.Advanced)] + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Labels and messages", 2)] + [DisplayName("Clear facets link")] + [DefaultValue(FacetsController.ClearAllDefaultValue)] + public string ClearAllLabel + { + get + { + if (string.IsNullOrEmpty(clearAllLabel)) + { + return FacetsController.ClearAllDefaultValue; + } + + return this.clearAllLabel; + } + + set + { + this.clearAllLabel = value; + } + } + + /// + /// Gets or sets the show more label + /// + [Category(PropertyCategory.Advanced)] + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Labels and messages", 3)] + [DisplayName("Show more link")] + [DefaultValue(FacetsController.ShowMoreLabelDefaultValue)] + public string ShowMoreLabel + { + get + { + if (string.IsNullOrEmpty(this.showMoreLabel)) + { + return FacetsController.ShowMoreLabelDefaultValue; + } + + return this.showMoreLabel; + } + + set + { + showMoreLabel = value; + } + } + + /// + /// Gets or sets the show less label + /// + [Category(PropertyCategory.Advanced)] + [Progress.Sitefinity.Renderer.Designers.Attributes.ContentSection("Labels and messages", 4)] + [DisplayName("Show less link")] + [DefaultValue(FacetsController.ShowLessLabelDefaultValue)] + public string ShowLessLabel + { + get + { + if (string.IsNullOrEmpty(this.showLessLabel)) + { + return FacetsController.ShowLessLabelDefaultValue; + } + + return this.showLessLabel; + } + + set + { + showLessLabel = value; + } + } + + private bool ShouldShowEmptyWidgetView() + { + var isEdit = SystemManager.IsDesignMode && !SystemManager.IsPreviewMode && !SystemManager.IsInlineEditingMode; + return (!this.IsSearchModuleActivated() && !isEdit) || string.IsNullOrEmpty(this.IndexCatalogue); + } + + private string[] GetSearchFields() + { + var searchFields = this.SearchFields; + if (string.IsNullOrEmpty(this.SearchFields)) + { + searchFields = FacetsController.DefaultSearchFieldNames; + } + + return searchFields.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + } + + private IList BuildFacetsViewModel(IDictionary> facets, IDictionary facetableFieldsFromIndex) + { + IList searchFacetsViewModel = new List(); + if (facetableFieldsFromIndex.Any()) + { + IDictionary widgetFacetableFields = + this.SelectedFacets + .Where(f => facetableFieldsFromIndex.Keys.Contains(f.FacetableFieldNames[0])) + .GroupBy(x => x.FacetableFieldNames[0]) + .Select(f => f.LastOrDefault()) + .ToDictionary(x => x.FacetableFieldNames[0], v => new FacetableFieldSettings() + { + FieldName = v.FacetableFieldNames[0], + FieldTitle = v.FacetableFieldLabels, + FieldType = facetableFieldsFromIndex[v.FacetableFieldNames[0]].FieldType + }); + + foreach (var facet in facets) + { + // find if it has friendly name set in the widget + var facetModel = facet.Value + .Where(f => !string.IsNullOrEmpty(f.FacetValue)) + .Select(f => new FacetElementViewModel() + { + FacetCount = f.Count, + FacetValue = f.FacetValue, + FacetFieldType = widgetFacetableFields[facet.Key].FieldType + }).ToList(); + + var facetableFieldSettings = widgetFacetableFields[facet.Key]; + var searchFacetViewModel = new SearchFacetsViewModel(facetableFieldSettings.FieldTitle, facetableFieldSettings.FieldName, facetModel); + searchFacetsViewModel.Add(searchFacetViewModel); + } + + searchFacetsViewModel = this.SortFacetsModel(widgetFacetableFields, searchFacetsViewModel); + } + + return searchFacetsViewModel; + } + + private IList SortFacetsModel(IDictionary facetableFieldsFromIndex, IList searchFacetsViewModel) + { + if (this.SortType == AlphabeticallySort) + { + searchFacetsViewModel = searchFacetsViewModel + .OrderBy(f => f.FacetTitle) + .ToList(); + } + else + { + var facetsOrder = facetableFieldsFromIndex + .Values + .Select(x => x.FieldTitle) + .ToList(); + + searchFacetsViewModel = searchFacetsViewModel + .OrderBy(f => facetsOrder.IndexOf(f.FacetTitle)) + .ToList(); + } + + return searchFacetsViewModel; + } + + private bool SearchServiceSupportsFacets() + { + var serchConfig = Config.Get(); + + return facetableSearchServices.Contains(serchConfig.CurrentSearchService); + } + + private bool HasAnyFacetElements(IList searchFacets) + { + bool hasAnyFacetElements = false; + if (searchFacets.Any()) + { + hasAnyFacetElements = searchFacets.Any(sf => sf.FacetElements.Any()); + } + + return hasAnyFacetElements; + } + + internal const string WidgetIconCssClass = "sfListitemsIcn sfMvcIcn"; + private string templateName = "Facets"; + private string clearAllLabel; + private string appliedFiltersLabel; + private string filterResultsLabel; + private string showMoreLabel; + private string showLessLabel; + private bool isShowMoreLessButtonActive = true; + private bool displayItemCount = true; + private const string DefaultSearchFieldNames = "Title,Content"; + private const string WidgetName = "Facets_MVC"; + private const string ClearAllDefaultValue = "Clear all"; + private const string AppliedFiltersDefaultValue = "Applied filters"; + private const string FilterResultsDefaultValue = "Filter results"; + private const string ShowMoreLabelDefaultValue = "Show more"; + private const string ShowLessLabelDefaultValue = "Show less"; + private const string AlphabeticallySort = "2"; + private readonly SearchFacetsQueryStringProcessor searchFacetsQueryStringPorcessor; + private readonly HashSet facetableSearchServices = new HashSet() { AzureSearchService.ServiceName, ElasticsearchService.ServiceName }; + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/SearchResultsController.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/SearchResultsController.cs index afbde3beb..9c0c5fb06 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/SearchResultsController.cs +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Controllers/SearchResultsController.cs @@ -1,8 +1,6 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel; using System.Web.Mvc; -using Telerik.Sitefinity.Abstractions; using Telerik.Sitefinity.Configuration; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers.Attributes; @@ -15,7 +13,6 @@ using Telerik.Sitefinity.Services.Search; using Telerik.Sitefinity.Services.Search.Configuration; using Telerik.Sitefinity.Web; -using Telerik.Sitefinity.Web.OutputCache; namespace Telerik.Sitefinity.Frontend.Search.Mvc.Controllers { @@ -78,10 +75,12 @@ public ISearchResultsModel Model /// The language. /// The order by. /// The param used to boost the search results. + /// The param used to filter the search results. + /// The param used to filter search results per site when the index is for all sites. /// /// The . /// - public ActionResult Index(int? page, string searchQuery = null, string indexCatalogue = null, string language = null, string orderBy = null, string scoringInfo = null) + public ActionResult Index(int? page, string searchQuery = null, string indexCatalogue = null, string language = null, string orderBy = null, string scoringInfo = null, string filter = null, bool? resultsForAllSites = null) { if (!this.IsSearchModuleActivated()) { @@ -98,6 +97,8 @@ public ActionResult Index(int? page, string searchQuery = null, string indexCata HttpContext.Request.QueryStringGet(nameof(language)); HttpContext.Request.QueryStringGet(nameof(orderBy)); HttpContext.Request.QueryStringGet(nameof(scoringInfo)); + HttpContext.Request.QueryStringGet(nameof(filter)); + HttpContext.Request.QueryStringGet(nameof(resultsForAllSites)); } if (!string.IsNullOrEmpty(searchQuery)) @@ -106,7 +107,7 @@ public ActionResult Index(int? page, string searchQuery = null, string indexCata if (isValid) { - string queryString = this.BuildSearchResultsQueryString(searchQuery, indexCatalogue, orderBy, scoringInfo); + string queryString = this.BuildSearchResultsQueryString(searchQuery, indexCatalogue, orderBy, scoringInfo, filter, resultsForAllSites); string languageParamFormat = "&language={0}"; string languageParam = string.IsNullOrEmpty(language) ? string.Empty : string.Format(languageParamFormat, language); @@ -125,7 +126,8 @@ public ActionResult Index(int? page, string searchQuery = null, string indexCata var searchScoringDecoder = new SearchScoringDecoder(); SearchScoring searchScoring = searchScoringDecoder.GetSearchScoringSettings(scoringInfo); - this.Model.PopulateResults(searchQuery, indexCatalogue, itemsToSkip, language, orderBy, searchScoring); + string decodedFilter = filter?.Base64Decode(); + this.Model.PopulateResults(searchQuery, indexCatalogue, itemsToSkip, language, orderBy, decodedFilter, searchScoring, resultsForAllSites); return this.View(this.TemplateName, this.Model); } @@ -138,7 +140,7 @@ public ActionResult Index(int? page, string searchQuery = null, string indexCata return null; } - private string BuildSearchResultsQueryString(string searchQuery, string indexCatalogue, string orderBy, string scoringInfo) + private string BuildSearchResultsQueryString(string searchQuery, string indexCatalogue, string orderBy, string scoringInfo, string filter, bool? resultsForAllSites) { var queryStringFormat = "?indexCatalogue={0}&searchQuery={1}&orderBy={2}"; @@ -148,6 +150,16 @@ private string BuildSearchResultsQueryString(string searchQuery, string indexCat queryString = $"{queryString}&scoringInfo={scoringInfo}"; } + if (!string.IsNullOrEmpty(filter)) + { + queryString = $"{queryString}&filter={filter}"; + } + + if (resultsForAllSites.HasValue) + { + queryString = $"{queryString}&resultsForAllSites={resultsForAllSites}"; + } + return queryString; } diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetElementViewModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetElementViewModel.cs new file mode 100644 index 000000000..f7dff35f3 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetElementViewModel.cs @@ -0,0 +1,25 @@ +using Telerik.Sitefinity.Publishing.PublishingPoints; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Models +{ + /// + /// Facet view model + /// + public class FacetElementViewModel + { + /// + /// Gets or sets the facet value + /// + public string FacetValue { get; set; } + + /// + /// Gets or sets the facet count + /// + public long FacetCount { get; set; } + + /// + /// Gets or sets the facet field type + /// + public SearchIndexAdditonalFieldType FacetFieldType { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetWidgetFieldModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetWidgetFieldModel.cs new file mode 100644 index 000000000..816dc38b5 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetWidgetFieldModel.cs @@ -0,0 +1,27 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Models +{ + /// + /// Facet widget field model + /// + public class FacetWidgetFieldModel + { + /// + /// Gets or sets the additional facetable fieldSearchFacetsQueryStringProcessors names. + /// + [DisplayName("Field")] + [DataType(customDataType: "facetTaxa")] + [DefaultValue(new string[0])] + public string[] FacetableFieldNames { get; set; } + + /// + /// Gets or sets the additional facetable fields labels. + /// + [Description("[{\"Type\":1,\"Chunks\":[{\"Value\":\"Add a name of the facetable field that is\",\"Presentation\":[]},{\"Value\":\"visible on your site.\",\"Presentation\":[]}]}]")] + [DisplayName("Label")] + [DefaultValue("")] + public string FacetableFieldLabels { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetableFieldSettings.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetableFieldSettings.cs new file mode 100644 index 000000000..e74500b83 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetableFieldSettings.cs @@ -0,0 +1,25 @@ +using Telerik.Sitefinity.Publishing.PublishingPoints; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Models +{ + /// + /// Model of the facetable field settings + /// + internal class FacetableFieldSettings + { + /// + /// Gets or sets the field type + /// + public SearchIndexAdditonalFieldType FieldType { get; set; } + + /// + /// Gets or sets the fiently name of the field + /// + public string FieldTitle { get; set; } + + /// + /// Gets or sets the developer name of the field + /// + public string FieldName { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetsWidgetViewModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetsWidgetViewModel.cs new file mode 100644 index 000000000..bb8c46f4a --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/FacetsWidgetViewModel.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Models +{ + /// + /// Model for displaying search facets + /// + public class FacetsWidgetViewModel + { + /// + /// Initializes a new instance of the view model + /// + public FacetsWidgetViewModel() + { + this.SearchFacets = new List(); + } + + /// + /// Gets or sets the list of search facets + /// + public IList SearchFacets { get; set; } + + /// + /// Gets or sets the clear all label + /// + public string ClearAllLabel { get; set; } + + /// + /// Gets or sets the filter results label + /// + public string FilterResultsLabel { get; set; } + + /// + /// Gets or sets the applied to label + /// + public string AppliedFiltersLabel { get; set; } + + /// + /// Gets or sets the show more label + /// + public string ShowMoreLabel { get; set; } + + /// + /// Gets or sets the show less label + /// + public string ShowLessLabel { get; set; } + + /// + /// Gets or sets whatever the button is active or not + /// + public bool IsShowMoreLessButtonActive { get; set; } + + /// + /// Gets or sets whatever the facets are displyed with their count + /// + public bool DisplayItemCount { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchBoxModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchBoxModel.cs index 382ddec53..0fdbfa1e5 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchBoxModel.cs +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchBoxModel.cs @@ -72,5 +72,10 @@ public interface ISearchBoxModel /// Gets or sets the background hint text. /// string BackgroundHint { get; set; } + + /// + /// Gets or sets a value indicating wether results are shown for all indexed sites, only for the current site, or if the value is null - the configuration is made globally in advanced settings + /// + bool? SearchInAllSitesInTheIndex { get; set; } } } diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchResultsModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchResultsModel.cs index fb2cbfab0..274c4cb13 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchResultsModel.cs +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/ISearchResultsModel.cs @@ -130,7 +130,6 @@ public interface ISearchResultsModel /// The languages. CultureInfo[] Languages { get; set; } - /// /// Performs search by given query and populates the results collection. /// /// The search query. @@ -138,8 +137,10 @@ public interface ISearchResultsModel /// The skip. /// The language of the displayed results. /// The order by. + /// The filter by. /// The search scoring settings. - void PopulateResults(string searchQuery, string indexCatalogue, int? skip, string language, string orderBy, SearchScoring searchScoring); + /// Indicates wether results are shown for all indexed sites or only for the current site if the search index is created for all sites. + void PopulateResults(string searchQuery, string indexCatalogue, int? skip, string language, string orderBy, string filter, SearchScoring searchScoring, bool? resultsForAllSites); /// /// Performs search by given query and populates the results collection. diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchBoxModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchBoxModel.cs index 9386e3adb..8d97dd472 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchBoxModel.cs +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchBoxModel.cs @@ -129,6 +129,9 @@ public string BackgroundHint } } + /// + public bool? SearchInAllSitesInTheIndex { get; set; } = null; + /// [Obsolete("The WordsMode property is deprecated. This property is no longer used.")] public WordsMode WordsMode { get; set; } diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchFacetsViewModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchFacetsViewModel.cs new file mode 100644 index 000000000..35ee0e027 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchFacetsViewModel.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; + +namespace Telerik.Sitefinity.Frontend.Search.Mvc.Models +{ + /// + /// Model representing search facets for a particular field + /// + public class SearchFacetsViewModel + { + /// + /// Initializes a new instance of the SearchFacetsViewModel + /// + public SearchFacetsViewModel() + { + this.FacetElements = new List(); + } + + /// + /// Initializes a new instance of the SearchFacetsViewModel + /// + /// The friendly title of the field that the facets are for + /// The developer name of the field that the facets are for + /// The facets for the field + public SearchFacetsViewModel(string facetTitle, string facetFieldName, IList facetElements) + { + if (string.IsNullOrEmpty(facetFieldName)) + { + throw new ArgumentNullException(nameof(facetFieldName)); + } + + if (facetElements == null) + { + throw new ArgumentNullException(nameof(facetElements)); + } + + this.FacetTitle = facetTitle; + this.FacetFieldName = facetFieldName; + this.FacetElements = facetElements; + } + + /// + /// Gets or seths the search facets + /// + public IList FacetElements { get; set; } + + /// + /// Gets or sets the title of the field that the facets are for + /// + public string FacetTitle { get; set; } + + /// + /// Gets or sets the field name of the field that the facets are for + /// + public string FacetFieldName { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchResultsModel.cs b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchResultsModel.cs index 9d75aafdc..1c05c76ff 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchResultsModel.cs +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Models/SearchResultsModel.cs @@ -8,11 +8,10 @@ using Telerik.Sitefinity.Abstractions; using Telerik.Sitefinity.Configuration; using Telerik.Sitefinity.Frontend.Search.Mvc.StringResources; +using Telerik.Sitefinity.Frontend.Search.Services; using Telerik.Sitefinity.Localization; -using Telerik.Sitefinity.Publishing; using Telerik.Sitefinity.Search; using Telerik.Sitefinity.Security; -using Telerik.Sitefinity.Services; using Telerik.Sitefinity.Services.Search; using Telerik.Sitefinity.Services.Search.Configuration; using Telerik.Sitefinity.Services.Search.Data; @@ -34,6 +33,7 @@ public SearchResultsModel(CultureInfo[] languages) { this.Languages = languages; this.Results = new ResultModel(); + this.searchProcessor = new SearchFacetsQueryStringProcessor(); } #endregion @@ -135,14 +135,15 @@ public string[] HighlightedFields #endregion #region Public methods + /// public virtual void PopulateResults(string searchQuery, string indexCatalogue, int? skip, string language, string orderBy) { - this.PopulateResults(searchQuery, indexCatalogue, skip, language, orderBy, null); + this.PopulateResults(searchQuery, indexCatalogue, skip, language, orderBy, null, null, null); } /// - public virtual void PopulateResults(string searchQuery, string indexCatalogue, int? skip, string language, string orderBy, SearchScoring searchScoringSettings) + public virtual void PopulateResults(string searchQuery, string indexCatalogue, int? skip, string language, string orderBy, string filter, SearchScoring searchScoringSettings, bool? resultsForAllSites) { this.IndexCatalogue = indexCatalogue; this.InitializeOrderByEnum(orderBy); @@ -168,7 +169,7 @@ public virtual void PopulateResults(string searchQuery, string indexCatalogue, i } int totalCount = 0; - var result = this.Search(searchQuery, language, itemsToSkip, take.Value, searchScoringSettings, out totalCount); + var result = this.Search(searchQuery, language, itemsToSkip, take.Value, filter, searchScoringSettings, resultsForAllSites, out totalCount); int? totalPagesCount = (int)Math.Ceiling((double)(totalCount / (double)this.ItemsPerPage.Value)); this.TotalPagesCount = this.DisplayMode == ListDisplayMode.Paging ? totalPagesCount : null; @@ -180,13 +181,7 @@ public virtual void PopulateResults(string searchQuery, string indexCatalogue, i var culture = string.IsNullOrEmpty(language) ? Telerik.Sitefinity.Services.SystemManager.CurrentContext.Culture.Name : language; using (new CultureRegion(culture)) { - try - { - this.Results = new ResultModel(result.ToList(), totalCount); - } - catch (UnauthorizedAccessException) - { - } + this.Results = new ResultModel(result.ToList(), totalCount); } } @@ -222,15 +217,17 @@ public virtual bool ValidateQuery(ref string searchQuery) /// The take. /// The search scoring settings. /// The hit count. + /// The filter parameters + /// Indicates wether results are shown for all indexed sites or only for the current site if the search index is created for all sites. /// - public IEnumerable Search(string query, string language, int skip, int take, SearchScoring scoringSettings, out int hitCount) + public IEnumerable Search(string query, string language, int skip, int take, string filterParameters, SearchScoring scoringSettings, bool? resultsForAllSites, out int hitCount) { var service = Telerik.Sitefinity.Services.ServiceBus.ResolveService(); var queryBuilder = ObjectFactory.Resolve(); var config = Config.Get(); var enableExactMatch = config.EnableExactMatch; - var searchQuery = queryBuilder.BuildQuery(query, this.SearchFields); + var searchQuery = queryBuilder.BuildQuery(query, this.SearchFields, language, resultsForAllSites); searchQuery.IndexName = this.IndexCatalogue; searchQuery.Skip = skip; searchQuery.Take = take; @@ -238,9 +235,19 @@ public IEnumerable Search(string query, string language, int skip, in searchQuery.EnableExactMatch = enableExactMatch; searchQuery.HighlightedFields = this.HighlightedFields; - ISearchFilter filter; - if (this.TryBuildLanguageFilter(language, out filter)) + var groups = this.GetFilterGroups(searchQuery); + + if (!string.IsNullOrEmpty(filterParameters)) + { + ISearchFilter facetFilter = this.searchProcessor.BuildFacetFilter(filterParameters, this.IndexCatalogue); + groups.Add(facetFilter); + } + + if (groups.Any()) { + ISearchFilter filter = ObjectFactory.Resolve(); + filter.Operator = QueryOperator.And; + filter.Groups = groups; searchQuery.Filter = filter; } @@ -251,7 +258,7 @@ public IEnumerable Search(string query, string language, int skip, in var permissionFilter = config.EnableFilterByViewPermissions; if (permissionFilter) { - Func> searchResults = delegate (int querySkip, int queryTake) + Func> searchResults = delegate(int querySkip, int queryTake) { searchQuery.Skip = querySkip; searchQuery.Take = queryTake; @@ -295,10 +302,21 @@ public IEnumerable Search(string query, string language, int skip, in return result.SetContentLinks(this.ShowLinksOnlyFromCurrentSite); } } + #endregion #region Private methods + private IList GetFilterGroups(ISearchQuery searchQuery) + { + if (searchQuery != null && searchQuery.Filter != null && searchQuery.Filter.Groups != null) + { + return searchQuery.Filter.Groups.ToList(); + } + + return new List(); + } + /// /// Validates the passed user input against the defined validation rules /// @@ -365,32 +383,6 @@ private bool Validate(ref string searchQuery, out string message) return rules; } - private bool TryBuildLanguageFilter(string language, out ISearchFilter filter) - { - if (String.IsNullOrEmpty(language) || - !SystemManager.CurrentContext.AppSettings.Multilingual) - { - filter = null; - return false; - } - - filter = ObjectFactory.Resolve(); - filter.Clauses = new List() - { - new SearchFilterClause(PublishingConstants.LanguageField, this.TransformLanguageFieldValue(language), FilterOperator.Equals), - new SearchFilterClause(PublishingConstants.LanguageField, "nullvalue", FilterOperator.Equals) - }; - filter.Operator = QueryOperator.Or; - - return true; - } - - private string TransformLanguageFieldValue(string language) - { - var result = language.ToLowerInvariant().Replace("-", string.Empty); - return result; - } - /// /// Gets the order list. /// @@ -432,6 +424,7 @@ private void InitializeOrderByEnum(string orderBy) private int? itemsPerPage = 20; private string[] searchFields = new[] { "Title", "Content" }; private string[] highlightedFields = new[] { "Title", "Content" }; + private readonly SearchFacetsQueryStringProcessor searchProcessor; #endregion } diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.js b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.js new file mode 100644 index 000000000..c5ee52bc1 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.js @@ -0,0 +1,359 @@ +(function () { + function init() { + var FILTER_QUERY_PARAM = "filter"; + + var facetWidgetWrapper = document.getElementById("facetContainer"); + var appliedFiltersContainer = document.getElementById("applied-filters"); + + var defaultFacetsCollapseCount = 10; + if (facetWidgetWrapper) { + + facetWidgetWrapper.addEventListener('change', function (ev) { + processSelectedFilter(ev.target); + + var filterObject = getAllCheckedFacetInputs(facetWidgetWrapper, ev.target); + var filterString = JSON.stringify(filterObject); + var query = window.location.search; + var queryStringParser = new Querystring(query.substring(1, query.length)); + + if (filterObject && filterObject.appliedFilters && filterObject.appliedFilters.length > 0) { + var encodedFilterString = btoa(filterString); + queryStringParser.set(FILTER_QUERY_PARAM, encodedFilterString); + toggleClearAllVisibility(true); + + } else { + queryStringParser.remove(FILTER_QUERY_PARAM); + toggleClearAllVisibility(false); + } + + var url = buildUrl(queryStringParser); + + loadDataAsync(url); + window.history.pushState({ path: url }, "", url); + }); + + var clearAllBtn = document.getElementById("sf-facet-clear-all-btn"); + if (clearAllBtn) { + clearAllBtn.addEventListener("click", function () { + var checkedFilters = facetWidgetWrapper.querySelectorAll('input[type="checkbox"]:checked'); + checkedFilters.forEach(function (checkedInput) { + checkedInput.checked = false; + }); + + facetWidgetWrapper.dispatchEvent(new Event("change")); + + appliedFiltersContainer.innerText = ""; + }); + } + + var showAllFacetsFields = document.querySelectorAll('[id^="show-more-less"]'); + if (showAllFacetsFields) { + facetWidgetWrapper.addEventListener('click', function (ev) { + if (ev.target && ev.target.id.startsWith("show-more-less")) { + var facetKey = ev.target.attributes["data-facet-type"].value; + var showLessText = ev.target.attributes["show-less"].value; + var showMoreText = ev.target.attributes["show-more"].value; + + var ulFacetListId = "facets-group-list-" + facetKey; + var facetList = Array.from(document.querySelectorAll("#" + ulFacetListId + ">li")); + addOrRemoveHiddenAttributeInCollection(facetList, ev, showLessText, showMoreText); + } + }); + } + } + + if (appliedFiltersContainer) { + appliedFiltersContainer.addEventListener('click', function (ev) { + if (!ev.target || !ev.target.hasAttribute("data-facet-key")) { + return; + } + var spanToRemove = ev.target.parentElement; + appliedFiltersContainer.removeChild(spanToRemove); + + var facetKey = ev.target.attributes["data-facet-key"].value; + var facetValue = ev.target.attributes["data-facet-value"].value; + var inputId = "facet-checkbox-" + facetKey + "-" + facetValue; + var facetCheckedInputEl = document.getElementById(inputId); + facetCheckedInputEl.checked = false; + facetWidgetWrapper.dispatchEvent(new Event("change")); + }); + } + + markSelectedInputs(true); + + showHideShowMoreLessButtons(); + + function toggleClearAllVisibility(shouldShow) { + var clearAllBtn = document.getElementById("sf-facet-clear-all-btn"); + if (clearAllBtn) { + if (shouldShow) { + clearAllBtn.removeAttribute('hidden'); + } else { + clearAllBtn.setAttribute('hidden', "true"); + } + } + } + + function buildUrl(queryStringParser) { + var currentLocation = window.location.href.split('?')[0]; + + // return the pager to 0 + var currentPageUrlElement = document.getElementById("sf-currentPageUrl"); + if (currentPageUrlElement) { + currentLocation = currentPageUrlElement.value; + } + + var url = currentLocation + "?" + queryStringParser.toString(); + + return url; + } + + function processSelectedFilter(element) { + if (!element || element.tagName.toLowerCase() !== "input") { + return; + } + + var facetKey = element.attributes["data-facet-key"].value; + var facetValue = element.attributes["data-facet-value"].value; + var facetLabel = element.parentElement.getElementsByTagName('label')[0].textContent; + var removeFilterId = "remove-facet-filter-" + facetKey + "-" + facetValue; + if (element.checked) { + var newFilter = createAppliedFilterElement(removeFilterId, facetKey, facetValue, facetLabel); + appliedFiltersContainer.appendChild(newFilter); + } else { + var facetFilterEl = document.getElementById(removeFilterId); + appliedFiltersContainer.removeChild(facetFilterEl.parentElement); + } + } + + function createAppliedFilterElement(removeFilterId, facetKey, filterValue, facetLabel) { + var filterLabelClass = appliedFiltersContainer.attributes["data-sf-filter-label-css-class"].value; + var appliedFilterHtmlTag = appliedFiltersContainer.attributes["data-sf-applied-filter-html-tag"].value || "span"; + var filterSpanEl = document.createElement(appliedFilterHtmlTag); + + filterSpanEl.setAttribute("class", filterLabelClass); + filterSpanEl.innerText = facetLabel; + + var removeFilterClass = appliedFiltersContainer.attributes["data-sf-remove-filter-css-class"].value; + var removeButtonSpan = document.createElement("span"); + removeButtonSpan.setAttribute("id", removeFilterId); + removeButtonSpan.setAttribute("role", "button"); + removeButtonSpan.setAttribute("tabindex", "0"); + removeButtonSpan.setAttribute("title", "Remove"); + removeButtonSpan.setAttribute("class", removeFilterClass); + removeButtonSpan.setAttribute("data-facet-key", facetKey); + removeButtonSpan.setAttribute("data-facet-value", filterValue); + removeButtonSpan.innerText = "✕"; + + filterSpanEl.appendChild(removeButtonSpan); + + return filterSpanEl; + } + + function loadDataAsync(url) { + var xmlHttp = new XMLHttpRequest(); + xmlHttp.open("GET", url, true); // true for asynchronous + xmlHttp.setRequestHeader("Content-type", "application/json; charset=utf-8"); + xmlHttp.setRequestHeader("Accept", "application/json"); + document.dispatchEvent(new CustomEvent("beginLoadingSearchResults")); + + xmlHttp.onreadystatechange = function () { + if (xmlHttp.readyState === 4 && xmlHttp.status === 200 && xmlHttp.responseText) { + var parser = new DOMParser(); + var htmlDoc = parser.parseFromString(xmlHttp.responseText, 'text/html'); + + if (htmlDoc) { + document.dispatchEvent(new CustomEvent("searchResultsLoaded", { + detail: { + searchResultsPageDocument: htmlDoc, + } + })); + + rebindSearchFacets(htmlDoc); + } + } + }; + + xmlHttp.onerror = function () { + document.dispatchEvent(new CustomEvent("searchResultsLoaded", { + detail: { + searchResultsPageDocument: null, + } + })); + }; + + xmlHttp.send(null); + } + + function rebindSearchFacets(htmlDoc) { + var newSearchFacets = htmlDoc.getElementById("facetContent"); + var oldSearchFacetsContent = document.getElementById("facetContent"); + oldSearchFacetsContent.innerHTML = newSearchFacets.innerHTML; + + markSelectedInputs(); + showHideShowMoreLessButtons(); + } + + function markSelectedInputs(createAppliedFiltersChips) { + var query = window.location.search; + var queryStringParser = new Querystring(query.substring(1, query.length)); + var filterQuery = queryStringParser.get(FILTER_QUERY_PARAM); + + if (filterQuery) { + toggleClearAllVisibility(true); + var decodedFilterParam = atob(filterQuery); + var jsonFilters = JSON.parse(decodedFilterParam); + jsonFilters.appliedFilters.forEach(function (filter) { + filter.filterValues.forEach(function (filterValue) { + var inputId = "facet-checkbox-" + decodeURIComponent(filter.fieldName) + "-" + decodeURIComponent(filterValue); + var currentInputElement = document.getElementById(inputId); + if (currentInputElement) { + currentInputElement.checked = true; + if (createAppliedFiltersChips) { + processSelectedFilter(currentInputElement); + } + } + }); + }); + } + } + + function getAllCheckedFacetInputs(facetWidgetWrapper, eventTargetElement) { + + if (facetWidgetWrapper) { + var groupedFilters = groupAllCheckedFacetInputs(); + + var lastSelectedElementKey; + if (eventTargetElement && eventTargetElement.tagName.toLowerCase() === "input") { + lastSelectedElementKey = eventTargetElement.attributes["data-facet-key"].value; + } + + var isDeselected = false; + if (eventTargetElement && eventTargetElement.tagName.toLowerCase() === "input") { + lastSelectedElementKey = eventTargetElement.attributes["data-facet-key"].value; + isDeselected = !eventTargetElement.checked; + } + + var filterObject = { + appliedFilters: Object.keys(groupedFilters).map(function (el) { + return { + fieldName: el, + filterValues: groupedFilters[el] + }; + }), + lastSelectedFilterGropName: lastSelectedElementKey, + isDeselected: isDeselected + }; + + return filterObject; + } + } + + function addOrRemoveHiddenAttributeInCollection(facetList, ev, showLessText, showMoreText) { + var isListHasHiddenAttributes = facetList.some(function (listElement) { + return listElement.hasAttribute("hidden"); + }); + + if (isListHasHiddenAttributes) + { + facetList.forEach(function (listElement) { + listElement.removeAttribute('hidden'); + }); + + ev.target.innerText = showLessText; + } else { + facetList.slice(defaultFacetsCollapseCount).forEach(function (listElement) { + listElement.setAttribute('hidden', "true"); + }); + + ev.target.innerText = showMoreText; + } + } + + function showHideShowMoreLessButtons() { + + if (facetWidgetWrapper) { + var groupedFilters = groupAllCheckedFacetInputs(); + var groupedCheckedFacetsJson = parseGroupedFiltersToJson(groupedFilters); + + // Check if we need to show the 'Show less' or 'Show more' button for particular facet group + groupedCheckedFacetsJson.forEach(function (facet) { + var facetName = facet.fieldName; + var button = document.getElementById("show-more-less-" + facetName); + + if (button) { + var buttonText = button.attributes["show-less"].value; + var selectedFacetValues = facet.filterValues; + var ulFacetListId = "facets-group-list-" + facetName; + var facetList = Array.from(document.querySelectorAll("#" + ulFacetListId + ">li")); + + // Set all facets values for particular group in array + var allFacetValuesInGroup = []; + facetList.forEach(function (listElement) { + var inputEl = listElement.getElementsByTagName('input')[0]; + var facetValue = inputEl.attributes["data-facet-value"].value; + var encodeFacetValue = encodeURIComponent(facetValue); + + allFacetValuesInGroup.push(encodeFacetValue); + }); + + // Remove the hidden attribute from the li elements when there is checked facet after the default hidden position. Which is 10. + for (var selectedFacetIndex = 0; selectedFacetIndex < selectedFacetValues.length; selectedFacetIndex++) { + /*jshint loopfunc: true */ + var index = allFacetValuesInGroup.indexOf(selectedFacetValues[selectedFacetIndex]); + + if (index > defaultFacetsCollapseCount - 1) { + facetList.forEach(function (listElement) { + listElement.removeAttribute('hidden'); + button.innerText = buttonText; + }); + + break; + } + } + } + }); + } + } + + function groupAllCheckedFacetInputs() { + var groupedFilters = {}; + + var checkedFilters = facetWidgetWrapper.querySelectorAll('input[type="checkbox"]:checked'); + if (checkedFilters) { + checkedFilters.forEach(function (checkedFilter) { + var facetKey = checkedFilter.attributes["data-facet-key"].value; + var facetValue = checkedFilter.attributes["data-facet-value"].value; + + var filterKey = encodeURIComponent(facetKey); + var filterValue = encodeURIComponent(facetValue); + + if (groupedFilters.hasOwnProperty(filterKey)) { + groupedFilters[filterKey].push(filterValue); + } else { + groupedFilters[filterKey] = [filterValue]; + } + }); + } + + return groupedFilters; + } + + function parseGroupedFiltersToJson(groupedFilters) { + var jsonFilter = Object.keys(groupedFilters).map(function (el) { + return { + fieldName: el, + filterValues: groupedFilters[el] + }; + }); + + return jsonFilter; + } + } + + document.addEventListener('DOMContentLoaded', function () { + init(); + }); +}()); + + diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.min.js b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.min.js new file mode 100644 index 000000000..3b8bc80a0 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/facets-widget.min.js @@ -0,0 +1,2 @@ +!function(){function e(){var o="filter",u=document.getElementById("facetContainer"),s=document.getElementById("applied-filters"),l=10;if(u){u.addEventListener("change",function(e){f(e.target);var t=function(e,t){if(e){var a,n=h();t&&"input"===t.tagName.toLowerCase()&&(a=t.attributes["data-facet-key"].value);var r=!1;return t&&"input"===t.tagName.toLowerCase()&&(a=t.attributes["data-facet-key"].value,r=!t.checked),{appliedFilters:Object.keys(n).map(function(e){return{fieldName:e,filterValues:n[e]}}),lastSelectedFilterGropName:a,isDeselected:r}}}(u,e.target),a=JSON.stringify(t),n=window.location.search,r=new Querystring(n.substring(1,n.length));if(t&&t.appliedFilters&&0li")),e,a,n)}})}function d(e){var t=document.getElementById("sf-facet-clear-all-btn");t&&(e?t.removeAttribute("hidden"):t.setAttribute("hidden","true"))}function f(e){if(e&&"input"===e.tagName.toLowerCase()){var t=e.attributes["data-facet-key"].value,a=e.attributes["data-facet-value"].value,n=e.parentElement.getElementsByTagName("label")[0].textContent,r="remove-facet-filter-"+t+"-"+a;if(e.checked){var i=function(e,t,a,n){var r=s.attributes["data-sf-filter-label-css-class"].value,i=s.attributes["data-sf-applied-filter-html-tag"].value||"span",c=document.createElement(i);c.setAttribute("class",r),c.innerText=n;var o=s.attributes["data-sf-remove-filter-css-class"].value,u=document.createElement("span");return u.setAttribute("id",e),u.setAttribute("role","button"),u.setAttribute("tabindex","0"),u.setAttribute("title","Remove"),u.setAttribute("class",o),u.setAttribute("data-facet-key",t),u.setAttribute("data-facet-value",a),u.innerText="✕",c.appendChild(u),c}(r,t,a,n);s.appendChild(i)}else{var c=document.getElementById(r);s.removeChild(c.parentElement)}}}function m(r){var e=window.location.search,t=new Querystring(e.substring(1,e.length)).get(o);if(t){d(!0);var a=atob(t);JSON.parse(a).appliedFilters.forEach(function(n){n.filterValues.forEach(function(e){var t="facet-checkbox-"+decodeURIComponent(n.fieldName)+"-"+decodeURIComponent(e),a=document.getElementById(t);a&&(a.checked=!0,r&&f(a))})})}}function v(){u&&function(t){return Object.keys(t).map(function(e){return{fieldName:e,filterValues:t[e]}})}(h()).forEach(function(e){var t=e.fieldName,a=document.getElementById("show-more-less-"+t);if(a){var n=a.attributes["show-less"].value,r=e.filterValues,i="facets-group-list-"+t,c=Array.from(document.querySelectorAll("#"+i+">li")),o=[];c.forEach(function(e){var t=e.getElementsByTagName("input")[0].attributes["data-facet-value"].value,a=encodeURIComponent(t);o.push(a)});for(var u=0;u back to + // See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1 + qs = qs.replace(/\+/g, ' '); + var args = qs.split('&'); // parse out name/value pairs separated via & + + // split out each name=value pair + for (var i = 0; i < args.length; i++) { + var currentElement = args[i]; + var equalsIndex = currentElement.indexOf('='); + var name = currentElement.slice(0, equalsIndex); + var value = decodeURIComponent(currentElement.slice(equalsIndex + 1)); + + this.params[name] = value; + this.keys[i] = name; + } +}; + +Querystring.prototype = { + get: function (key, default_) { + var value = this.params[key.toLowerCase()]; + return (value !== null) ? value : default_; + }, + + contains: function (key) { + var value = this.params[key.toLowerCase()]; + return (value !== null); + }, + + set: function (key, value) { + var lowerKey = key.toLowerCase(); + if (this.keys.indexOf(lowerKey) == -1) { + this.keys.push(lowerKey); + } + this.params[lowerKey] = value; + }, + + remove: function (key) { + var lowerKey = key.toLowerCase(); + var index = this.keys.indexOf(lowerKey); + if (index > -1) { + this.keys.splice(index, 1); + } + }, + + toString: function (appendQuestionMark) { + if (this.keys.length > 0) { + var query = appendQuestionMark ? "?" : ""; + for (var i = 0; i < this.keys.length; i++) { + if (i > 0) + query += "&"; + query += this.keys[i] + "=" + this.params[this.keys[i]]; + } + return query; + } + return ""; + } +}; \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.min.js b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.min.js new file mode 100644 index 000000000..8e8987a05 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/Facets/query-string-utils.min.js @@ -0,0 +1,2 @@ +var Querystring=function(s){if(this.params={},this.keys=[],null===s&&(s=location.search.substring(1,location.search.length)),0!==s.length)for(var t=(s=s.replace(/\+/g," ")).split("&"),e=0;e=a.minSuggestionLength&&(t.IndexName=a.indexCatalogue,t.SuggestionFields=a.suggestionFields,t.Text=n,t.Language=a.language,t.SiteId=a.siteId,a.scoringSettingsSelector&&(t.ScoringInfo=a.scoringSettingsSelector),l.ajax({type:"GET",url:a.suggestionsRoute,dataType:"json",data:t,success:s}))}});try{o.autocomplete({source:[],messages:{noResults:"",results:function(){}},select:function(e,t){o.val(t.item.value),i(e)}}).autocomplete("widget").addClass("sf-autocomplete")}catch(e){}}function s(e,t){var n=e.Suggestions;o.autocomplete("option","source",n),o.autocomplete("search",o.val().trim())}function i(e){(e=e||window.event).stopPropagation?e.stopPropagation():e.cancelBubble=!0,e.preventDefault?e.preventDefault():e.returnValue=!1;var t=o.val();t&&t.trim()&&a.indexCatalogue&&(window.DataIntelligenceSubmitScript&&DataIntelligenceSubmitScript._client.sentenceClient.writeSentence({predicate:"Search for",object:o.val(),objectMetadata:[{K:"PageUrl",V:location.href}]}),window.location=function(){var e=o.val().trim(),t=(-1==a.resultsUrl.indexOf("?")?"?":"&")+"indexCatalogue="+encodeURIComponent(a.indexCatalogue),n="&searchQuery="+encodeURIComponent(e),s=a.resultsUrl+t+n;a.scoringSettingsSelector&&(s=s+"&scoringInfo="+a.scoringSettingsSelector);return s}())}}}window.personalizationManager?window.personalizationManager.addPersonalizedContentLoaded(function(){e()}):document.addEventListener("DOMContentLoaded",function(){e()})}(jQuery); +!function(l){function e(){for(var e=l('[data-sf-role="searchTextBoxId"]'),t=0;t=i.minSuggestionLength&&(t.IndexName=i.indexCatalogue,t.SuggestionFields=i.suggestionFields,t.Text=s,t.Language=i.language,t.SiteId=i.siteId,i.resultsForAllSites&&(t.ResultsForAllSites=i.resultsForAllSites),i.scoringSettingsSelector&&(t.ScoringInfo=i.scoringSettingsSelector),l.ajax({type:"GET",url:i.suggestionsRoute,dataType:"json",data:t,success:n}))}});try{o.autocomplete({source:[],messages:{noResults:"",results:function(){}},select:function(e,t){o.val(t.item.value),a(e)}}).autocomplete("widget").addClass("sf-autocomplete")}catch(e){}}function n(e,t){var s=e.Suggestions;o.autocomplete("option","source",s),o.autocomplete("search",o.val().trim())}function a(e){(e=e||window.event).stopPropagation?e.stopPropagation():e.cancelBubble=!0,e.preventDefault?e.preventDefault():e.returnValue=!1;var t=o.val();t&&t.trim()&&i.indexCatalogue&&(window.DataIntelligenceSubmitScript&&DataIntelligenceSubmitScript._client.sentenceClient.writeSentence({predicate:"Search for",object:o.val(),objectMetadata:[{K:"PageUrl",V:location.href}]}),window.location=function(){var e=o.val().trim(),t=(-1==i.resultsUrl.indexOf("?")?"?":"&")+"indexCatalogue="+encodeURIComponent(i.indexCatalogue),s="&searchQuery="+encodeURIComponent(e),n=i.resultsUrl+t+s;i.scoringSettingsSelector&&(n=n+"&scoringInfo="+i.scoringSettingsSelector);i.resultsForAllSites&&(n=n+"&resultsForAllSites="+i.resultsForAllSites);return n}())}}}window.personalizationManager?window.personalizationManager.addPersonalizedContentLoaded(function(){e()}):document.addEventListener("DOMContentLoaded",function(){e()})}(jQuery); //# sourceMappingURL=Search-box.min.js.map \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchBox/Search-box.min.js.map b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchBox/Search-box.min.js.map index 72a3dc23c..3810c20ec 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchBox/Search-box.min.js.map +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchBox/Search-box.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["Search-box.js"],"names":["$","init","searchBoxIdFields","i","length","searchBoxIdField","featherSearchBoxWidget","resultsUrl","siblings","first","val","indexCatalogue","disableSuggestions","parseJSON","minSuggestionLength","suggestionFields","language","siteId","suggestionsRoute","searchTextBoxSelector","searchButtonSelector","scoringSettingsSelector","serverData","searchTextBox","click","navigateToResults","keypress","e","window","event","keyCode","charCode","keyup","request","searchText","trim","IndexName","SuggestionFields","Text","Language","SiteId","ScoringInfo","ajax","type","url","dataType","data","success","suggestionsSuccessHandler","autocomplete","source","messages","noResults","results","select","ui","item","value","addClass","result","args","dataSource","Suggestions","stopPropagation","cancelBubble","preventDefault","returnValue","query","DataIntelligenceSubmitScript","_client","sentenceClient","writeSentence","predicate","object","objectMetadata","K","V","location","href","catalogueParam","indexOf","encodeURIComponent","searchQueryParam","getLocation","personalizationManager","addPersonalizedContentLoaded","document","addEventListener","jQuery"],"mappings":"CAAC,SAAUA,GACI,SAAPC,IAGA,IAFA,IAAIC,EAAoBF,EAAE,oCAEjBG,EAAI,EAAGA,EAAID,EAAkBE,OAAQD,IAAK,CAC/C,IAAIE,EAAmBL,EAAEE,EAAkBC,IAc3CG,EAbwB,CACpBC,WAAYF,EAAiBG,SAAS,+BAA+BC,QAAQC,MAC7EC,eAAgBN,EAAiBG,SAAS,mCAAmCC,QAAQC,MACrFE,mBAAoBZ,EAAEa,UAAUR,EAAiBG,SAAS,uCAAuCC,QAAQC,OACzGI,oBAAqBT,EAAiBG,SAAS,wCAAwCC,QAAQC,MAC/FK,iBAAkBV,EAAiBG,SAAS,qCAAqCC,QAAQC,MACzFM,SAAUX,EAAiBG,SAAS,6BAA6BC,QAAQC,MACzEO,OAAQZ,EAAiBG,SAAS,2BAA2BC,QAAQC,MACrEQ,iBAAkBb,EAAiBG,SAAS,qCAAqCC,QAAQC,MACzFS,sBAAuBd,EAAiBK,MACxCU,qBAAsBf,EAAiBG,SAAS,mCAAmCC,QAAQC,MAC3FW,wBAAyBhB,EAAiBG,SAAS,oCAAoCC,QAAQC,QAKvG,SAASJ,EAAuBgB,GAC5B,IAAIC,EAAgBvB,EAAEsB,EAAWH,uBAOjC,GANmBnB,EAAEsB,EAAWF,sBAEnBI,MAAMC,GACnBF,EAAcG,SA0Bd,SAAyBC,GAEjBA,EADCA,GACGC,OAAOC,MAEf,IAAIC,EAAU,KAEVA,EADAH,EAAEG,QACQH,EAAEG,QAGFH,EAAEI,SAGD,IAAXD,GACAL,EAAkBE,MApCrBL,EAAWV,mBAAoB,CAChCW,EAAcS,MA8ClB,SAAsBL,GAClB,GAAiB,IAAbA,EAAEG,SACW,IAAbH,EAAEG,SACW,IAAbH,EAAEG,QAAe,CAEA,IAAbH,EAAEG,SAEFL,EAAkBE,GAGtB,IAAIM,EAAU,GACVC,EAAaX,EAAcb,MAAMyB,OACjCD,EAAW9B,QAAUkB,EAAWR,sBAChCmB,EAAQG,UAAYd,EAAWX,eAC/BsB,EAAQI,iBAAmBf,EAAWP,iBACtCkB,EAAQK,KAAOJ,EACfD,EAAQM,SAAWjB,EAAWN,SAC9BiB,EAAQO,OAASlB,EAAWL,OACxBK,EAAWD,0BAEXY,EAAQQ,YAAcnB,EAAWD,yBAGrCrB,EAAE0C,KAAK,CACHC,KAAM,MACNC,IAAKtB,EAAWJ,iBAChB2B,SAAU,OACVC,KAAMb,EACNc,QAASC,QAxErB,IACIzB,EAAc0B,aAAa,CACvBC,OAAQ,GACRC,SACA,CACIC,UAAW,GACXC,QAAS,cAEbC,OAAQ,SAAUzB,EAAO0B,GACrBhC,EAAcb,IAAI6C,EAAGC,KAAKC,OAC1BhC,EAAkBI,MAEvBoB,aAAa,UAAUS,SAAS,mBACrC,MAAO/B,KAwBb,SAASqB,EAA0BW,EAAQC,GACvC,IAAIC,EAAaF,EAAOG,YACxBvC,EAAc0B,aAAa,SAAU,SAAUY,GAE/CtC,EAAc0B,aAAa,SAAU1B,EAAcb,MAAMyB,QAsC7D,SAASV,EAAkBE,IAEnBA,EADCA,GACGC,OAAOC,OAETkC,gBACFpC,EAAEoC,kBAGFpC,EAAEqC,cAAe,EAEjBrC,EAAEsC,eACFtC,EAAEsC,iBAGFtC,EAAEuC,aAAc,EAGpB,IAAIC,EAAQ5C,EAAcb,MAEtByD,GAASA,EAAMhC,QAAUb,EAAWX,iBAwBpCiB,OAAOwC,8BACPA,6BAA6BC,QAAQC,eAAeC,cAAc,CAC9DC,UAAW,aACXC,OAAQlD,EAAcb,MACtBgE,eAAgB,CAAC,CACbC,EAAK,UACLC,EAAKC,SAASC,SA5BtBlD,OAAOiD,SAIf,WACI,IAAIV,EAAQ5C,EAAcb,MAAMyB,OAI5B4C,IAFoD,GAAvCzD,EAAWf,WAAWyE,QAAQ,KAAc,IAAM,KAElC,kBAAoBC,mBAAmB3D,EAAWX,gBAC/EuE,EAAmB,gBAAkBD,mBAAmBd,GAExDvB,EAAMtB,EAAWf,WAAawE,EAAiBG,EAE/C5D,EAAWD,0BACXuB,EAAMA,EAAM,gBAAkBtB,EAAWD,yBAG7C,OAAOuB,EAlBeuC,MAoC9BvD,OAAOwD,uBACPxD,OAAOwD,uBAAuBC,6BAA6B,WACvDpF,MAGJqF,SAASC,iBAAiB,mBAAoB,WAC1CtF,MA/KZ,CAkLEuF","file":"Search-box.min.js"} \ No newline at end of file +{"version":3,"sources":["Search-box.js"],"names":["$","init","searchBoxIdFields","i","length","searchBoxIdField","featherSearchBoxWidget","resultsUrl","siblings","first","val","indexCatalogue","disableSuggestions","parseJSON","minSuggestionLength","suggestionFields","language","siteId","suggestionsRoute","searchTextBoxSelector","searchButtonSelector","scoringSettingsSelector","resultsForAllSites","serverData","searchTextBox","click","navigateToResults","keypress","e","window","event","keyCode","charCode","keyup","request","searchText","trim","IndexName","SuggestionFields","Text","Language","SiteId","ResultsForAllSites","ScoringInfo","ajax","type","url","dataType","data","success","suggestionsSuccessHandler","autocomplete","source","messages","noResults","results","select","ui","item","value","addClass","result","args","dataSource","Suggestions","stopPropagation","cancelBubble","preventDefault","returnValue","query","DataIntelligenceSubmitScript","_client","sentenceClient","writeSentence","predicate","object","objectMetadata","K","V","location","href","catalogueParam","indexOf","encodeURIComponent","searchQueryParam","getLocation","personalizationManager","addPersonalizedContentLoaded","document","addEventListener","jQuery"],"mappings":"CAAC,SAAUA,GACI,SAAPC,IAGA,IAFA,IAAIC,EAAoBF,EAAE,oCAEjBG,EAAI,EAAGA,EAAID,EAAkBE,OAAQD,IAAK,CAC/C,IAAIE,EAAmBL,EAAEE,EAAkBC,IAe3CG,EAdwB,CACpBC,WAAYF,EAAiBG,SAAS,+BAA+BC,QAAQC,MAC7EC,eAAgBN,EAAiBG,SAAS,mCAAmCC,QAAQC,MACrFE,mBAAoBZ,EAAEa,UAAUR,EAAiBG,SAAS,uCAAuCC,QAAQC,OACzGI,oBAAqBT,EAAiBG,SAAS,wCAAwCC,QAAQC,MAC/FK,iBAAkBV,EAAiBG,SAAS,qCAAqCC,QAAQC,MACzFM,SAAUX,EAAiBG,SAAS,6BAA6BC,QAAQC,MACzEO,OAAQZ,EAAiBG,SAAS,2BAA2BC,QAAQC,MACrEQ,iBAAkBb,EAAiBG,SAAS,qCAAqCC,QAAQC,MACzFS,sBAAuBd,EAAiBK,MACxCU,qBAAsBf,EAAiBG,SAAS,mCAAmCC,QAAQC,MAC3FW,wBAAyBhB,EAAiBG,SAAS,oCAAoCC,QAAQC,MAC/FY,mBAAoBjB,EAAiBG,SAAS,+CAA+CC,QAAQC,QAK7G,SAASJ,EAAuBiB,GAC5B,IAAIC,EAAgBxB,EAAEuB,EAAWJ,uBAOjC,GANmBnB,EAAEuB,EAAWH,sBAEnBK,MAAMC,GACnBF,EAAcG,SA0Bd,SAAyBC,GAEjBA,EADCA,GACGC,OAAOC,MAEf,IAAIC,EAAU,KAEVA,EADAH,EAAEG,QACQH,EAAEG,QAGFH,EAAEI,SAGD,IAAXD,GACAL,EAAkBE,MApCrBL,EAAWX,mBAAoB,CAChCY,EAAcS,MA8ClB,SAAsBL,GAClB,GAAiB,IAAbA,EAAEG,SACW,IAAbH,EAAEG,SACW,IAAbH,EAAEG,QAAe,CAEA,IAAbH,EAAEG,SAEFL,EAAkBE,GAGtB,IAAIM,EAAU,GACVC,EAAaX,EAAcd,MAAM0B,OACjCD,EAAW/B,QAAUmB,EAAWT,sBAChCoB,EAAQG,UAAYd,EAAWZ,eAC/BuB,EAAQI,iBAAmBf,EAAWR,iBACtCmB,EAAQK,KAAOJ,EACfD,EAAQM,SAAWjB,EAAWP,SAC9BkB,EAAQO,OAASlB,EAAWN,OACxBM,EAAWD,qBACXY,EAAQQ,mBAAqBnB,EAAWD,oBAGxCC,EAAWF,0BAEXa,EAAQS,YAAcpB,EAAWF,yBAGrCrB,EAAE4C,KAAK,CACHC,KAAM,MACNC,IAAKvB,EAAWL,iBAChB6B,SAAU,OACVC,KAAMd,EACNe,QAASC,QA5ErB,IACI1B,EAAc2B,aAAa,CACvBC,OAAQ,GACRC,SACA,CACIC,UAAW,GACXC,QAAS,cAEbC,OAAQ,SAAU1B,EAAO2B,GACrBjC,EAAcd,IAAI+C,EAAGC,KAAKC,OAC1BjC,EAAkBI,MAEvBqB,aAAa,UAAUS,SAAS,mBACrC,MAAOhC,KAwBb,SAASsB,EAA0BW,EAAQC,GACvC,IAAIC,EAAaF,EAAOG,YACxBxC,EAAc2B,aAAa,SAAU,SAAUY,GAE/CvC,EAAc2B,aAAa,SAAU3B,EAAcd,MAAM0B,QA0C7D,SAASV,EAAkBE,IAEnBA,EADCA,GACGC,OAAOC,OAETmC,gBACFrC,EAAEqC,kBAGFrC,EAAEsC,cAAe,EAEjBtC,EAAEuC,eACFvC,EAAEuC,iBAGFvC,EAAEwC,aAAc,EAGpB,IAAIC,EAAQ7C,EAAcd,MAEtB2D,GAASA,EAAMjC,QAAUb,EAAWZ,iBA4BpCkB,OAAOyC,8BACPA,6BAA6BC,QAAQC,eAAeC,cAAc,CAC9DC,UAAW,aACXC,OAAQnD,EAAcd,MACtBkE,eAAgB,CAAC,CACbC,EAAK,UACLC,EAAKC,SAASC,SAhCtBnD,OAAOkD,SAIf,WACI,IAAIV,EAAQ7C,EAAcd,MAAM0B,OAI5B6C,IAFoD,GAAvC1D,EAAWhB,WAAW2E,QAAQ,KAAc,IAAM,KAElC,kBAAoBC,mBAAmB5D,EAAWZ,gBAC/EyE,EAAmB,gBAAkBD,mBAAmBd,GAExDvB,EAAMvB,EAAWhB,WAAa0E,EAAiBG,EAE/C7D,EAAWF,0BACXyB,EAAMA,EAAM,gBAAkBvB,EAAWF,yBAGzCE,EAAWD,qBACXwB,EAAMA,EAAM,uBAAyBvB,EAAWD,oBAGpD,OAAOwB,EAtBeuC,MAwC9BxD,OAAOyD,uBACPzD,OAAOyD,uBAAuBC,6BAA6B,WACvDtF,MAGJuF,SAASC,iBAAiB,mBAAoB,WAC1CxF,MAxLZ,CA2LEyF","file":"Search-box.min.js"} \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.js b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.js index 451980177..c4aecb19b 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.js +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.js @@ -1,6 +1,9 @@ (function () { /* Polyfills */ + var SEARCH_RESULT_CONTAINER_ID = "sf-search-result-container"; + var SEARCHRESULTS_LOADING_INDICATOR = "sf-search-results-loading-indicator"; + if (window.NodeList && !NodeList.prototype.forEach) { NodeList.prototype.forEach = Array.prototype.forEach; } @@ -8,15 +11,31 @@ /* Polyfills end */ document.addEventListener('DOMContentLoaded', function () { - //Dropdownlist Selectedchange event - document.querySelectorAll(".userSortDropdown").forEach(function (result) { - result.addEventListener('change', function () { - var selectedValue = result.value; - var url = getResultsUrl(selectedValue); - window.location.search = url; - }); + init(); + + }); + + function init() { + + document.addEventListener('searchResultsLoaded', function (ev, o) { + if (ev.detail && ev.detail.searchResultsPageDocument) { + var searchResultsPageDocument = ev.detail.searchResultsPageDocument; + var searchResultsContainer = document.getElementById(SEARCH_RESULT_CONTAINER_ID); + + if (searchResultsContainer) { + var newSearchContent = searchResultsPageDocument.getElementById(SEARCH_RESULT_CONTAINER_ID); + if (newSearchContent) { + searchResultsContainer.innerHTML = newSearchContent.innerHTML; + bindSortDropDown(); + } + } + } + toggleLoadingVisiblity(false); }); + bindSortDropDown(); + bindLoadingIndicator(); + // Returns url with all needed parameters function getResultsUrl(orderBy, language) { var orderByField = document.querySelector('[data-sf-role="searchResOrderBy"]'); @@ -31,7 +50,7 @@ var searchQueryParam = document.querySelector('[data-sf-role="searchResQuery"]').value; var queryString = '?indexCatalogue=' + indexCatalogueParam + '&' + - 'searchQuery=' + searchQueryParam + '&' + + 'searchQuery=' + searchQueryParam + orderByParam + languageParam; @@ -41,7 +60,59 @@ queryString = queryString + scoringInfoParam; } + var filterHiddenElement = document.querySelector('[data-sf-role="filterParameter"]'); + if (filterHiddenElement && filterHiddenElement.value) { + var filterValue = filterHiddenElement.value; + var filterQueryParam = filterValue ? '&filter=' + filterValue : null; + + if (filterQueryParam) { + queryString = queryString + filterQueryParam; + } + } + + var resultsForAllSites = document.querySelector('[data-sf-role="resultsForAllSites"]'); + if (resultsForAllSites) { + var resultsForAllSitesParam = resultsForAllSites.value ? '&resultsForAllSites=' + resultsForAllSites.value : null; + if (resultsForAllSitesParam) { + queryString = queryString + resultsForAllSitesParam; + } + } + return queryString; } - }); + + function bindSortDropDown() { + //Dropdownlist Selectedchange event + document.querySelectorAll(".userSortDropdown").forEach(function (result) { + result.addEventListener('change', function () { + var selectedValue = result.value; + var url = getResultsUrl(selectedValue); + window.location.search = url; + }); + }); + } + + function bindLoadingIndicator() { + document.addEventListener('beginLoadingSearchResults', function (ev, o) { + toggleLoadingVisiblity(true); + }); + } + + + function toggleLoadingVisiblity(showLoading) { + var searchResultsElements = document.getElementById(SEARCH_RESULT_CONTAINER_ID); + var elementsToHideWhileLoading = searchResultsElements.querySelectorAll("[data-sf-hide-while-loading='true']"); + if (elementsToHideWhileLoading.length > 0) { + elementsToHideWhileLoading.forEach(function (element) { + element.style.display = showLoading ? "none" : "block"; + }); + } else { + searchResultsElements.style.display = showLoading ? "none" : "block"; + } + + var loadingElement = document.getElementById(SEARCHRESULTS_LOADING_INDICATOR); + loadingElement.style.display = showLoading ? "block" : "none"; + } + + } }()); \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.min.js b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.min.js index 9d9381996..94966c702 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.min.js +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Scripts/SearchResults/Search-results.min.js @@ -1,2 +1,2 @@ -window.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),document.addEventListener("DOMContentLoaded",function(){document.querySelectorAll(".userSortDropdown").forEach(function(r){r.addEventListener("change",function(){var e=function(e,r){var o=document.querySelector('[data-sf-role="searchResOrderBy"]');orderByValue=e||o.value;var a=document.querySelector('[data-sf-role="searchResLanguage"]'),t=r||a.value,n=orderByValue?"&orderBy="+orderByValue:"",u=t?"&language="+t:"",c=document.querySelector('[data-sf-role="searchResIndexCatalogue"]').value,d=document.querySelector('[data-sf-role="searchResQuery"]').value,l="?indexCatalogue="+c+"&searchQuery="+d+"&"+n+u,s=document.querySelector('[data-sf-role="scoringInfo"]').value,y=s?"&scoringInfo="+s:null;return y&&(l+=y),l}(r.value);window.location.search=e})})}); +!function(){var u="sf-search-result-container";window.NodeList&&!NodeList.prototype.forEach&&(NodeList.prototype.forEach=Array.prototype.forEach),document.addEventListener("DOMContentLoaded",function(){!function(){function n(){document.querySelectorAll(".userSortDropdown").forEach(function(t){t.addEventListener("change",function(){var e=function(e,t){var r=document.querySelector('[data-sf-role="searchResOrderBy"]');orderByValue=e||r.value;var o=document.querySelector('[data-sf-role="searchResLanguage"]'),a=t||o.value,n=orderByValue?"&orderBy="+orderByValue:"",l=a?"&language="+a:"",u="?indexCatalogue="+document.querySelector('[data-sf-role="searchResIndexCatalogue"]').value+"&searchQuery="+document.querySelector('[data-sf-role="searchResQuery"]').value+n+l,c=document.querySelector('[data-sf-role="scoringInfo"]').value,d=c?"&scoringInfo="+c:null;d&&(u+=d);var s=document.querySelector('[data-sf-role="filterParameter"]');if(s&&s.value){var i=s.value,f=i?"&filter="+i:null;f&&(u+=f)}var y=document.querySelector('[data-sf-role="resultsForAllSites"]');if(y){var v=y.value?"&resultsForAllSites="+y.value:null;v&&(u+=v)}return u}(t.value);window.location.search=e})})}function l(t){var e=document.getElementById(u),r=e.querySelectorAll("[data-sf-hide-while-loading='true']");0 + /// Label: Search facets + /// + /// Facets widget + [ResourceEntry("FacetsWidgetTitle", + Value = "Search facets", + Description = "Label: Search facets", + LastModified = "2022/07/11")] + public string FacetsWidgetTitle + { + get + { + return this["FacetsWidgetTitle"]; + } + } + + /// + /// Label: Lists with search facets + /// + /// Facets widget + [ResourceEntry("FacetsWidgDescription", + Value = "Lists with search facets", + Description = "Label: Lists with search facets", + LastModified = "2022/07/11")] + public string FacetsWidgDescription + { + get + { + return this["FacetsWidgDescription"]; + } + } + + /// + /// Label: Facets widget empty view text + /// + /// Select search facets + [ResourceEntry("FacetWidgetEmptyResult", + Value = "Select search facets", + Description = "Label: Select search facets", + LastModified = "2022/08/11")] + public string FacetWidgetEmptyResult + { + get + { + return this["FacetWidgetEmptyResult"]; + } + } + + /// + /// Phrase: This widget cannot be used with your current search service. Search facets works only with Azure Search and Elasticsearch services. + /// + /// Select search facets + [ResourceEntry("FacetsNotSupportedMessage", + Value = "This widget cannot be used with your current search service. Search facets works only with Azure Search and Elasticsearch services.", + Description = "Phrase: This widget cannot be used with your current search service. Search facets works only with Azure Search and Elasticsearch services.", + LastModified = "2022/08/12")] + public string FacetsNotSupportedMessage + { + get + { + return this["FacetsNotSupportedMessage"]; + } + } + + /// + /// Message shown when the search module is deactivated + /// + /// This widget doesn't work, because Search module has been deactivated. + [ResourceEntry("SearchModuleDeactivatedMessage", + Value = "This widget doesn't work, because Search module has been deactivated.", + Description = "Message shown when the search module is deactivated", + LastModified = "2015/06/17")] + public string SearchModuleDeactivatedMessage + { + get + { + return this["SearchModuleDeactivatedMessage"]; + } + + #endregion + } } } \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/Facets/Facets.cshtml b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/Facets/Facets.cshtml new file mode 100644 index 000000000..4c1acf0a1 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/Facets/Facets.cshtml @@ -0,0 +1,68 @@ +@model Telerik.Sitefinity.Frontend.Search.Mvc.Models.FacetsWidgetViewModel +@using System; +@using System.Globalization; +@using Telerik.Sitefinity; +@using Telerik.Sitefinity.Frontend.Mvc.Helpers; +@using Telerik.Sitefinity.Publishing.PublishingPoints; + +@{ + const int defaultFacetsCollapseCount = 10; +} + +
    + @if (ViewBag.HasAnyFacetElements) + { +

    @Model.FilterResultsLabel

    + + + + +
    +
    + } + +
    + @foreach (var facet in Model.SearchFacets) + { + var value = 0; + if (facet.FacetElements.Any()) + { +

    @facet.FacetTitle

    +
      + @foreach (var facetElement in facet.FacetElements) + { + string facetElementLabel = facetElement.FacetValue; + if (facetElement.FacetFieldType == SearchIndexAdditonalFieldType.DateAndTime) + { + DateTime facetDateValue = DateTime.Parse(facetElementLabel); + facetElementLabel = facetDateValue.ToSitefinityUITime().ToString("MMM dd, yyyy"); + } + + value++; + bool hideElement = (value > defaultFacetsCollapseCount) && Model.IsShowMoreLessButtonActive; +
    • + + + @if (Model.DisplayItemCount) + { + (@facetElement.FacetCount) + } +
    • + } + @if (facet.FacetElements.Count > defaultFacetsCollapseCount && Model.IsShowMoreLessButtonActive) + { + + } +
    + } + } +
    +
    + + + +@Html.Script(Url.WidgetContent("Mvc/Scripts/Facets/query-string-utils.js"), "bottom", throwException: false) +@Html.Script(Url.WidgetContent("Mvc/Scripts/Facets/facets-widget.js"), "bottom", throwException: false) diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchBox/SearchBox.cshtml b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchBox/SearchBox.cshtml index c60e472e1..16c1db165 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchBox/SearchBox.cshtml +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchBox/SearchBox.cshtml @@ -25,6 +25,7 @@ +
    @* Avoid conflicts because the designer is loading kendo too. *@ diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchResults/SearchResults.cshtml b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchResults/SearchResults.cshtml index de45bd23b..e317d988e 100644 --- a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchResults/SearchResults.cshtml +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/SearchResults/SearchResults.cshtml @@ -7,8 +7,9 @@ @using Telerik.Sitefinity.Libraries.Model; @using Telerik.Sitefinity.Services; @using Telerik.Sitefinity.Web +@using System.Collections.Generic; -
    +
    @if (@Model.Results.TotalCount > 0) { @@ -31,13 +32,13 @@ { - } + + + }
    @if (Model.Languages.Length > 1) @@ -154,7 +155,12 @@ + + +
    + @Html.Script(Url.WidgetContent("Mvc/Scripts/SearchResults/Search-results.js"), "bottom", throwException: false) \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/Properties/AssemblyInfo.cs b/Telerik.Sitefinity.Frontend.Search/Properties/AssemblyInfo.cs index ee52e421e0d12f37c4c6dbe5ca12b93c263b2136..64c84cfa12470b59a5931eb0536203ab26bd3799 100644 GIT binary patch delta 92 zcmaFH`HgGCGnUB81g48GHYvu g0NKSrl`!?`KplxdekMacP^S`uCPOR(F9R0?08ft;EC2ui delta 7 Ocmeyy^^9}FGZp|3e*=mD diff --git a/Telerik.Sitefinity.Frontend.Search/Services/FilterModel.cs b/Telerik.Sitefinity.Frontend.Search/Services/FilterModel.cs new file mode 100644 index 000000000..9fb8b4e6f --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Services/FilterModel.cs @@ -0,0 +1,9 @@ +namespace Telerik.Sitefinity.Frontend.Search.Services +{ + internal class FilterModel + { + public string FieldName { get; set; } + + public string[] FilterValues { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Services/FilterParameter.cs b/Telerik.Sitefinity.Frontend.Search/Services/FilterParameter.cs new file mode 100644 index 000000000..76f8c9e55 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Services/FilterParameter.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace Telerik.Sitefinity.Frontend.Search.Services +{ + internal class FilterParameter + { + public FilterParameter() + { + this.AppliedFilters = new List(); + } + + public List AppliedFilters { get; set; } + + public bool IsDeselected { get; set; } + + public string LastSelectedFilterGropName { get; set; } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Services/SearchFacetsQueryStringProcessor.cs b/Telerik.Sitefinity.Frontend.Search/Services/SearchFacetsQueryStringProcessor.cs new file mode 100644 index 000000000..5d64f2f1d --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/Services/SearchFacetsQueryStringProcessor.cs @@ -0,0 +1,298 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Web; +using Telerik.Sitefinity.Abstractions; +using Telerik.Sitefinity.Configuration; +using Telerik.Sitefinity.Frontend.Search.Mvc.Models; +using Telerik.Sitefinity.Publishing; +using Telerik.Sitefinity.Publishing.Configuration; +using Telerik.Sitefinity.Publishing.Model; +using Telerik.Sitefinity.Publishing.NewImplementation; +using Telerik.Sitefinity.Publishing.PublishingPoints; +using Telerik.Sitefinity.Search; +using Telerik.Sitefinity.Search.Impl; +using Telerik.Sitefinity.Services; +using Telerik.Sitefinity.Services.Search; +using Telerik.Sitefinity.Services.Search.Configuration; +using Telerik.Sitefinity.Services.Search.Data; + +namespace Telerik.Sitefinity.Frontend.Search.Services +{ + internal class SearchFacetsQueryStringProcessor + { + internal IDictionary> GetFacets(string query, string language, string filterParameters, string indexCatalogName, List selectedFacetableFieldNames, string[] searchableFields, bool? resultsForAllSites = null) + { + IDictionary> facetResult = new Dictionary>(); + + if (!selectedFacetableFieldNames.Any()) + { + return facetResult; + } + + List currentFilter = new List(); + FilterParameter filterParameter = new FilterParameter(); + if (!string.IsNullOrEmpty(filterParameters)) + { + filterParameter = JsonConvert.DeserializeObject(filterParameters); + currentFilter = filterParameter.AppliedFilters; + } + + IResultSet searchResultsForTheNewFilter = this.GetFacetsInternal(query, language, currentFilter, indexCatalogName, selectedFacetableFieldNames, searchableFields, resultsForAllSites); + facetResult = searchResultsForTheNewFilter.Facets; + + if (currentFilter.Any() && !filterParameter.IsDeselected && !string.IsNullOrEmpty(filterParameter.LastSelectedFilterGropName)) + { + // Don't recalculate the last selected selected group in order to enable multiple selection (OR case) + List previoustFilterModel = currentFilter.Select(x => x).ToList(); + var itemToRemove = previoustFilterModel.FirstOrDefault(e => e.FieldName == filterParameter.LastSelectedFilterGropName); + if (itemToRemove != null) + { + previoustFilterModel.Remove(itemToRemove); + } + + IResultSet previousSearchResults = this.GetFacetsInternal(query, language, previoustFilterModel, indexCatalogName, selectedFacetableFieldNames, searchableFields, resultsForAllSites); + var previousSearchResultsFacets = previousSearchResults.Facets; + var facetsFromPrivousSearchToInclude = previousSearchResultsFacets[filterParameter.LastSelectedFilterGropName]; + facetResult[filterParameter.LastSelectedFilterGropName] = facetsFromPrivousSearchToInclude; + } + + if (currentFilter.Any()) + { + this.SetSelectedMissingFiltersToResult(currentFilter, facetResult); + } + + return facetResult; + } + + internal ISearchFilter BuildFacetFilter(string filterQueryString, string indexCatalogue) + { + if (string.IsNullOrEmpty(filterQueryString)) + { + throw new ArgumentException(nameof(filterQueryString)); + } + + var filterParameter = JsonConvert.DeserializeObject(filterQueryString); + return this.BuildFacetFilterInternal(filterParameter.AppliedFilters, indexCatalogue); + } + + internal IDictionary GetFacetableFields(string indexCatalogName) + { + if (string.IsNullOrEmpty(indexCatalogName)) + { + throw new ArgumentNullException(nameof(indexCatalogName)); + } + + IEnumerable additionalProps = new List(); + PublishingManager publishingManger = PublishingManager.GetManager(PublishingConfig.SearchProviderName); + + var a = publishingManger.GetPublishingPoints().Where(p => p.Name == indexCatalogName).FirstOrDefault(); + SearchIndexPipeSettings pipeSettings = publishingManger + .GetPipeSettings() + .Where(ps => ps.CatalogName == indexCatalogName) + .FirstOrDefault(); + + if (pipeSettings != null) + { + additionalProps = PublishingUtilities.SearchIndexAdditionalFields(pipeSettings); + } + + if (additionalProps != null && additionalProps.Any()) + { + return additionalProps + .Where(f => f.IsFacetable) + .ToDictionary(x => x.FieldName, v => new FacetableFieldSettings() + { + FieldType = v.FieldType, + FieldName = v.FieldName, + FieldTitle = v.FieldTitle + }); + } + + return new Dictionary(); + } + + /// + /// If the current facets don't have some of the currenlty selected, add them with count 0 + /// + /// The currenlty applied filters + /// The facet result + private void SetSelectedMissingFiltersToResult(List currentFilters, IDictionary> facetResult) + { + foreach (var facetGroup in facetResult) + { + var currentFilter = currentFilters.FirstOrDefault(f => f.FieldName == facetGroup.Key); + if (currentFilter != null) + { + var filterValues = facetGroup.Value.Select(x => x.FacetValue); + var missingValues = currentFilter.FilterValues + .Select(HttpUtility.UrlDecode) + .Except(filterValues, StringComparer.OrdinalIgnoreCase); + + foreach (var item in missingValues) + { + facetGroup.Value.Add(new FacetResponse() { FacetValue = item, Count = 0 }); + } + } + } + } + + private ISearchFilter BuildFacetFilterInternal(List filterModel, string indexCatalogue) + { + ISearchFilter facetFilter = ObjectFactory.Resolve(); + var filtersByCategory = new List(); + var facetableFieldsForIndex = this.GetFacetableFields(indexCatalogue); + + foreach (var filter in filterModel) + { + string decodedFieldName = HttpUtility.UrlDecode(filter.FieldName); + + FacetableFieldSettings facetableFieldSetting = this.GetFacetableFieldsettings(facetableFieldsForIndex, decodedFieldName); + var filterOperator = this.GetFacetFilterSettings(facetableFieldSetting.FieldType); + var searchClauses = filter.FilterValues.Select(filterValue => new SearchFilterClause(decodedFieldName, this.GetFieldValue(HttpUtility.UrlDecode(filterValue), facetableFieldSetting.FieldType), filterOperator)); + ISearchFilter currentFilter = ObjectFactory.Resolve(); + currentFilter.Clauses = searchClauses; + currentFilter.Operator = QueryOperator.Or; + filtersByCategory.Add(currentFilter); + } + + facetFilter.Groups = filtersByCategory; + facetFilter.Operator = QueryOperator.And; + + return facetFilter; + } + + private IResultSet GetFacetsInternal(string query, string language, List filterModel, string indexCatalogName, List facetableFields, string[] searchableFields, bool? resultsForAllSites) + { + var service = ServiceBus.ResolveService(); + var queryBuilder = ObjectFactory.Resolve(); + var config = Config.Get(); + var enableExactMatch = config.EnableExactMatch; + + ISearchQuery searchQuery = queryBuilder.BuildQuery(query, searchableFields, language, resultsForAllSites); + searchQuery.IndexName = indexCatalogName; + searchQuery.Facets = facetableFields; + searchQuery.EnableExactMatch = enableExactMatch; + + if (filterModel != null && filterModel.Any()) + { + ISearchFilter filter = this.ConstructFilterObject(filterModel, indexCatalogName, searchQuery); + searchQuery.Filter = filter; + } + + var searchOptions = new SearchOptions(SearchType.StartsWith); + IResultSet result = service.Search(searchQuery, searchOptions); + return result; + } + + private ISearchFilter ConstructFilterObject(List filterModel, string indexName, ISearchQuery searchQuery) + { + var filterGroups = this.GetFilterGroups(searchQuery); + var facetFilters = this.BuildFacetFilterInternal(filterModel, indexName); + filterGroups.Add(facetFilters); + + ISearchFilter filter = ObjectFactory.Resolve(); + filter.Operator = QueryOperator.And; + filter.Groups = filterGroups; + return filter; + } + + private IList GetFilterGroups(ISearchQuery searchQuery) + { + if (searchQuery != null && searchQuery.Filter != null && searchQuery.Filter.Groups != null) + { + return searchQuery.Filter.Groups.ToList(); + } + + return new List(); + } + + private FilterOperator GetFacetFilterSettings(SearchIndexAdditonalFieldType fieldType) + { + FilterOperator filterOperator = this.GetFilterOperator(fieldType); + + return filterOperator; + } + + private FacetableFieldSettings GetFacetableFieldsettings(IDictionary facetableFieldsSettings, string fieldName) + { + if (!facetableFieldsSettings.ContainsKey(fieldName)) + { + throw new KeyNotFoundException("No such facetable field found"); + } + + var facetableFieldSetting = facetableFieldsSettings[fieldName]; + return facetableFieldSetting; + } + + // The ISearchFilter needs the value object needs to be the correct type e.g. the value is suppose to be a number we need to pass it as number, not a string + private object GetFieldValue(object value, SearchIndexAdditonalFieldType fieldType) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (fieldType == SearchIndexAdditonalFieldType.NumberWhole) + { + long valueLong; + if (long.TryParse(value.ToString(), out valueLong)) + { + return valueLong; + } + } + + if (fieldType == SearchIndexAdditonalFieldType.YesNo) + { + bool valueBool; + if (bool.TryParse(value.ToString(), out valueBool)) + { + return valueBool; + } + } + + if (fieldType == SearchIndexAdditonalFieldType.NumberDecimal) + { + decimal decimalValue; + string formatedValueAsString = value.ToString().Replace(',', '.'); + if (decimal.TryParse(formatedValueAsString, NumberStyles.Any, CultureInfo.InvariantCulture, out decimalValue)) + { + return decimalValue; + } + } + + if (fieldType == SearchIndexAdditonalFieldType.DateAndTime) + { + + DateTime dateTimevalue; + if (DateTime.TryParse(value.ToString(), out dateTimevalue)) + { + return dateTimevalue; + } + } + + return value.ToString(); + } + + private FilterOperator GetFilterOperator(SearchIndexAdditonalFieldType fieltType) + { + switch (fieltType) + { + case SearchIndexAdditonalFieldType.ShortText: + case SearchIndexAdditonalFieldType.LongText: + case SearchIndexAdditonalFieldType.DateAndTime: + case SearchIndexAdditonalFieldType.YesNo: + case SearchIndexAdditonalFieldType.NumberDecimal: + case SearchIndexAdditonalFieldType.NumberWhole: + return FilterOperator.Equals; + case SearchIndexAdditonalFieldType.Classification: + case SearchIndexAdditonalFieldType.Choices: + return FilterOperator.Contains; + default: + return FilterOperator.Equals; + } + } + } +} diff --git a/Telerik.Sitefinity.Frontend.Search/Telerik.Sitefinity.Frontend.Search.csproj b/Telerik.Sitefinity.Frontend.Search/Telerik.Sitefinity.Frontend.Search.csproj index c545503bb..a34f49787 100644 --- a/Telerik.Sitefinity.Frontend.Search/Telerik.Sitefinity.Frontend.Search.csproj +++ b/Telerik.Sitefinity.Frontend.Search/Telerik.Sitefinity.Frontend.Search.csproj @@ -45,22 +45,42 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll True False + + ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + False ..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll + + ..\packages\Progress.Sitefinity.Renderer.14.3.8000.269\lib\netstandard2.0\Progress.Sitefinity.Renderer.dll + ..\packages\Sitefinity.RazorEngine.3.0.8.0\lib\net40\RazorEngine.dll True False + + ..\packages\System.ComponentModel.Annotations.5.0.0\lib\net461\System.ComponentModel.Annotations.dll + + @@ -107,18 +127,27 @@ Properties\SharedAssemblyInfo.cs + + + + + + + + + @@ -129,11 +158,12 @@ - - PublicKey.snk - + + + + Designer @@ -159,50 +189,55 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Personalization.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Personalization.dll True - ..\packages\Telerik.Sitefinity.ServicesImpl.14.2.7900\lib\net48\Telerik.Sitefinity.Search.Impl.dll + ..\packages\Telerik.Sitefinity.ServicesImpl.14.3.8000\lib\net48\Telerik.Sitefinity.Search.Impl.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Search.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Search.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True + + + + + + + + + + - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - @@ -213,4 +248,5 @@ --> + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/app.config b/Telerik.Sitefinity.Frontend.Search/app.config new file mode 100644 index 000000000..489867c14 --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Search/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Search/packages.config b/Telerik.Sitefinity.Frontend.Search/packages.config index 7476149c5..29e9a9541 100644 --- a/Telerik.Sitefinity.Frontend.Search/packages.config +++ b/Telerik.Sitefinity.Frontend.Search/packages.config @@ -4,13 +4,16 @@ + + + - - - - - + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Taxonomies/Mvc/Views/web.config b/Telerik.Sitefinity.Frontend.Taxonomies/Mvc/Views/web.config new file mode 100644 index 000000000..8df05b10e --- /dev/null +++ b/Telerik.Sitefinity.Frontend.Taxonomies/Mvc/Views/web.config @@ -0,0 +1,442 @@ + + + + +
    +
    + +
    + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Telerik.Sitefinity.Frontend.Taxonomies/Telerik.Sitefinity.Frontend.Taxonomies.csproj b/Telerik.Sitefinity.Frontend.Taxonomies/Telerik.Sitefinity.Frontend.Taxonomies.csproj index 3e61b2492..a6677dfca 100644 --- a/Telerik.Sitefinity.Frontend.Taxonomies/Telerik.Sitefinity.Frontend.Taxonomies.csproj +++ b/Telerik.Sitefinity.Frontend.Taxonomies/Telerik.Sitefinity.Frontend.Taxonomies.csproj @@ -45,6 +45,16 @@ true + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + false + ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -61,7 +71,7 @@ False - ..\packages\ServiceStack.Text.6.0.2\lib\net472\ServiceStack.Text.dll + ..\packages\ServiceStack.Text.6.1.0\lib\net472\ServiceStack.Text.dll @@ -76,8 +86,8 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll @@ -155,9 +165,6 @@ - - PublicKey.snk - Designer @@ -167,38 +174,33 @@ - ..\packages\Telerik.Sitefinity.Content.14.2.7900\lib\net48\Telerik.Sitefinity.ContentModules.dll + ..\packages\Telerik.Sitefinity.Content.14.3.8000\lib\net48\Telerik.Sitefinity.ContentModules.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Model.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Model.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.dll True - ..\packages\Telerik.Sitefinity.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Utilities.dll + ..\packages\Telerik.Sitefinity.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Utilities.dll True - ..\packages\Telerik.Sitefinity.Feather.Core.14.2.7900\lib\net48\Telerik.Sitefinity.Frontend.dll + ..\packages\Telerik.Sitefinity.Feather.Core.14.3.8000\lib\net48\Telerik.Sitefinity.Frontend.dll True - ..\packages\Telerik.Sitefinity.Mvc.14.2.7900\lib\net48\Telerik.Sitefinity.Mvc.dll + ..\packages\Telerik.Sitefinity.Mvc.14.3.8000\lib\net48\Telerik.Sitefinity.Mvc.dll True - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - diff --git a/Telerik.Sitefinity.Frontend.Taxonomies/packages.config b/Telerik.Sitefinity.Frontend.Taxonomies/packages.config index 5477ebc46..c0f308f00 100644 --- a/Telerik.Sitefinity.Frontend.Taxonomies/packages.config +++ b/Telerik.Sitefinity.Frontend.Taxonomies/packages.config @@ -6,15 +6,15 @@ - + - + - - - - + + + + \ No newline at end of file