diff --git a/Nop.Plugin.Misc.AuctionPlugin/Controllers/AnnouncementController.cs b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs similarity index 82% rename from Nop.Plugin.Misc.AuctionPlugin/Controllers/AnnouncementController.cs rename to Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs index f670d8f..1c18d03 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Controllers/AnnouncementController.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AnnouncementController.cs @@ -1,20 +1,23 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.SignalR; +using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models; using Nop.Plugin.Misc.AuctionPlugin.Domains; using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities; using Nop.Plugin.Misc.AuctionPlugin.Hubs; -using Nop.Plugin.Misc.AuctionPlugin.Models; using Nop.Plugin.Misc.AuctionPlugin.Services; -using Nop.Web.Areas.Admin.Controllers; -//using Nop.Web.Framework.Kendoui; +using Nop.Web.Framework; +using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc; +using Nop.Web.Framework.Mvc.Filters; using System; using System.Linq; -namespace Nop.Plugin.Misc.AuctionPlugin.Controllers +namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers { - - public class LiveAnnouncementController : BaseAdminController + [AutoValidateAntiforgeryToken] + [AuthorizeAdmin] + [Area(AreaNames.ADMIN)] + public class AnnouncementController : BasePluginController { #region Field @@ -26,7 +29,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Controllers #region Ctr - public LiveAnnouncementController( + public AnnouncementController( IAnnouncementService announcementService, IHubContext announcementHubContext) { @@ -41,7 +44,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Controllers public IActionResult GetAnnouncementViewModel() { var model = new AnnouncementViewModel(); - return View("~/Plugins/Misc.AuctionPlugin/Admin/Views/Announcement.cshtml", model); + return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/Announcement.cshtml", model); } [HttpPost] @@ -74,7 +77,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Controllers if (model.IsActive == true) { - _announcementHubContext.Clients.All.SendAsync("send", model.Body.ToString()); + await _announcementHubContext.Clients.All.SendAsync("send", model.Body.ToString()); } return RedirectToAction("AnnouncementList"); @@ -104,7 +107,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Controllers public IActionResult AnnouncementList() { var model = new AnnouncementViewModel(); - return View("~/Plugins/Widget.LiveAnnouncement/Views/LiveAnnouncementView/AnnouncementList.cshtml", model); + return View("~/Plugins/Misc.Auction/Areas/Admin/Views/AnnouncementList.cshtml", model); } //[HttpPost] diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AuctionPluginAdminController.cs b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AuctionPluginAdminController.cs index 87f6196..14a0b1c 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AuctionPluginAdminController.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Controllers/AuctionPluginAdminController.cs @@ -2,8 +2,14 @@ using Nop.Web.Framework.Controllers; using Nop.Web.Framework.Mvc.Filters; using Nop.Web.Framework; -using Nop.Plugin.Misc.AuctionPlugin.Services; -using Nop.Plugin.Misc.AuctionPlugin.Models; +using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models; +using Nop.Services.Configuration; +using Nop.Plugin.Misc.AuctionPlugin; +using Nop.Services.Messages; +using Nop.Services.Localization; +using Nop.Services.Logging; + +namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers; [AutoValidateAntiforgeryToken] [AuthorizeAdmin] @@ -11,16 +17,53 @@ using Nop.Plugin.Misc.AuctionPlugin.Models; public class AuctionPluginAdminController : BasePluginController { //private readonly SignalRservice _signalRservice; + private readonly ILocalizationService _localizationService; + private readonly INotificationService _notificationService; + private readonly ISettingService _settingService; + private readonly AuctionSettings _auctionSettings; + private readonly ILogger _logger; //public AuctionPluginAdminController(SignalRservice signalRservice) - public AuctionPluginAdminController() + public AuctionPluginAdminController(ILocalizationService localizationService, INotificationService notificationService, ISettingService settingService, AuctionSettings auctionSettings, ILogger logger) { + _localizationService = localizationService; + _notificationService = notificationService; + _settingService = settingService; + _auctionSettings = auctionSettings; //_signalRservice = signalRservice; + _logger = logger; } public async Task Configure(bool showtour = false) { - return View("~/Plugins/Misc.AuctionPlugin/Views/Configure.cshtml", new ConfigurationModel()); + return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/Configure.cshtml", new ConfigurationModel()); + } + + [HttpPost, ActionName("Configure")] + [FormValueRequired("save")] + public async Task Configure(ConfigurationModel model) + { + if (!ModelState.IsValid) + { + + await _logger.ErrorAsync($"Auction configuration model error: invalid modelstate!"); + return await Configure(); + + } + + if (_auctionSettings.SomeText != model.Test) + { + _auctionSettings.SomeText = model.Test; + await _logger.InformationAsync($"Auction configuration saving: {_auctionSettings.SomeText}"); + + } + + await _settingService.SaveSettingAsync(_auctionSettings); + await _logger.InformationAsync($"Auction configuration saved: {_auctionSettings.SomeText}"); + //_notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.Plugins.Saved")); + _notificationService.SuccessNotification("Saved"); + + return await Configure(); } //[HttpPost] diff --git a/Nop.Plugin.Misc.AuctionPlugin/Models/AnnouncementViewModel.cs b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/AnnouncementViewModel.cs similarity index 85% rename from Nop.Plugin.Misc.AuctionPlugin/Models/AnnouncementViewModel.cs rename to Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/AnnouncementViewModel.cs index edbea7e..e4d52dc 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Models/AnnouncementViewModel.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/AnnouncementViewModel.cs @@ -1,7 +1,7 @@ using Nop.Web.Framework.Models; using Nop.Web.Framework.Mvc.ModelBinding; -namespace Nop.Plugin.Misc.AuctionPlugin.Models +namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models { public record AnnouncementViewModel : BaseNopModel { diff --git a/Nop.Plugin.Misc.AuctionPlugin/Models/ConfigurationModel.cs b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/ConfigurationModel.cs similarity index 70% rename from Nop.Plugin.Misc.AuctionPlugin/Models/ConfigurationModel.cs rename to Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/ConfigurationModel.cs index 1e3f172..a19ca91 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Models/ConfigurationModel.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Models/ConfigurationModel.cs @@ -1,9 +1,8 @@ using System.ComponentModel.DataAnnotations; using Nop.Web.Framework.Models; -using Nop.Web.Framework.Mvc; -using Nop.Web.Framework.Mvc.ModelBinding; -namespace Nop.Plugin.Misc.AuctionPlugin.Models; + +namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models; /// /// Represents a configuration model @@ -14,7 +13,7 @@ public record ConfigurationModel : BaseNopModel public ConfigurationModel() { - Test = ""; + Test = ""; } #endregion diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Announcement.cshtml b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Announcement.cshtml index 20785fe..d6fbf17 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Announcement.cshtml +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Announcement.cshtml @@ -1,4 +1,4 @@ -@model Nop.Plugin.Misc.AuctionPlugin.Models.AnnouncementViewModel +@model AnnouncementViewModel @using Nop.Core.Infrastructure @using Nop.Web.Framework diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/AnnouncementList.cshtml b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/AnnouncementList.cshtml index cfb90d7..d3a5b24 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/AnnouncementList.cshtml +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/AnnouncementList.cshtml @@ -1,4 +1,4 @@ -@model Nop.Plugin.Widget.LiveAnnouncement.Models.AnnouncementModel +@model AnnouncementViewModel @using Nop.Core.Infrastructure @using Nop.Web.Framework diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Configure.cshtml b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Configure.cshtml index a2a2e7c..a318ce2 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Configure.cshtml +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/Configure.cshtml @@ -5,7 +5,7 @@ NopHtml.SetActiveMenuItemSystemName("API plugins"); } -
+
@@ -35,9 +35,19 @@
+
+
+ +
+
+ + +
+
+
- +
@@ -81,29 +91,6 @@ } }); - - - - // // Send AJAX request to TestHubConnection action - // fetch('@Url.Action("TestHubConnection", "SignalRApi")', { - // method: 'POST', - // headers: { - // 'Content-Type': 'application/json', - // 'RequestVerificationToken': 'addAntiForgeryToken(postData);' - // } - // }) - // .then(response => response.json()) - // .then(data => { - // // Update the result based on response - // if (data.success) { - // document.getElementById("test-hub-result").innerText = data.message; - // } else { - // document.getElementById("test-hub-result").innerText = data.message; - // } - // }) - // .catch(error => { - // document.getElementById("test-hub-result").innerText = "Error: " + error; - // }); }); diff --git a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/_ViewImports.cshtml b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/_ViewImports.cshtml index 0632048..65e616a 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/_ViewImports.cshtml +++ b/Nop.Plugin.Misc.AuctionPlugin/Areas/Admin/Views/_ViewImports.cshtml @@ -2,10 +2,14 @@ @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers @addTagHelper *, Nop.Web.Framework +@inject INopHtmlHelper NopHtml + @using Microsoft.AspNetCore.Mvc.ViewFeatures @using Nop.Web.Framework.UI @using Nop.Web.Framework.Extensions @using System.Text.Encodings.Web @using Nop.Services.Events @using Nop.Web.Framework.Events -@using Nop.Core.Infrastructure \ No newline at end of file +@using Nop.Core.Infrastructure +@using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models; +@using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers; \ No newline at end of file diff --git a/Nop.Plugin.Misc.AuctionPlugin/AuctionDefaults.cs b/Nop.Plugin.Misc.AuctionPlugin/AuctionDefaults.cs index 0075c7c..c6ef71c 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/AuctionDefaults.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/AuctionDefaults.cs @@ -26,6 +26,7 @@ public static class AuctionDefaults /// Gets the hub route name ///
public static string AnnouncementRouteName => "Plugin.Misc.AuctionPlugin.Announcement"; + public static string AnnouncementListRouteName => "Plugin.Misc.AuctionPlugin.AnnouncementList"; /// /// Gets the name of autosuggest component diff --git a/Nop.Plugin.Misc.AuctionPlugin/AuctionPlugin.cs b/Nop.Plugin.Misc.AuctionPlugin/AuctionPlugin.cs index 327b160..438ed17 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/AuctionPlugin.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/AuctionPlugin.cs @@ -58,7 +58,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin public override string GetConfigurationPageUrl() { - return _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext).RouteUrl("Plugin.Misc.SignalRApi.Configure"); + return _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext).RouteUrl(AuctionDefaults.ConfigurationRouteName); } public override async Task InstallAsync() @@ -140,12 +140,21 @@ namespace Nop.Plugin.Misc.AuctionPlugin rootNode.ChildNodes.Add(liveAnnouncementPluginNode); } + liveAnnouncementPluginNode.ChildNodes.Add(new SiteMapNode() + { + Title = await _localizationService.GetResourceAsync("Plugins.Configure"), + Visible = true, + IconClass = "fa-dot-circle-o", + Url = "~/Admin/AuctionPlugin/Configure" + + }); + liveAnnouncementPluginNode.ChildNodes.Add(new SiteMapNode() { Title = await _localizationService.GetResourceAsync("Misc.Announcement"), Visible = true, IconClass = "fa-dot-circle-o", - Url = "~/Admin/Announcement" + Url = "~/Admin/Announcement/GetAnnouncementViewModel" }); @@ -156,7 +165,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin Title = await _localizationService.GetResourceAsync("Misc.AnnouncementList"), Visible = true, IconClass = "fa-dot-circle-o", - Url = "~/Admin/LiveAnnouncement/AnnouncementList" + Url = "~/Admin/Announcement/AnnouncementList" }); } } diff --git a/Nop.Plugin.Misc.AuctionPlugin/Domains/Entities/Announcement.cs b/Nop.Plugin.Misc.AuctionPlugin/Domains/Entities/Announcement.cs index 9d87d9f..3e3ec28 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Domains/Entities/Announcement.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Domains/Entities/Announcement.cs @@ -9,11 +9,8 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Domains.Entities { public string Name { get; set; } - - public string Body { get; set; } - public bool IsActive { get; set; } - + public string Body { get; set; } public DateTime Created { get; set; } } diff --git a/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/PluginNopStartup.cs index 8e8a36f..73564b9 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/PluginNopStartup.cs @@ -1,16 +1,24 @@ using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Razor; +using Microsoft.AspNetCore.Mvc.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Nop.Core; +using Nop.Core.Caching; using Nop.Core.Infrastructure; +using Nop.Data; using Nop.Plugin.Misc.AuctionPlugin.Hubs; using Nop.Plugin.Misc.AuctionPlugin.Services; +using Nop.Services.Catalog; +using Nop.Services.Configuration; +using Nop.Services.Localization; +using Nop.Web.Framework; namespace Nop.Plugin.Misc.AuctionPlugin.Infrastructure { public class PluginNopStartup : INopStartup { - public int Order => 999; /// /// Add and configure any of the middleware @@ -30,9 +38,19 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Infrastructure }); //register services and interfaces + //IRepository _customerBidRepository; + //protected readonly IShortTermCacheManager _shortTermCacheManager; + // protected readonly IStaticCacheManager _staticCacheManager; + + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); } /// diff --git a/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/RouteProvider.cs b/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/RouteProvider.cs index a436fb5..1b72eb8 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/RouteProvider.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Infrastructure/RouteProvider.cs @@ -23,8 +23,12 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Infrastructure //announcement admin endpointRouteBuilder.MapControllerRoute(name: AuctionDefaults.AnnouncementRouteName, - pattern: "Admin/AuctionPluginAdmin/Announcement", - defaults: new { controller = "Announcement", action = "Announcement", area = AreaNames.ADMIN }); + pattern: "Admin/Announcement/GetAnnouncementViewModel", + defaults: new { controller = "Announcement", action = "GetAnnouncementViewModel" }); + + endpointRouteBuilder.MapControllerRoute(name: AuctionDefaults.AnnouncementListRouteName, + pattern: "Admin/Announcement/AnnouncementList", + defaults: new { controller = "Announcement", action = "AnnouncementList"}); } /// diff --git a/Nop.Plugin.Misc.AuctionPlugin/Mapping/Builders/AnnouncementBuilder.cs b/Nop.Plugin.Misc.AuctionPlugin/Mapping/Builders/AnnouncementBuilder.cs index 32fddd8..e1b6ddc 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Mapping/Builders/AnnouncementBuilder.cs +++ b/Nop.Plugin.Misc.AuctionPlugin/Mapping/Builders/AnnouncementBuilder.cs @@ -24,7 +24,7 @@ public class AnnouncementBuilder : NopEntityBuilder .NotNullable() .WithColumn(nameof(Announcement.IsActive)) .AsBoolean() - .NotNullable().WithDefault(0) + .NotNullable() .WithColumn(nameof(Announcement.Body)) .AsString(500) .NotNullable() diff --git a/Nop.Plugin.Misc.AuctionPlugin/Nop.Plugin.Misc.AuctionPlugin.csproj b/Nop.Plugin.Misc.AuctionPlugin/Nop.Plugin.Misc.AuctionPlugin.csproj index 5684121..bd40a99 100644 --- a/Nop.Plugin.Misc.AuctionPlugin/Nop.Plugin.Misc.AuctionPlugin.csproj +++ b/Nop.Plugin.Misc.AuctionPlugin/Nop.Plugin.Misc.AuctionPlugin.csproj @@ -2,12 +2,13 @@ net8.0 - ..\..\..\..\NopCommerce\Presentation\Nop.Web\Plugins\Nop.Plugin.Misc.AuctionPlugin + ..\..\..\..\NopCommerce\Presentation\Nop.Web\Plugins\Misc.AuctionPlugin $(OutputPath) - false + true + true enable @@ -60,7 +61,7 @@ PreserveNewest - PreserveNewest + Always Always @@ -80,7 +81,6 @@ -