diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/AIPluginAdminController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/FruitBankPluginAdminController.cs similarity index 66% rename from Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/AIPluginAdminController.cs rename to Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/FruitBankPluginAdminController.cs index 6cba1d1..43c7425 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/AIPluginAdminController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/FruitBankPluginAdminController.cs @@ -1,21 +1,21 @@ using Microsoft.AspNetCore.Mvc; -using Nop.Plugin.Misc.AIPlugin.Areas.Admin.Models; -using Nop.Plugin.Misc.AIPlugin; -//using Nop.Plugin.Misc.AIPlugin; +using Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Models; +using Nop.Plugin.Misc.FruitBankPlugin; +//using Nop.Plugin.Misc.FruitBankPlugin; using Nop.Services.Configuration; using Nop.Web.Framework.Controllers; using Nop.Services.Messages; -namespace Nop.Plugin.Misc.AIPlugin.Controllers +namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers { [Area("Admin")] - public class AIPluginAdminController : BasePluginController + public class FruitBankPluginAdminController : BasePluginController { private readonly INotificationService _notificationService; private readonly ISettingService _settingService; private readonly OpenAiSettings _settings; - public AIPluginAdminController(INotificationService notificationService, ISettingService settingService, OpenAiSettings settings) + public FruitBankPluginAdminController(INotificationService notificationService, ISettingService settingService, OpenAiSettings settings) { _notificationService = notificationService; _settingService = settingService; @@ -29,7 +29,7 @@ namespace Nop.Plugin.Misc.AIPlugin.Controllers { ApiKey = _settings.ApiKey }; - return View("~/Plugins/Misc.AIPlugin/Views/Configure/Configure.cshtml", model); + return View("~/Plugins/Misc.FruitBankPlugin/Areas/Admin/Views/Configure/Configure.cshtml", model); } [HttpPost] diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Models/ConfigureModel.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Models/ConfigureModel.cs index d74e084..872a0ed 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Models/ConfigureModel.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Models/ConfigureModel.cs @@ -5,11 +5,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Nop.Plugin.Misc.AIPlugin.Areas.Admin.Models +namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Models { public record ConfigureModel { - [NopResourceDisplayName("Plugins.AIPlugin.Fields.ApiKey")] + [NopResourceDisplayName("Plugins.FruitBankPlugin.Fields.ApiKey")] public string ApiKey { get; set; } } } diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Configure/Configure.cshtml b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Configure/Configure.cshtml index 3abc8da..cc9f0c2 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Configure/Configure.cshtml +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Configure/Configure.cshtml @@ -1,8 +1,8 @@ -@model Nop.Plugin.Misc.AIPlugin.Models.ConfigureModel +@model Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Models.ConfigureModel @{ Layout = "_AdminLayout"; - Html.SetActiveMenuItemSystemName("AiAssistant.Configure"); + NopHtml.SetActiveMenuItemSystemName("AiAssistant.Configure"); }
diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/_ViewImports.cshtml b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/_ViewImports.cshtml index 270744e..47e0479 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/_ViewImports.cshtml +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/_ViewImports.cshtml @@ -2,6 +2,8 @@ @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 diff --git a/Nop.Plugin.Misc.AIPlugin/Components/CustomViewComponent.cs b/Nop.Plugin.Misc.AIPlugin/Components/CustomViewComponent.cs index 1e2453a..b17a413 100644 --- a/Nop.Plugin.Misc.AIPlugin/Components/CustomViewComponent.cs +++ b/Nop.Plugin.Misc.AIPlugin/Components/CustomViewComponent.cs @@ -1,7 +1,7 @@ using Microsoft.AspNetCore.Mvc; using Nop.Web.Framework.Components; -namespace Nop.Plugin.Misc.AIPlugin.Components; +namespace Nop.Plugin.Misc.FruitBankPlugin.Components; [ViewComponent(Name = "Custom")] public class CustomViewComponent : NopViewComponent diff --git a/Nop.Plugin.Misc.AIPlugin/Components/ProductAIWidgetViewComponent.cs b/Nop.Plugin.Misc.AIPlugin/Components/ProductAIWidgetViewComponent.cs index 7ee276e..fac6c2e 100644 --- a/Nop.Plugin.Misc.AIPlugin/Components/ProductAIWidgetViewComponent.cs +++ b/Nop.Plugin.Misc.AIPlugin/Components/ProductAIWidgetViewComponent.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; -namespace Nop.Plugin.Misc.AIPlugin.Components +namespace Nop.Plugin.Misc.FruitBankPlugin.Components { [ViewComponent(Name = "ProductAIWidget")] @@ -20,7 +20,7 @@ namespace Nop.Plugin.Misc.AIPlugin.Components if (product == null) return Content(""); // ne rendereljen semmit, ha nincs product - return View("~/Plugins/Misc.AIPlugin/Views/ProductAIListWidget.cshtml", product); + return View("~/Plugins/Misc.FruitBankPlugin/Views/ProductAIListWidget.cshtml", product); } else if (additionalData is Nop.Web.Models.Catalog.ProductDetailsModel) { @@ -28,7 +28,7 @@ namespace Nop.Plugin.Misc.AIPlugin.Components if (product == null) return Content(""); // ne rendereljen semmit, ha nincs product - return View("~/Plugins/Misc.AIPlugin/Views/ProductAIWidget.cshtml", product); + return View("~/Plugins/Misc.FruitBankPlugin/Views/ProductAIWidget.cshtml", product); } else { return Content(""); // ne rendereljen semmit, ha nem productDetailModel vagy productOverviewModel diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/CheckoutController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/CheckoutController.cs new file mode 100644 index 0000000..4b81171 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/CheckoutController.cs @@ -0,0 +1,16 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers +{ + [Area("Admin")] // ha admin oldalra, de a frontendre ne legyen + public class CheckoutController : Controller + { + [Route("checkout/pending-measurement")] + public IActionResult PendingMeasurementWarning() + { + // visszaadja a view-t + return View("~/Plugins/Misc.FruitBankPlugin/Views/Checkout/PendingMeasurementWarning.cshtml"); + } + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/CustomTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/CustomTable.cs index 6628c61..b346597 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/CustomTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/CustomTable.cs @@ -1,6 +1,6 @@ using Nop.Core; -namespace Nop.Plugin.Misc.AIPlugin.Domains; +namespace Nop.Plugin.Misc.FruitBankPlugin.Domains; public partial class CustomTable : BaseEntity { diff --git a/Nop.Plugin.Misc.AIPlugin/Filters/PendingMeasurementCheckoutFilter.cs b/Nop.Plugin.Misc.AIPlugin/Filters/PendingMeasurementCheckoutFilter.cs new file mode 100644 index 0000000..25521f9 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Filters/PendingMeasurementCheckoutFilter.cs @@ -0,0 +1,55 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Nop.Core.Domain.Orders; +using Nop.Services.Orders; +using Nop.Services.Common; +using System.Threading.Tasks; +using Nop.Core; +using Nop.Plugin.Misc.FruitBankPlugin.Services; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Filters +{ + public class PendingMeasurementCheckoutFilter : IAsyncActionFilter + { + private readonly IWorkContext _workContext; + private readonly IOrderService _orderService; + private readonly IOrderMeasurementService _orderMeasurementService; + + public PendingMeasurementCheckoutFilter( + IWorkContext workContext, + IOrderService orderService, + IOrderMeasurementService orderMeasurementService) + { + _workContext = workContext; + _orderService = orderService; + _orderMeasurementService = orderMeasurementService; + } + + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + // csak a ConfirmOrder action-nál kell ellenőrizni + var actionName = context.ActionDescriptor.RouteValues["action"]; + var controllerName = context.ActionDescriptor.RouteValues["controller"]; + + if (controllerName == "Checkout" && actionName == "ConfirmOrder") + { + // lekérjük a user aktuális kosarát + var customer = await _workContext.GetCurrentCustomerAsync(); + var order = await _orderService.GetOrderByIdAsync((int)context.ActionArguments["orderId"]); // ha van orderId param + + if (order != null && await _orderMeasurementService.IsPendingMeasurementAsync(order)) + { + context.Result = new RedirectToRouteResult(new + { + controller = "Checkout", + action = "PendingMeasurementWarning" + }); + return; // itt kilépünk, a fizetés nem engedélyezett + } + } + + await next(); // mehet a többi pipeline + } + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/FruitBankConsts.cs b/Nop.Plugin.Misc.AIPlugin/FruitBankConsts.cs new file mode 100644 index 0000000..2480480 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/FruitBankConsts.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Nop.Plugin.Misc.FruitBankPlugin +{ + public static class FruitBankConsts + { + public const string RequiresMeasurementAttr = "PriceByMeasurement.RequiresMeasurement"; + } + +} diff --git a/Nop.Plugin.Misc.AIPlugin/AIPlugin.cs b/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs similarity index 88% rename from Nop.Plugin.Misc.AIPlugin/AIPlugin.cs rename to Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs index 9998ffa..2e3b2d8 100644 --- a/Nop.Plugin.Misc.AIPlugin/AIPlugin.cs +++ b/Nop.Plugin.Misc.AIPlugin/FruitBankPlugin.cs @@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Infrastructure; using Microsoft.AspNetCore.Mvc.Routing; -using Nop.Plugin.Misc.AIPlugin.Components; +using Nop.Plugin.Misc.FruitBankPlugin.Components; using Nop.Services.Cms; using Nop.Services.Configuration; using Nop.Services.Localization; @@ -12,12 +12,12 @@ using Nop.Web.Framework.Infrastructure; using Nop.Web.Framework.Menu; -namespace Nop.Plugin.Misc.AIPlugin +namespace Nop.Plugin.Misc.FruitBankPlugin { /// /// Main plugin class /// - public class AIPlugin : BasePlugin, IWidgetPlugin + public class FruitBankPlugin : BasePlugin, IWidgetPlugin { protected readonly IActionContextAccessor _actionContextAccessor; private readonly ISettingService _settingService; @@ -30,7 +30,7 @@ namespace Nop.Plugin.Misc.AIPlugin //handle AdminMenuCreatedEvent - public AIPlugin(IActionContextAccessor actionContextAccessor, + public FruitBankPlugin(IActionContextAccessor actionContextAccessor, ISettingService settingService, //IWebHelper webHelper, ILocalizationService localizationService, @@ -50,6 +50,9 @@ namespace Nop.Plugin.Misc.AIPlugin // --- INSTALL --- public override async Task InstallAsync() { + + // TODO: Add "NeedsToBeMeasured" product attribute if not exists + // Default settings var settings = new OpenAiSettings { @@ -88,9 +91,9 @@ namespace Nop.Plugin.Misc.AIPlugin // var pluginNode = new AdminMenuItem // { - // SystemName = "AIPlugin.Configure", + // SystemName = "FruitBankPlugin.Configure", // Title = "AI Assistant", - // Url = $"{_webHelper.GetStoreLocation()}Admin/AIPluginAdmin/Configure", + // Url = $"{_webHelper.GetStoreLocation()}Admin/FruitBankPluginAdmin/Configure", // Visible = true // }; // rootNode.ChildNodes.Add(pluginNode); @@ -128,15 +131,15 @@ namespace Nop.Plugin.Misc.AIPlugin { new() { - // SystemName = "AIPlugin.Configure", + // SystemName = "FruitBankPlugin.Configure", // Title = "AI Assistant", - // Url = $"{_webHelper.GetStoreLocation()}Admin/AIPluginAdmin/Configure", + // Url = $"{_webHelper.GetStoreLocation()}Admin/FruitBankPluginAdmin/Configure", // Visible = true Visible = true, SystemName = PluginDescriptor.SystemName, Title = PluginDescriptor.FriendlyName, IconClass = "far fa-circle", - Url = _adminMenu.GetMenuItemUrl("AIPlugin", "Configure"), + Url = _adminMenu.GetMenuItemUrl("FruitBankPlugin", "Configure"), //Url = "Admin/SignalRApi/Configure", //ControllerName = "SignalRApi", //ActionName = "Configure", @@ -148,7 +151,7 @@ namespace Nop.Plugin.Misc.AIPlugin public override string GetConfigurationPageUrl() { - return _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext).RouteUrl("Plugin.Misc.AIPlugin.Configure"); + return _urlHelperFactory.GetUrlHelper(_actionContextAccessor.ActionContext).RouteUrl("Plugin.Misc.FruitBankPlugin.Configure"); } public Type GetWidgetViewComponent(string widgetZone) diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index 5fb9632..480d90d 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -1,10 +1,14 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc.Razor; +using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Nop.Core.Infrastructure; +using Nop.Plugin.Misc.FruitBankPlugin.Filters; +using Nop.Plugin.Misc.FruitBankPlugin.Services; +using Nop.Services.Catalog; -namespace Nop.Plugin.Misc.AIPlugin.Infrastructure; +namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; public class PluginNopStartup : INopStartup { @@ -20,8 +24,26 @@ public class PluginNopStartup : INopStartup options.ViewLocationExpanders.Add(new ViewLocationExpander()); }); + services.AddCors(feature => + feature.AddPolicy( + "AllowBlazorClient", + apiPolicy => apiPolicy + .WithOrigins("https://localhost:7144") + .AllowAnyHeader() + .AllowAnyMethod() + .AllowCredentials() + )); + + services.AddSignalR(); + //register services and interfaces //services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddControllersWithViews(options => + { + options.Filters.AddService(); + }); } /// @@ -30,10 +52,24 @@ public class PluginNopStartup : INopStartup /// Builder for configuring an application's request pipeline public void Configure(IApplicationBuilder application) { + + + + application.UseWhen(context => context.Request.Path.StartsWithSegments("/fbhub"), app => + { + app.UseCors("AllowBlazorClient"); + app.UseRouting(); + app.UseEndpoints(endpoints => + { + endpoints.MapHub("/fbhub"); + }); + }); + + } /// /// Gets order of this startup configuration implementation /// - public int Order => 3000; + public int Order => 100; } \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/RouteProvider.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/RouteProvider.cs index 6bd7294..9cb3d70 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/RouteProvider.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/RouteProvider.cs @@ -1,7 +1,10 @@ -using Microsoft.AspNetCore.Routing; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Nop.Plugin.Misc.FruitBankPlugin.Services; +using Nop.Web.Framework; using Nop.Web.Framework.Mvc.Routing; -namespace Nop.Plugin.Misc.AIPlugin.Infrastructure; +namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; /// /// Represents plugin route provider @@ -14,7 +17,11 @@ public class RouteProvider : IRouteProvider /// Route builder public void RegisterRoutes(IEndpointRouteBuilder endpointRouteBuilder) { + endpointRouteBuilder.MapControllerRoute(name: "Plugin.Misc.FruitBankPlugin.Configure", + pattern: "Admin/FruitBankPlugin/Configure", + defaults: new { controller = "FruitBankPluginAdmin", action = "Configure", area = AreaNames.ADMIN }); + //endpointRouteBuilder.MapHub("/fbhub");//.RequireCors("AllowBlazorClient"); } /// diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/ViewLocationExpander.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/ViewLocationExpander.cs index c4266bf..d822c72 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/ViewLocationExpander.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/ViewLocationExpander.cs @@ -1,6 +1,6 @@ using Microsoft.AspNetCore.Mvc.Razor; -namespace Nop.Plugin.Misc.AIPlugin.Infrastructure; +namespace Nop.Plugin.Misc.FruitBankPlugin.Infrastructure; public class ViewLocationExpander : IViewLocationExpander { @@ -26,11 +26,11 @@ public class ViewLocationExpander : IViewLocationExpander { if (context.AreaName == "Admin") { - viewLocations = new[] { $"/Plugins/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/{context.ControllerName}/{context.ViewName}.cshtml" }.Concat(viewLocations); + viewLocations = new[] { $"/Plugins/Nop.Plugin.Misc.FruitBankPlugin/Areas/Admin/Views/{context.ControllerName}/{context.ViewName}.cshtml" }.Concat(viewLocations); } else { - viewLocations = new[] { $"/Plugins/Nop.Plugin.Misc.AIPlugin/Views/{context.ControllerName}/{context.ViewName}.cshtml" }.Concat(viewLocations); + viewLocations = new[] { $"/Plugins/Nop.Plugin.Misc.FruitBankPlugin/Views/{context.ControllerName}/{context.ViewName}.cshtml" }.Concat(viewLocations); } return viewLocations; diff --git a/Nop.Plugin.Misc.AIPlugin/Mapping/Builders/PluginBuilder.cs b/Nop.Plugin.Misc.AIPlugin/Mapping/Builders/PluginBuilder.cs index 18e17fd..1c70bf4 100644 --- a/Nop.Plugin.Misc.AIPlugin/Mapping/Builders/PluginBuilder.cs +++ b/Nop.Plugin.Misc.AIPlugin/Mapping/Builders/PluginBuilder.cs @@ -1,8 +1,8 @@ using FluentMigrator.Builders.Create.Table; using Nop.Data.Mapping.Builders; -using Nop.Plugin.Misc.AIPlugin.Domains; +using Nop.Plugin.Misc.FruitBankPlugin.Domains; -namespace Nop.Plugin.Misc.AIPlugin.Mapping.Builders; +namespace Nop.Plugin.Misc.FruitBankPlugin.Mapping.Builders; public class PluginBuilder : NopEntityBuilder { diff --git a/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs b/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs index f4ab688..29aeaab 100644 --- a/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs +++ b/Nop.Plugin.Misc.AIPlugin/Mapping/NameCompatibility.cs @@ -1,6 +1,6 @@ using Nop.Data.Mapping; -namespace Nop.Plugin.Misc.AIPlugin.Mapping; +namespace Nop.Plugin.Misc.FruitBankPlugin.Mapping; public partial class NameCompatibility : INameCompatibility { diff --git a/Nop.Plugin.Misc.AIPlugin/Migrations/SchemaMigration.cs b/Nop.Plugin.Misc.AIPlugin/Migrations/SchemaMigration.cs index 8df4da1..b6ea61d 100644 --- a/Nop.Plugin.Misc.AIPlugin/Migrations/SchemaMigration.cs +++ b/Nop.Plugin.Misc.AIPlugin/Migrations/SchemaMigration.cs @@ -1,12 +1,12 @@ using FluentMigrator; using Nop.Data.Extensions; using Nop.Data.Migrations; -using Nop.Plugin.Misc.AIPlugin.Domains; +using Nop.Plugin.Misc.FruitBankPlugin.Domains; -namespace Nop.Plugin.Misc.AIPlugin.Migrations; +namespace Nop.Plugin.Misc.FruitBankPlugin.Migrations; //2024-10-31 -[NopMigration("2025-08-29 12:07:22", "Nop.Plugin.Misc.AIPlugin schema", MigrationProcessType.Installation)] +[NopMigration("2025-08-29 12:07:22", "Nop.Plugin.Misc.FruitBankPlugin schema", MigrationProcessType.Installation)] public class SchemaMigration : AutoReversingMigration { /// diff --git a/Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.AIPlugin.csproj b/Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.FruitBankPlugin.csproj similarity index 89% rename from Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.AIPlugin.csproj rename to Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.FruitBankPlugin.csproj index 8a0f3af..3e1483c 100644 --- a/Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.AIPlugin.csproj +++ b/Nop.Plugin.Misc.AIPlugin/Nop.Plugin.Misc.FruitBankPlugin.csproj @@ -2,7 +2,7 @@ net9.0 - $(SolutionDir)\Presentation\Nop.Web\Plugins\Misc.AIPlugin + $(SolutionDir)\Presentation\Nop.Web\Plugins\Misc.FruitBankPlugin $(OutputPath)