This commit is contained in:
Loretta 2024-11-17 16:53:18 +01:00
commit b822711be7
16 changed files with 356 additions and 197 deletions

View File

@ -0,0 +1,101 @@
using Microsoft.AspNetCore.Mvc;
using Nop.Plugin.Misc.AuctionPlugin;
using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
using Nop.Plugin.Misc.AuctionPlugin.Services;
using Nop.Services.Catalog;
using Nop.Services.Cms;
using Nop.Services.Common;
using Nop.Services.Logging;
using Nop.Web.Areas.Admin.Components;
using Nop.Web.Areas.Admin.Models.Catalog;
using Nop.Web.Areas.Admin.Models.Orders;
using Nop.Web.Framework.Components;
using Nop.Web.Framework.Factories;
using Nop.Web.Framework.Infrastructure;
namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Components
{
[ViewComponent(Name = "AuctionAdmin")]
public class AuctionAdminViewComponent : AdminWidgetViewComponent
{
#region Fields
protected readonly ILogger _logger;
protected readonly IProductAttributeService _productAttributeService;
protected readonly IWidgetPluginManager _widgetPluginManager;
protected readonly AuctionSettings _auctionSettings;
protected readonly IAuctionService _auctionService;
#endregion
#region Ctor
public AuctionAdminViewComponent(
IWidgetModelFactory widgetModelFactory,
ILogger logger,
IProductAttributeService productAttributeService,
IWidgetPluginManager widgetPluginManager,
AuctionSettings auctionSettings,
IAuctionService auctionService) : base(widgetModelFactory)
{
_logger = logger;
_productAttributeService = productAttributeService;
_widgetPluginManager = widgetPluginManager;
_auctionSettings = auctionSettings;
_auctionService = auctionService;
}
#endregion
#region Methods
/// <summary>
/// Invoke the widget view component
/// </summary>
/// <param name="widgetZone">Widget zone</param>
/// <param name="additionalData">Additional parameters</param>
/// <returns>
/// A task that represents the asynchronous operation
/// The task result contains the view component result
/// </returns>
public override async Task<IViewComponentResult> InvokeAsync(string widgetZone, object additionalData)
{
//await base.InvokeAsync(widgetZone, additionalData);
await _logger.InformationAsync($"Admin auction widget called from {widgetZone}!");
if (!await _widgetPluginManager.IsPluginActiveAsync(AuctionDefaults.SystemName))
return Content(string.Empty);
//if (!_auctionSettings.Enabled)
// return Content(string.Empty);
//if (additionalData is not ProductDetailsModel model)
// return Content(string.Empty);
var productId = 0;
if (!widgetZone.Equals(AdminWidgetZones.ProductDetailsButtons))
{
await _logger.InformationAsync($"Admin auction widget not in the right widgetzone {widgetZone}!");
return Content(string.Empty);
}
var product = (additionalData as ProductModel);
productId = product.Id;
var auctions = await _auctionService.GetAllAuctionsAsync() ?? new List<Auction>();
// Assign the auctions to the ViewBag
ViewBag.Auctions = auctions;
ProductAssignToAuctionViewModel viewModel = new ProductAssignToAuctionViewModel();
viewModel.StartingPrice = product.BasepriceAmount;
await _logger.InformationAsync($"Admin auction widget called from {widgetZone}! II. ");
return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/AdminProductAuctionSettingsBox.cshtml", productId.ToString());
}
#endregion
}
}

View File

@ -10,6 +10,7 @@ using Nop.Services.Localization;
using Nop.Services.Logging;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
using Nop.Plugin.Misc.AuctionPlugin.Services;
using Nop.Web.Framework.Models.DataTables;
namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Controllers;
@ -84,12 +85,21 @@ public class AuctionPluginAdminController : BasePluginController
// }
//}
public IActionResult GetAuctionViewModel()
{
var model = new AuctionViewModel();
return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/Auction.cshtml", model);
}
public async Task<IActionResult> AuctionList()
{
await _logger.InformationAsync("AnnouncementList called!");
var model = new AuctionViewModel();
return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/AuctionList.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> GetAuctionViewModel(AuctionViewModel viewModel)
{
@ -110,6 +120,29 @@ public class AuctionPluginAdminController : BasePluginController
}
[HttpPost]
public async Task<IActionResult> GetAuctionList()
{
//await _logger.InformationAsync("GetAnnouncementList called!");
//var total = (await _announcementService.GetAnnouncementsAsync()).Count();
//var result = await _announcementService.GetAnnouncementsAsync(request.Page, request.PageSize);
//return Json(new
//{
// Data = result,
// Total = total
//});
try
{
return Ok(new DataTablesModel { Data = await _auctionService.GetAllAuctionsAsync() });
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
public async Task<IActionResult> TestPage()
{
var model = new TestPageViewModel();
@ -122,4 +155,18 @@ public class AuctionPluginAdminController : BasePluginController
return View("~/Plugins/Misc.AuctionPlugin/Areas/Admin/Views/TestPage.cshtml", model);
}
[HttpPost]
public async Task<IActionResult> AssignProductToAuction(int productId, int auctionId)
{
if (productId <= 0 || auctionId <= 0)
return BadRequest();
var result = await _auctionService.AssignProductToAuctionAsync(productId, auctionId);
if (result)
return Ok();
return StatusCode(500, "Error assigning product to auction.");
}
}

View File

@ -0,0 +1,18 @@
using Nop.Web.Framework.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Models
{
public record ProductAssignToAuctionViewModel : BaseNopModel
{
public int ProductId { get; set; }
public int AuctionId { get; set; }
public decimal StartingPrice { get; set; }
public decimal BidPrice { get; set; }
public decimal BidAmount { get; set; }
}
}

View File

@ -0,0 +1,46 @@
@model ProductAssignToAuctionViewModel
<div class="auction-settings-box">
<h3>@T("Plugins.Misc.AuctionPlugin.AssignToAuction")</h3>
<form id="assignAuctionForm" method="post" action="@Url.Action("AssignProductToAuction", "AuctionPluginAdmin", new { area = "Admin" })">
<input type="hidden" name="productId" value="@Model.ProductId" />
<input type="hidden" name="startingPrice" value="@Model.StartingPrice" />
@* <input type="hidden" name="bidPrice" value="@Model.StartingPrice" /> *@
<div class="form-group">
<label for="auctionSelect">@T("Plugins.Misc.AuctionPlugin.SelectAuction")</label>
<select id="auctionSelect" name="auctionId" class="form-control">
<option value="">@T("Plugins.Misc.AuctionPlugin.SelectAuctionPlaceholder")</option>
@foreach (var auction in ViewBag.Auctions as List<Nop.Plugin.Misc.AuctionPlugin.Domains.Entities.Auction>)
{
<option value="@auction.Id">@auction.AuctionName</option>
}
</select>
</div>
<button type="submit" class="btn btn-primary">
@T("Plugins.Misc.AuctionPlugin.AssignToAuctionButton")
</button>
</form>
</div>
<script>
$(document).ready(function () {
$('#assignAuctionForm').on('submit', function (e) {
e.preventDefault();
var form = $(this);
$.ajax({
url: form.attr('action'),
type: 'POST',
data: form.serialize(),
success: function (response) {
toastr.success("@T("Plugins.Misc.AuctionPlugin.ProductAssignedSuccess")");
},
error: function (error) {
toastr.error("@T("Plugins.Misc.AuctionPlugin.ProductAssignedError")");
}
});
});
});
</script>

View File

@ -0,0 +1,61 @@
@using Nop.Core.Infrastructure
@using Nop.Web.Framework
@{
var defaultGridPageSize = EngineContext.Current.Resolve<Nop.Core.Domain.Common.AdminAreaSettings>().DefaultGridPageSize;
var gridPageSizes = EngineContext.Current.Resolve<Nop.Core.Domain.Common.AdminAreaSettings>().GridPageSizes;
Layout = "_AdminLayout";
//page title
ViewBag.Title = T("Admin.Plugins.HomePageProduct").Text;
}
<div class="content-header clearfix">
<div class="pull-right">
<a href="../GetAnnouncementViewModel" class="btn bg-blue">
<i class="fa fa-floppy-o"></i>
Add
</a>
</div>
</div>
<div class="content">
<div class="form-horizontal">
<div class="panel-group">
<div class="panel panel-default">
<div class="panel-body">
@await Html.PartialAsync("Table", new DataTablesModel
{
Name = "announcement-grid",
UrlRead = new DataUrl("GetAuctionList", "AuctionPluginAdmin"),
Paging = false,
ColumnCollection = new List<ColumnProperty>
{
new ColumnProperty(nameof(Auction.AuctionName))
{
Title = "Name",
Width = "300"
},
new ColumnProperty(nameof(Auction.StartDateUtc))
{
Title = "Starts",
Width = "300"
},
new ColumnProperty(nameof(Auction.Closed))
{
Title = "Closed",
Width = "300"
}
}
})
</div>
</div>
</div>
</div>
</div>

View File

@ -28,6 +28,7 @@ public static class AuctionDefaults
public static string AnnouncementRouteName => "Plugin.Misc.AuctionPlugin.Announcement";
public static string AnnouncementListRouteName => "Plugin.Misc.AuctionPlugin.AnnouncementList";
public static string AuctionRouteName => "Plugin.Misc.AuctionPlugin.Auction";
public static string AuctionListRouteName => "Plugin.Misc.AuctionPlugin.AuctionList";
public static string TestPageRouteName => "Plugin.Misc.AuctionPlugin.TestPage";
public static string BidNotificationRouteName => "Plugin.Misc.AuctionPlugin.BidNotification";
public static string RefreshAuctionWidgetRouteName => "Plugin.Misc.AuctionPlugin.RefreshAuctionWidget";

View File

@ -5,6 +5,8 @@ using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Data;
using Nop.Plugin.AuctionPlugin.Components;
using Nop.Plugin.Misc.AuctionPlugin.Areas.Admin.Components;
//using Nop.Plugin.Misc.AuctionPlugin.Components;
using Nop.Plugin.Widgets.AuctionPlugin.Components;
using Nop.Services.Catalog;
@ -100,12 +102,12 @@ namespace Nop.Plugin.Misc.AuctionPlugin
{
ArgumentNullException.ThrowIfNull(widgetZone);
if (widgetZone.Equals(PublicWidgetZones.ProductDetailsInsideOverviewButtonsBefore))
if (widgetZone.Equals(PublicWidgetZones.ProductDetailsAfterPictures))
{
return typeof(AuctionPublicViewComponent);
}
if (widgetZone.Equals(AdminWidgetZones.ProductDetailsBlock))
if (widgetZone.Equals(AdminWidgetZones.ProductDetailsButtons))
{
return typeof(AuctionAdminViewComponent);
}
@ -115,6 +117,11 @@ namespace Nop.Plugin.Misc.AuctionPlugin
return typeof(LiveAnnouncementViewComponent);
}
if (widgetZone.Equals(PublicWidgetZones.ProductBoxAddinfoBefore))
{
return typeof(AuctionViewComponent);
}
return typeof(AuctionViewComponent);
}
@ -122,9 +129,10 @@ namespace Nop.Plugin.Misc.AuctionPlugin
{
return Task.FromResult<IList<string>>(new List<string>
{
PublicWidgetZones.ProductDetailsInsideOverviewButtonsBefore,
PublicWidgetZones.ProductDetailsAfterPictures,
PublicWidgetZones.ProductDetailsBottom,
PublicWidgetZones.HeaderAfter
PublicWidgetZones.HeaderAfter,
AdminWidgetZones.ProductDetailsButtons
//AdminWidgetZones.OrderBillingAddressDetailsBottom,
//AdminWidgetZones.OrderShippingAddressDetailsBottom
@ -166,6 +174,14 @@ namespace Nop.Plugin.Misc.AuctionPlugin
Url = "~/Admin/AuctionPluginAdmin/GetAuctionViewModel"
});
liveAnnouncementPluginNode.ChildNodes.Add(new SiteMapNode()
{
Title = await _localizationService.GetResourceAsync("Misc.AuctionList"),
Visible = true,
IconClass = "fa-dot-circle-o",
Url = "~/Admin/AuctionPluginAdmin/AuctionList"
});
liveAnnouncementPluginNode.ChildNodes.Add(new SiteMapNode()
{
Title = await _localizationService.GetResourceAsync("Misc.Announcement"),

View File

@ -1,73 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using Nop.Plugin.Misc.AuctionPlugin;
using Nop.Services.Catalog;
using Nop.Services.Cms;
using Nop.Services.Common;
using Nop.Web.Areas.Admin.Models.Orders;
using Nop.Web.Framework.Components;
using Nop.Web.Framework.Infrastructure;
using Nop.Web.Models.Catalog;
namespace Nop.Plugin.AuctionPlugin.Components
{
[ViewComponent(Name = "AuctionAdmin")]
public class AuctionAdminViewComponent : NopViewComponent
{
#region Fields
protected readonly IAddressService _addressService;
protected readonly IProductAttributeService _productAttributeService;
protected readonly IWidgetPluginManager _widgetPluginManager;
protected readonly AuctionSettings _auctionSettings;
#endregion
#region Ctor
public AuctionAdminViewComponent(IAddressService addressService,
IProductAttributeService productAttributeService,
IWidgetPluginManager widgetPluginManager,
AuctionSettings auctionSettings)
{
_addressService = addressService;
_productAttributeService = productAttributeService;
_widgetPluginManager = widgetPluginManager;
_auctionSettings = auctionSettings;
}
#endregion
#region Methods
/// <summary>
/// Invoke the widget view component
/// </summary>
/// <param name="widgetZone">Widget zone</param>
/// <param name="additionalData">Additional parameters</param>
/// <returns>
/// A task that represents the asynchronous operation
/// The task result contains the view component result
/// </returns>
public async Task<IViewComponentResult> InvokeAsync(string widgetZone, object additionalData)
{
if (!await _widgetPluginManager.IsPluginActiveAsync(AuctionDefaults.SystemName))
return Content(string.Empty);
if (!_auctionSettings.Enabled)
return Content(string.Empty);
//if (additionalData is not ProductDetailsModel model)
// return Content(string.Empty);
var productId = 0;
if (widgetZone.Equals(AdminWidgetZones.ProductDetailsBlock))
productId = (additionalData as ProductDetailsModel).Id;
return View("~/Plugins/Misc.AuctionPlugin/Views/AdminProductAuctionSettingsBox.cshtml", productId.ToString());
}
#endregion
}
}

View File

@ -85,7 +85,7 @@ public class AuctionPublicViewComponent : NopViewComponent
// return Content(string.Empty);
//}
if (!widgetZone.Equals(PublicWidgetZones.ProductDetailsInsideOverviewButtonsBefore))
if (!widgetZone.Equals(PublicWidgetZones.ProductDetailsAfterPictures))
{
await _logger.InformationAsync($"WidgetViewComponent is NOT in ProductDetailsTop now {widgetZone}");
return Content(string.Empty);

View File

@ -34,6 +34,10 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Infrastructure
pattern: "Admin/AuctionPlugin/GetAuctionViewModel",
defaults: new { controller = "AuctionPluginAdmin", action = "GetAuctionViewModel" });
endpointRouteBuilder.MapControllerRoute(name: AuctionDefaults.AuctionListRouteName,
pattern: "Admin/AuctionPlugin/AuctionList",
defaults: new { controller = "AuctionPluginAdmin", action = "AuctionList" });
endpointRouteBuilder.MapControllerRoute(name: AuctionDefaults.TestPageRouteName,
pattern: "Admin/Auction/TestPage",
defaults: new { controller = "AuctionPluginAdmin", action = "TestPage" });

View File

@ -14,6 +14,7 @@
<ItemGroup>
<None Remove="Areas\Admin\Views\Auction.cshtml" />
<None Remove="Areas\Admin\Views\AuctionList.cshtml" />
<None Remove="Areas\Admin\Views\BidNotification.cshtml" />
<None Remove="Areas\Admin\Views\TestPage.cshtml" />
<None Remove="logo.jpg" />
@ -30,6 +31,9 @@
</ItemGroup>
<ItemGroup>
<Content Include="Areas\Admin\Views\AuctionList.cshtml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Areas\Admin\Views\BidNotification.cshtml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
@ -45,7 +49,7 @@
<Content Include="plugin.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="Views\AdminProductAuctionSettingsBox.cshtml">
<Content Include="Areas\Admin\Views\AdminProductAuctionSettingsBox.cshtml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="Areas\Admin\Views\AnnouncementList.cshtml">
@ -90,7 +94,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Areas\Admin\Components\" />
<Folder Include="Areas\Admin\Extensions\" />
<Folder Include="Areas\Admin\Factories\" />
<Folder Include="Areas\Admin\Validators\" />

View File

@ -32,6 +32,7 @@ public class AuctionService : IAuctionService
protected readonly AuctionDbContext _ctx;
//protected readonly IRepository<AuctionBid> _customerBidRepository;
//protected readonly IRepository<Auction> _auctionRepository;
protected readonly IRepository<ProductToAuctionMapping> _productToAuctionRepository;
protected readonly IShortTermCacheManager _shortTermCacheManager;
protected readonly IStaticCacheManager _staticCacheManager;
protected readonly IWorkContext _workContext;
@ -45,12 +46,12 @@ public class AuctionService : IAuctionService
/// <param name="ctx"></param>
/// <param name="shortTermCacheManager">Short term cache manager</param>
/// <param name="staticCacheManager">Cache manager</param>
public AuctionService(AuctionDbContext ctx, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, IWorkContext workContext)
public AuctionService(AuctionDbContext ctx, IRepository<Auction> auctionRepository, IRepository<ProductToAuctionMapping> productToAuctionRepository, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, IWorkContext workContext)
{
_ctx = ctx;
//_customerBidRepository = customerBidRepository;
//_auctionRepository = auctionRepository;
_productToAuctionRepository = productToAuctionRepository;
_shortTermCacheManager = shortTermCacheManager;
_staticCacheManager = staticCacheManager;
_workContext = workContext;
@ -170,6 +171,23 @@ public class AuctionService : IAuctionService
{
return new AuctionBidDto(await _ctx.AuctionBids.GetByIdAsync(auctionBidId));
}
public async Task<bool> AssignProductToAuctionAsync(int productId, int auctionId)
{
var auction = await _ctx.Auctions.GetByIdAsync(auctionId);
if (auction == null)
return false;
var mapping = new ProductToAuctionMapping
{
ProductId = productId,
AuctionId = auctionId
};
await _productToAuctionRepository.InsertAsync(mapping);
return true;
}
#endregion
#endregion Dtos
}

View File

@ -1,4 +1,5 @@
using Nop.Core;
using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Plugin.Misc.AuctionPlugin.Domains;
using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities;
@ -32,4 +33,6 @@ public interface IAuctionService
Task InsertAuctionAsync(Auction auction);
Task<IList<Auction>> GetAllAuctionsAsync();
Task<bool> AssignProductToAuctionAsync(int productId, int auctionId);
}

View File

@ -34,46 +34,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Services
{
public class MyProductModelFactory : ProductModelFactory
{
protected readonly CaptchaSettings _captchaSettings;
protected readonly CatalogSettings _catalogSettings;
protected readonly CustomerSettings _customerSettings;
protected readonly ICategoryService _categoryService;
protected readonly ICurrencyService _currencyService;
protected readonly ICustomerService _customerService;
protected readonly IDateRangeService _dateRangeService;
protected readonly IDateTimeHelper _dateTimeHelper;
protected readonly IDownloadService _downloadService;
protected readonly IGenericAttributeService _genericAttributeService;
protected readonly IJsonLdModelFactory _jsonLdModelFactory;
protected readonly ILocalizationService _localizationService;
protected readonly IManufacturerService _manufacturerService;
protected readonly IPermissionService _permissionService;
protected readonly IPictureService _pictureService;
protected readonly IPriceCalculationService _priceCalculationService;
protected readonly IPriceFormatter _priceFormatter;
protected readonly IProductAttributeParser _productAttributeParser;
protected readonly IProductAttributeService _productAttributeService;
protected readonly IProductService _productService;
protected readonly IProductTagService _productTagService;
protected readonly IProductTemplateService _productTemplateService;
protected readonly IReviewTypeService _reviewTypeService;
protected readonly IShoppingCartService _shoppingCartService;
protected readonly ISpecificationAttributeService _specificationAttributeService;
protected readonly IStaticCacheManager _staticCacheManager;
protected readonly IStoreContext _storeContext;
protected readonly IStoreService _storeService;
protected readonly IShoppingCartModelFactory _shoppingCartModelFactory;
protected readonly ITaxService _taxService;
protected readonly IUrlRecordService _urlRecordService;
protected readonly IVendorService _vendorService;
protected readonly IVideoService _videoService;
protected readonly IWebHelper _webHelper;
protected readonly IWorkContext _workContext;
protected readonly MediaSettings _mediaSettings;
protected readonly OrderSettings _orderSettings;
protected readonly SeoSettings _seoSettings;
protected readonly ShippingSettings _shippingSettings;
protected readonly VendorSettings _vendorSettings;
private static readonly char[] _separator = [','];
public MyProductModelFactory(CaptchaSettings captchaSettings,
@ -151,46 +112,7 @@ namespace Nop.Plugin.Misc.AuctionPlugin.Services
vendorSettings
)
{
_captchaSettings = captchaSettings;
_catalogSettings = catalogSettings;
_customerSettings = customerSettings;
_categoryService = categoryService;
_currencyService = currencyService;
_customerService = customerService;
_dateRangeService = dateRangeService;
_dateTimeHelper = dateTimeHelper;
_downloadService = downloadService;
_genericAttributeService = genericAttributeService;
_jsonLdModelFactory = jsonLdModelFactory;
_localizationService = localizationService;
_manufacturerService = manufacturerService;
_permissionService = permissionService;
_pictureService = pictureService;
_priceCalculationService = priceCalculationService;
_priceFormatter = priceFormatter;
_productAttributeParser = productAttributeParser;
_productAttributeService = productAttributeService;
_productService = productService;
_productTagService = productTagService;
_productTemplateService = productTemplateService;
_reviewTypeService = reviewTypeService;
_shoppingCartService = shoppingCartService;
_specificationAttributeService = specificationAttributeService;
_staticCacheManager = staticCacheManager;
_storeContext = storeContext;
_storeService = storeService;
_shoppingCartModelFactory = shoppingCartModelFactory;
_taxService = taxService;
_urlRecordService = urlRecordService;
_vendorService = vendorService;
_webHelper = webHelper;
_workContext = workContext;
_mediaSettings = mediaSettings;
_orderSettings = orderSettings;
_seoSettings = seoSettings;
_shippingSettings = shippingSettings;
_vendorSettings = vendorSettings;
_videoService = videoService;
}
public override async Task<ProductDetailsModel> PrepareProductDetailsModelAsync(Product product,

View File

@ -1,10 +0,0 @@
@model string
<tr>
<td>
@T("Plugins.Widgets.What3words.Address.Field.Label")
</td>
<td>
@Model
</td>
</tr>

View File

@ -3,33 +3,36 @@
@* @Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(myObj) as String) *@
<div class="bg-dark p-3">
<h3>Auction Public View Component</h3>
<p>@T("Plugins.Misc.AuctionPlugin.BidBox.Field.Label"):</p>
<p>DEBUG DATA:</p>
<p>@Model.ProductId</p>
<p>@Model.CustomerId</p>
<p>@Model.BasePrice</p>
<div class="d-flex justify-content-between mb-3">
<div>
<strong>Base Price:</strong>
<span class="value">
@String.Format("{0:c}", Model.BasePrice)
@* @(decimal?.Round(Model.BasePrice, 2, MidpointRounding.AwayFromZero)) *@
</span>
</div>
<div>
<strong>Current Price:</strong>
<span class="value">@Model.CurrentPrice</span>
<span class="value">
@String.Format("{0:c}", Model.CurrentPrice)
@* @(decimal?.Round(Model.CurrentPrice, 2, MidpointRounding.AwayFromZero)) *@
</span>
</div>
<div>
<strong>Bid Step:</strong>
<span class="value">@Model.LicitStep</span>
<span class="value">@String.Format("{0:c}", Model.LicitStep)</span>
</div>
<div>
<button id="bidButton" class="btn btn-success">
@* Bid @(decimal?.Round(@Model.BidPrice, 2, MidpointRounding.AwayFromZero)) *@
Bid @String.Format("{0:c}", Model.BidPrice)
</button>
</div>
</div>
<div class="d-flex align-items-center mb-3">
<label for="bidPrice" class="me-2">Your Bid Price:</label>
<input type="number" id="bidPrice" class="form-control w-25" value="@Model.BidPrice" min="@(Model.CurrentPrice + Model.LicitStep)">
</div>
<button id="bidButton" class="btn btn-success">
Place Bid
</button>
<button id="testButton" class="btn btn-success">
<button id="testButton" class="btn btn-success" style="display: none">
TestButton
</button>
@ -38,9 +41,9 @@
<script>
$(document).ready(function () {
var pageViewModel = @Html.Raw(Json.Serialize(Model));
console.log(pageViewModel);
console.log(pageViewModel);
console.log(pageViewModel.WidgetZone);
$('#bidButton').click(function () {
@ -49,7 +52,7 @@
// Validate bid price
if (!bidPrice || parseInt(bidPrice) < @Model.CurrentPrice + @Model.LicitStep) {
$('#bidFeedback').text('Bid price must be at least the current price plus the licit step.')
.addClass('text-danger');
.addClass('text-danger');
return;
}
@ -68,12 +71,11 @@
},
error: function (xhr) {
$('#bidFeedback').text('Failed to place bid: ' + xhr.responseText)
.addClass('text-danger');
.addClass('text-danger');
}
});
});
$('#testButton').click(function ()
{
$('#testButton').click(function () {
$.ajax({
url: '/Auction/RefreshAuctionWidget', // Controller endpoint
type: 'POST',