diff --git a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs index 5ce682812..187970ec8 100644 --- a/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Modules/Controllers/AdminController.cs @@ -75,9 +75,10 @@ namespace Orchard.Modules.Controllers { int totalItemCount = modules.Count(); if (pager.PageSize != 0) { - modules = modules.Skip((pager.Page - 1) * pager.PageSize).Take(pager.PageSize).ToList(); + modules = modules.Skip((pager.Page - 1) * pager.PageSize).Take(pager.PageSize); } + modules = modules.ToList(); foreach (ModuleEntry moduleEntry in modules) { moduleEntry.IsRecentlyInstalled = _moduleService.IsRecentlyInstalled(moduleEntry.Descriptor); diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs index 5624d6c7c..2fa0b29a1 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/GalleryController.cs @@ -8,6 +8,8 @@ using Orchard.Environment.Configuration; using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; using Orchard.Localization; +using Orchard.Packaging.Events; +using Orchard.Packaging.Extensions; using Orchard.Packaging.Models; using Orchard.Packaging.Services; using Orchard.Packaging.ViewModels; @@ -18,7 +20,6 @@ using Orchard.UI.Navigation; using Orchard.UI.Notify; using Orchard.Utility.Extensions; using ILogger = Orchard.Logging.ILogger; -using IPackageManager = Orchard.Packaging.Services.IPackageManager; using NullLogger = Orchard.Logging.NullLogger; namespace Orchard.Packaging.Controllers { @@ -27,15 +28,20 @@ namespace Orchard.Packaging.Controllers { public class GalleryController : Controller { private readonly ShellSettings _shellSettings; private readonly IPackagingSourceManager _packagingSourceManager; + private readonly IExtensionDisplayEventHandler _extensionDisplayEventHandler; + private readonly IExtensionManager _extensionManager; public GalleryController( + IEnumerable extensionDisplayEventHandlers, ShellSettings shellSettings, - IPackageManager packageManager, IPackagingSourceManager packagingSourceManager, + IExtensionManager extensionManager, IOrchardServices services) { _shellSettings = shellSettings; _packagingSourceManager = packagingSourceManager; + _extensionDisplayEventHandler = extensionDisplayEventHandlers.FirstOrDefault(); + _extensionManager = extensionManager; Services = services; T = NullLocalizer.Instance; @@ -218,6 +224,23 @@ namespace Orchard.Packaging.Controllers { routeData.Values.Add("Options.SourceId", options.SourceId); pagerShape.RouteData(routeData); + extensions = extensions.ToList(); + + // Populate the notifications + IEnumerable> extensionDescriptors = _extensionManager.AvailableExtensions() + .Join(extensions, extensionDescriptor => extensionDescriptor.Id, packaginEntry => packaginEntry.ExtensionId(), + (extensionDescriptor, packagingEntry) => new Tuple(extensionDescriptor, packagingEntry)); + + foreach (Tuple packagings in extensionDescriptors) { + packagings.Item2.Installed = true; + + if (_extensionDisplayEventHandler != null) { + foreach (string notification in _extensionDisplayEventHandler.Displaying(packagings.Item1)) { + packagings.Item2.Notifications.Add(notification); + } + } + } + return View(packageType == DefaultExtensionTypes.Theme ? "Themes" : "Modules", new PackagingExtensionsViewModel { Extensions = extensions, Sources = _packagingSourceManager.GetSources().OrderBy(s => s.FeedTitle), diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs index ac92b210d..a438f58ef 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Controllers/PackagingServicesController.cs @@ -7,13 +7,11 @@ using System.Web.Hosting; using System.Web.Mvc; using NuGet; using Orchard.Environment.Configuration; -using Orchard.Environment.Extensions; using Orchard.Environment.Extensions.Models; using Orchard.FileSystems.AppData; using Orchard.Localization; using Orchard.Modules.Services; using Orchard.Mvc.Extensions; -using Orchard.Packaging.Models; using Orchard.Packaging.Services; using Orchard.Packaging.ViewModels; using Orchard.Recipes.Models; diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs new file mode 100644 index 000000000..33aebcfff --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Extensions/PackageExtensions.cs @@ -0,0 +1,45 @@ +using NuGet; +using Orchard.Environment.Extensions.Models; +using Orchard.Packaging.Models; + +namespace Orchard.Packaging.Extensions { + public static class PackageExtensions { + public static bool IsTheme(this IPackage package) { + return IsTheme(package.Id); + } + + public static bool IsTheme(this PackagingEntry packagingEntry) { + return IsTheme(packagingEntry.PackageId); + } + + public static string ExtensionFolder(this IPackage package) { + return ExtensionFolder(package.IsTheme()); + } + + public static string ExtensionFolder(this PackagingEntry packagingEntry) { + return ExtensionFolder(packagingEntry.IsTheme()); + } + + public static string ExtensionId(this IPackage package) { + return ExtensionId(package.IsTheme(), package.Id); + } + + public static string ExtensionId(this PackagingEntry packagingEntry) { + return ExtensionId(packagingEntry.IsTheme(), packagingEntry.PackageId); + } + + private static bool IsTheme(string packageId) { + return packageId.StartsWith(Services.PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme)); + } + + private static string ExtensionFolder(bool isTheme) { + return isTheme ? "Themes" : "Modules"; + } + + private static string ExtensionId(bool isTheme, string packageId) { + return isTheme ? + packageId.Substring(Services.PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Theme).Length) : + packageId.Substring(Services.PackagingSourceManager.GetExtensionPrefix(DefaultExtensionTypes.Module).Length); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingEntry.cs b/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingEntry.cs index 0b86a30ec..5ae15f123 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingEntry.cs +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Models/PackagingEntry.cs @@ -1,7 +1,12 @@ using System; +using System.Collections.Generic; namespace Orchard.Packaging.Models { public class PackagingEntry { + public PackagingEntry() { + Notifications = new List(); + } + public PackagingSource Source { get; set; } public string Title { get; set; } public string PackageId { get; set; } @@ -17,5 +22,16 @@ namespace Orchard.Packaging.Models { public double Rating { get; set; } public int RatingsCount { get; set; } public int DownloadCount { get; set; } + + /// + /// List of package notifications. + /// + public List Notifications { get; set; } + + /// + /// Boolean value indicating if any version of the same + /// module has been previously installed. + /// + public bool Installed { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj index a61c916a2..f4dfb8e72 100644 --- a/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj +++ b/src/Orchard.Web/Modules/Orchard.Packaging/Orchard.Packaging.csproj @@ -67,6 +67,7 @@ + @@ -169,6 +170,7 @@ +